私はちょうど私の基本的なボクセルの物理学にちょっと固執しています。それは非常に、非常に途切れ途切れだと私は数学がどこか壊れているかなり確信している、しかし、あなたが言っているか見てみましょう:ボクセルの世界での衝突の検出
// 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から決定することであったし、次にそれを配置します1つの「ユニット」をその方向に戻します。しかし、明らかに、エンティティを常に元の位置に戻し、効果的にスポーンポイントに保持するので、私は間違ったことをしています。
また、これはおそらくもっと簡単だろうと私はそれを考えすぎています。
'if(dir.x> = 0){x = -1; } if(dir.x <0){x = 1; } ' - それは私にはかなり役に立たないようです...' x'は常に '1'に終わるでしょう。あなたは 'else if'を意味しましたか?これは記述した振る舞いを引き起こすので、私はそれを答えにします。 – CompuChip
@CompuChipもちろん、ある馬鹿馬鹿しいエラーが消えました。そこには他に何が潜んでいますか?しかしそれは唯一の問題ではなく、それはまだ非常に不安定です。 – Sorona