gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:17 25 4
gpt4 key购买 nike

我目前正在用 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 。*

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

提前致谢!

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

最佳答案

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

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

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

关于c++ - 如何围绕另一个对象旋转一个对象(C++ 和 Ogre3D)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47726891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com