[英]OpenGL - Move ball on tilted tabletop
我有一個可以圍繞 OX 和 OZ 軸旋轉的桌面,並且這個桌面上有一個球。 我需要讓球根據它的傾斜度在飛機上移動。 球不需要有加速度(速度在一定的傾斜度下是恆定的)。
這是我希望球移動的方式。
球體網格是這樣創建的:
{
glm::mat4 modelMatrix = glm::mat4(1);
modelMatrix = glm::translate(modelMatrix, glm::vec3(speedOX, speedOY + 0.5f, speedOZ));
RenderSimpleMesh(meshes["sphere"], shaders["ShaderLab8"], modelMatrix, glm::vec3(0, 1, 1));
}
其中speedOX speedOY speedOZ
是球體的平移 vec3。
平面網格是這樣創建的
{
glm::mat4 modelMatrix = glm::mat4(1);
modelMatrix = glm::translate(modelMatrix, glm::vec3(0, 0.01f, 0));
modelMatrix = glm::rotate(modelMatrix, RADIANS(anglePlaneOX), glm::vec3(1, 0, 0));
modelMatrix = glm::rotate(modelMatrix, RADIANS(anglePlaneOY), glm::vec3(0, 1, 0));
modelMatrix = glm::rotate(modelMatrix, RADIANS(anglePlaneOZ), glm::vec3(0, 0, 1));
modelMatrix = glm::scale(modelMatrix, glm::vec3(0.125f));
RenderSimpleMesh(meshes["plane"], shaders["ShaderLab8"], modelMatrix, glm::vec3(0.5, 0.5, 0.5));
}
飛機通過按 WASD 鍵移動。
if (window->KeyHold(GLFW_KEY_W) && (anglePlaneOX > -90.0f)) {
anglePlaneOX -= deltaTime * DELTA_SLOPE;
/*update speedOX speedOY speedOZ */
}
if (window->KeyHold(GLFW_KEY_S) && (anglePlaneOX < 90.0f)) {
anglePlaneOX += deltaTime * DELTA_SLOPE;
/*update speedOX speedOY speedOZ */
}
if (window->KeyHold(GLFW_KEY_D) && (anglePlaneOZ > -90.0f)) {
anglePlaneOZ -= deltaTime * DELTA_SLOPE;
/*update speedOX speedOY speedOZ */
}
if (window->KeyHold(GLFW_KEY_A) && (anglePlaneOZ < 90.0f)) {
anglePlaneOZ += deltaTime * DELTA_SLOPE;
/*update speedOX speedOY speedOZ */
}
我真的找不到根據飛機的傾斜移動球背后的數學原理。
注意:球本身不會旋轉,因為我沒有在球上做任何瘋狂的陰影。 我只希望它在移動的平面上移動(平移)。 此外,如圖所示,球似乎在平面上“下沉”了一點。
聽起來您想要做的是在物體在斜坡上移動的物理特性之后對球的行為進行建模。
您有一個平面,但您可以想象,當您的平面構成三角形的斜邊時,此過程很容易適用於物體沿斜坡向下移動的物理過程。
那里有一些非常棒的教程,例如這個; https://www.dummies.com/education/science/physics/calculating-how-far-an-object-will-slide-down-an-inclined-surface/
這個描述了如何計算您需要的各種值,以便計算出平面傾斜時球的位置,並且可以輕松地進行調整以在您的模擬中工作。
但是,如果您只想讓球沿平面移動,使其不會“下沉”穿過平面(不是球移動的物理模擬,只是有人像在飛機上行走的角色一樣控制球),您可能會談論碰撞。 在這種情況下,為了讓球正確地坐在飛機上,您需要實現一個系統來檢查球和飛機之間的碰撞。 檢查碰撞的常用方法是給世界中的每個對象一個邊界框,然后對對象邊界框執行碰撞檢查,最簡單的情況是軸對齊邊界框上的軸對齊邊界框 (AABB)。 但是在您的情況下,您將需要比 AABB 更聰明的 AABB 碰撞檢查,因為您的飛機將需要一個定向邊界框(OBB/AABB 上的 OBB)。 邊界球也是用於碰撞體積的常見選擇。
或者,如果您的平面有旋轉矩陣,您可以簡單地為球創建一個水平方向向量,然后將其乘以旋轉矩陣,然后再將其應用於球。 然后您可以將該向量添加到球的位置,這將為您提供一個指向平面 x 軸的平移向量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.