我有一个使用glGLotf旋转的网格/游戏对象,使用FreeGLUT库:
glPushMatrix();
glTranslatef(GlobalPos_x, GlobalPos_y, GlobalPos_z);
glRotatef(Global_Yaw,0,1,0);
glRotatef(Global_Pitch,1,0,0);
glRotatef(Global_Roll,0,0,1);
RenderMesh(mesh_Plane);
glPopMatrix();
开始时,物体与前向Z轴对齐; Y轴向上,X轴向左移动。
'控制':
W:每帧+5度
S:每帧俯仰-5度
A:每帧偏航+5度
D:每帧偏航-5度
目标:Global_Yaw,Global_Pitch和Global_Roll值必须以某种方式从这些控件增加(范围分别为-180到+180,-90到+90和-180到+180)。
问题是,如果飞机已经向上倾斜了90度 它原来的位置,'偏航'会让它旋转 Y轴(万向节锁),应该只在第一个 - 人射手。
所以简单地做'if(GetAsyncKeyState(Key_A))Global_Yaw + = 5;'不是我想要的。
在tkausl的提醒之后,我挖出了我之前的一次尝试。我的想法是,我将飞机当前的全局角度转换为矩阵,将该矩阵与玩家的关键输入生成的另一个矩阵相乘,然后以某种方式使用此矩阵获得新的Global_Yaw,Global_Pitch和Global_Roll值:
// Convert ORIENTATION to MATRIX
Omatrix00 = cos(Global_Pitch)*cos(Global_Yaw);
Omatrix01 = sin(Global_Pitch);
Omatrix02 = cos(Global_Pitch)*sin(Global_Yaw);
Omatrix03 = 0;
Omatrix10 = -cos(Global_Roll)*sin(Global_Pitch)*cos(Global_Yaw)+sin(Global_Roll)*sin(Global_Yaw);
Omatrix11 = cos(Global_Roll)*cos(Global_Pitch);
Omatrix12 = -cos(Global_Roll)*sin(Global_Pitch)*sin(Global_Yaw)-sin(Global_Roll)*cos(Global_Yaw);
Omatrix13 = 0;
Omatrix20 = -sin(Global_Roll)*sin(Global_Pitch)*cos(Global_Yaw)-cos(Global_Roll)*sin(Global_Yaw);
Omatrix21 = sin(Global_Roll)*cos(Global_Pitch);
Omatrix22 = cos(Global_Roll)*cos(Global_Yaw)-sin(Global_Roll)*sin(Global_Pitch)*sin(Global_Yaw);
Omatrix23 = 0;
Omatrix30 = 0;
Omatrix31 = 0;
Omatrix32 = 0;
Omatrix33 = 1;
// Convert Commanded Turn Angles to MATRIX
matrix00 = cos(pitch_speed)*cos(yaw_speed);
matrix02 = cos(pitch_speed)*sin(yaw_speed);
matrix01 = sin(pitch_speed);
matrix03 = 0;
matrix10 = -cos(roll_speed)*sin(pitch_speed)*cos(yaw_speed)+sin(roll_speed)*sin(yaw_speed);
matrix11 = cos(roll_speed)*cos(pitch_speed);
matrix12 = -cos(roll_speed)*sin(pitch_speed)*sin(yaw_speed)-sin(roll_speed)*cos(yaw_speed);
matrix13 = 0;
matrix20 = -sin(roll_speed)*sin(pitch_speed)*cos(yaw_speed)-cos(roll_speed)*sin(yaw_speed);
matrix21 = sin(roll_speed)*cos(pitch_speed);
matrix22 = cos(roll_speed)*cos(yaw_speed)-sin(roll_speed)*sin(pitch_speed)*sin(yaw_speed);
matrix23 = 0;
matrix30 = 0;
matrix31 = 0;
matrix32 = 0;
matrix33 = 1;
// Next step: Somehow using this matrix to get new Global_Yaw, Global_Pitch and Global_Roll values...
我甚至不确定我是否在我的代码中正确地增加了我的矩阵。
答案 0 :(得分:0)
您必须首先围绕x轴或z轴旋转,然后最后旋转以获得正确的结果。在大多数类型的游戏中,你不需要滚动,你可以围绕x旋转,然后绕z旋转,一切都按预期旋转。