2013-11-14 112 views
0

enter image description here轨道物体周围轨道物体

如何获得入轨绿色周围橙色和四旁绿化蓝色的?

我发现很多解决方案可以在静态点附近旋转(int这种情况下为橙色圆圈),但没有找到任何适用于静态点和移动点的良好数学公式。

angle += sunRot; 

if(angle > 360.0f) 
{ 
    angle = 0.0f; 
} 

float radian = glm::radians(angle); 

float radius = glm::distance(position, rotCenter); 

float x = rotCenter.x + (radius * cosf(radian)); 
float z = rotCenter.z + (radius * sinf(radian)); 

glm::vec3 newPos = glm::vec3(x, 0, z); 

setPosition(newPos); 

Here is我想要实现(感谢@George Profenza分享链接)

+1

您只需要按照正确的顺序转换每个对象。您将首先围绕橙色物体旋转绿色物体以获取其位置。然后使用绿色物体的位置并围绕它旋转蓝色物体。它们具有完美的圆形轨道,因此您可以将它们从它们绕行的物体的中心转换一段固定的距离。 –

+0

你需要的东西[像这样(https://www.youtube.com/watch?v=QVuU2YCwHjw&feature=youtu.be&t=1m)? –

+0

@ peter-wood,不,我只是试着模拟绕地球旋转的太阳和月球旋转的地球。 – tvoloshyn

回答

1

将所有计算基于当前对象的半径和角度进行计算,并存储对象的半径和角度。

特别是,不要在每次迭代时根据x/y坐标计算半径:如果基础对象在步骤之间移动,则计算的半径将略微偏离,并且错误将累积。

+0

这就是问题:)现在修复!谢谢 ! – tvoloshyn

0

你应该能够使用OpenGL的使用glPushMatrix()glPopMatrix()电话窝坐标空间。 Here的一个基本示例(按鼠标查看坐标空间)。 语法不是C++,但很容易看出我的意思。

你可以这样做多种方式:只需使用推/弹出矩阵调用(连同在需要的地方/旋转平移),它执行

  1. 极坐标公式
  2. 手动乘以变换矩阵
  3. 矩阵乘法在幕后。

以防万一你想尝试的极坐标公式:

x = cos(angle) * radius 
y = sin(angle) * radius 

凡角是圆的当前旋转半径是它的离旋转中心的距离。

+0

这就是我一直在做的(极坐标公式),它只适用于围绕太阳轨道运行,但月球轨道随着每次迭代而增加。在答案中检查我的代码(我刚刚添加)。 – tvoloshyn