围绕一个点(行星)向不同方向移动

时间:2014-12-10 21:30:48

标签: c++ matrix rotation directx

我正在开发一款涉及在行星上移动的游戏,目前让玩家使用前进和后退向一个方向移动:

if( forward)
  yAngle = yAngle + 0.005f;
if( backward)
  yAngle = yAngle - 0.005f;
if(left)
  zAngle = zAngle - 0.005f;
if(right)
  zAngle = zAngle + 0.005f;

然后将这些角度放入矩阵中。

角色使用Z旋转完美旋转,并使用Y旋转向前和向后绕地球运行,但只会朝那个方向移动。

我如何计算X和Y旋转,以便角色在正确的方向上绕行星移动?

2 个答案:

答案 0 :(得分:1)

我建议尝试这样的事情:

if (forward) {
  xAngle += 0.005f * (cos(zAngle));
  yAngle += 0.005f * (sin(zAngle));
}
if (backward) {
  xAngle -= 0.005f * (cos(zAngle));
  yAngle -= 0.005f * (sin(zAngle));
}

我在这里预感,但试试吧!

答案 1 :(得分:1)

围绕3D笛卡尔坐标系的x轴旋转的旋转矩阵是

     1            0            0
     0        cos(xAngle)  sin(xAngle)
     0       -sin(xAngle)  cos(xAngle)

围绕y轴旋转的矩阵是

 cos(yAngle)      0       -sin(yAngle)
     0            1            0
 sin(yAngle)      0        cos(yAngle)

围绕z轴旋转的矩阵是

 cos(zAngle)  sin(zAngle)      0
-sin(zAngle)  cos(zAngle)      0
     0            0            1

你可以通过扭转其正弦项的符号来反转任何矩阵的旋转感。

对于两个轴的组合旋转,没有唯一的定义或矩阵,但是,因为结果取决于旋转的执行顺序。与你的情况特别相关的是,如果轮换是在一系列小的交替步骤中进行的,那么它仍然是不同的。

因此,我建议保留一个描述当前方向的变换矩阵,而不是跟踪整体旋转角度(例如,当前到船的方向是M *(1,0,0)) 。通过将上述表格的增量旋转矩阵乘以自上次更新以来的移动,在每个刻度上或根据需要更新该刻度。这应该可以为您提供与直观控制一致的平滑运动。