如何围绕另一个对象(C ++和Ogre3D)旋转对象?

时间:2017-12-09 08:46:58

标签: c++ rotation trigonometry calculus ogre3d

我目前正在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);
  • Revolve =一颗行星(前地球)
  • 左轮手枪=绕另一个星球旋转的另一个星球(例如月亮)

对于变量,我有sunDistance = 0,earthDistance = 150和moonDistance = 155,所有都是浮点数。*

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

提前谢谢!

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

1 个答案:

答案 0 :(得分:2)

您的问题是一个很好的例子,场景图层次结构适用于:)

  • 在太阳的中心点设置Ogre场景节点。
  • 将sun实体附加到sun节点
  • 将另一个场景节点放在太阳的位置。这将是行星的枢轴节点,围绕它旋转。
  • 使枢轴节点成为太阳节点的子节点。
  • 将场景节点放置在行星的起始位置
  • 附加行星实体
  • 使行星节点成为枢轴节点的子节点
  • 在行星位置创建另一个枢轴场景节点,并使其成为行星中心节点的子节点。
  • 在月球的位置创建一个场景节点,将月亮实体附加到它上面,并使其在月球枢轴节点处成为子节点。

现在,食人魔将为你做一切,而不是摆弄硬编码的位置。您只需旋转枢轴节点,无需再设置位置。