我有點堅持我的基本體素物理學現在。這是非常,非常不連貫,我敢肯定,我的數學是什麼地方壞了,但讓我們看看你有什麼要說的:碰撞檢測中體素的世界
// 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);
}
}
基本的想法是從哪個方向entityt將打擊面來確定,然後就其定位一個「單位」回到這個方向。但顯然我做錯了什麼,因爲這會使實體始終回到它來自的地步,從而有效地將它保留在重生點。
而且這很可能是更容易,我也得太多。
'if(dir.x> = 0){x = -1; } if(dir.x <0){x = 1; }' - 對我來說這似乎很無用......'''''''''''''''''''''''''''''''''''''你的意思是「如果」呢?這將導致你描述的行爲,所以我會讓它成爲一個答案。 – CompuChip
@CompuChip當然,一個愚蠢的錯誤消失了,還有多少潛伏在那裏?這不是唯一的問題,但它仍然非常非常波濤洶涌。 – Sorona