c++ - OpenGL - 在倾斜的桌面上移动球
问题描述
我有一个可以围绕 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 轴的平移向量。
推荐阅读
- laravel - Laravel+Nuxt CORS 在生产环境中被阻塞
- labview - 在事件结构内执行while循环期间无法按下LabVIEW中的停止按钮
- python - 在 azure 函数中导入自定义模块时出现 ModuleNotFound
- r - R shiny - 反应部分内的多个数据操作(例如合并、组合、派生新列、重置每个条件的行值)
- node.js - 使用 Promise 在 Discord.js 中遇到问题
- javascript - 将网站上的网址移交给互斥服务
- android - android:onClick 属性不能通过数据绑定工作
- amazon-web-services - 仅当实体尚不存在时,是否可以在 CloudFormation 中设置属性?
- c# - 如何调用嵌入列表的类的方法
并列出 ,以及 Y,来自 X 元素本身? - flutter - 带有 shared_preferences 的 Flutter Null 安全配置类