如何将对象围绕另一个对象(C 和OGRE3D)旋转

How to revolve an object around another object (C++ and Ogre3D)?

本文关键字:OGRE3D 旋转 一个对象 对象      更新时间:2023-10-16

我当前正在OGRE3D中制造太阳系。其他行星完美地围绕太阳旋转,但是当我试图将月亮围绕地球旋转时,它在地球附近的某个点,而不是地球周围旋转,这有时会与地球相交。

这是创建星球与原点距离的代码(0,0,0)

    Vector3 location = Vector3::ZERO;
    float distance = revolverDistance;
    location.x = distance; location.z = distance; location.y = 0;
    planet->setPosition(location.x, location.y, location.z);

这是革命的代码

Degree planetRevolution = Degree(revolution * evt.timeSinceLastFrame);
    Vector3 location = Vector3::ZERO;
    location.x = revolver->getPosition().x - revolve->getPosition().x; 
    location.z = revolver->getPosition().z - revolve->getPosition().z;
    float oldX = location.x;
    float oldZ = location.z;
    float newX = (oldX*Math::Cos(planetRevolution)) + (oldZ*Math::Sin(planetRevolution));
    float newZ = (oldX*-Math::Sin(planetRevolution)) + (oldZ*Math::Cos(planetRevolution));
    mPlanet->setPosition(newX, mPlanet->getPosition().y, newZ);
  • rotlove =行星(例如地球)
  • Revolver =另一个正在围绕另一个星球旋转的星球(例如月亮)

对于变量,我的sundistance = 0,EarthDistance = 150,Moondistance = 155,所有这些都是浮子。*

我尝试设置float distance = revolveDistance + revolverDistance,并将月球的距离更改为5,但它旋转的点稍微移动了。

预先感谢您!

提醒(感谢一个回答我的人之一):我不允许使用场景层次结构。

您的问题是一个很好的示例场景图层次结构对:)

  • 在太阳的中心点设置一个食人魔场景节点。
  • 将太阳实体连接到太阳节点
  • 将另一个场景节点放在太阳的位置。这将是行星的枢轴节点,它围绕着它。
  • 使枢轴节点成为太阳节点的孩子。
  • 将场景节点放在星球的开始位置
  • 附加行星实体
  • 使行星节点成为枢轴节点的孩子
  • 在行星位置创建另一个枢轴场景节点,使其成为行星中心节点的孩子。
  • 在月球的位置创建一个场景节点,将月亮实体附加到月球枢轴节点。

现在,Ogre将为您做所有事情,而不必摆弄硬编码的位置。您只需要旋转枢轴节点,就不再需要设置位置。