OpenGL-在倾斜的桌面上移动球
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
是球体的平移向量3。
平面网格是这样创建的
{
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轴的平移向量。
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 在跨平台桌面/移动应用程序套件中使用 ZeroMQ 来解决架构问题
- OpenGL-在倾斜的桌面上移动球
- 适用于桌面和移动应用程序的Qt
- DXGI 桌面复制 API 何时将区域标识为移动区域
- 在Gnome或KDE中以编程方式移动桌面上的应用程序窗口
- 是否可以创建一个可以在ios移动平台和windows桌面平台之间运行的应用程序,而无需使用web界面