如何围绕另一个对象(C ++和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);
  • 旋转=一颗行星(来自地球)
  • 左轮手枪=绕另一个星球旋转的另一颗行星(如月亮)
  • 对于变量,我有sunDistance = 0,earthDistance = 150和moonDistance = 155,所有这些都是浮动。*

    我已经尝试设置float distance = revolveDistance + revolverDistance ,并将月球的距离改为5,但其旋转的点稍稍远离了距离。

    先谢谢你!

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


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

  • 在太阳中心点建立一个Ogre场景节点。
  • 将太阳实体附加到太阳节点
  • 将另一个场景节点放在太阳的位置。 这将是它围绕着它转动的星球的枢轴节点。
  • 使主节点成为太阳节点的子节点。
  • 将一个场景节点放置在行星的起始位置
  • 附加地球实体
  • 使星球节点成为枢轴节点的子节点
  • 在行星位置创建另一个枢轴场景节点,并使其成为行星中心节点的子节点。
  • 在月球的位置创建一个场景节点,将月球实体附加到它并使它在月球枢轴节点处为子节点。
  • 现在,Ogre会为您做所有事情,而不用摆弄硬编码的位置。 您将只需旋转枢轴节点,无需再设置位置。

    链接地址: http://www.djcxy.com/p/95551.html

    上一篇: How to revolve an object around another object (C++ and Ogre3D)?

    下一篇: How do you gradually accelerate an object based on button press (Ogre3D)?