我正在开发一款涉及在行星上移动的游戏,目前让玩家使用前进和后退向一个方向移动:
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旋转,以便角色在正确的方向上绕行星移动?
答案 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)) 。通过将上述表格的增量旋转矩阵乘以自上次更新以来的移动,在每个刻度上或根据需要更新该刻度。这应该可以为您提供与直观控制一致的平滑运动。