Ich bin jetzt irgendwie mit meiner grundlegenden Voxel-Physik fest. Es ist sehr, sehr abgehackt und ich bin ziemlich sicher, dass meine Mathe irgendwo gebrochen ist, aber mal sehen, was Sie zu sagen haben:Kollisionserkennung in Voxel-Welt
// SOMEWHERE AT CLASS LEVEL (so not being reinstantiated every frame, but persisted instead!)
glm::vec3 oldPos;
// ACTUAL IMPL
glm::vec3 distanceToGravityCenter =
this->entity->getPosition() -
((this->entity->getPosition() - gravityCenter) * 0.005d); // TODO multiply by time
if (!entity->grounded) {
glm::vec3 entityPosition = entity->getPosition();
if (getBlock(floorf(entityPosition.x), floorf(entityPosition.y), floorf(entityPosition.z))) {
glm::vec3 dir = entityPosition - oldPos; // Actually no need to normalize as we check for lesser, bigger or equal to 0
std::cout << "falling dir: " << glm::to_string(dir) << std::endl;
// Calculate offset (where to put after hit)
int x = dir.x;
int y = dir.y;
int z = dir.z;
if (dir.x >= 0) {
x = -1;
} else if (dir.x < 0) {
x = 1;
}
if (dir.y >= 0) {
y = -1;
} else if (dir.y < 0) {
y = 1;
}
if (dir.z >= 0) {
z = -1;
} else if (dir.z < 0) {
z = 1;
}
glm::vec3 newPos = oldPos + glm::vec3(x, y, z);
this->entity->setPosition(newPos);
entity->grounded = true; // If some update happens, grounded needs to be changed
} else {
oldPos = entity->getPosition();
this->entity->setPosition(distanceToGravityCenter);
}
}
Grundidee von entityt welcher Richtung zu bestimmen war, würde die Oberfläche treffen und dann einfach positionieren eine "Einheit" zurück in diese Richtung. Aber offensichtlich mache ich etwas falsch, denn das wird die Entity immer wieder dorthin zurückbringen, wo sie herkam, und sie effektiv am Spawn-Punkt halten.
Auch das könnte wahrscheinlich viel einfacher sein und ich überlege es.
'if (dir.x> = 0) {x = -1; } if (dir.x <0) {x = 1; } '- das scheint mir ziemlich nutzlos zu sein ...' x 'wird immer' 1 '. Meintest du "else if"? [Bearbeiten] Dies würde das Verhalten verursachen, das du beschrieben hast, also werde ich eine Antwort geben. – CompuChip
@CompuChip Natürlich ist ein idiotischer Fehler weg, wie viele andere lauern da drin? Es ist nicht das einzige Problem, es ist immer noch sehr, sehr abgehackt. – Sorona