矩阵堆栈上的操作是基于彼此的。每个操作的参考系是电流变换。如果要变换由一群对象组成的对象,则必须知道每个子对象相对于对象并集的参考位置的相对位置。然后,您必须执行以下步骤:
-
将每个对象移动到世界上的公共位置(
glTranslate
).
-
确定对象的方向(
glRotate
)
-
将每个对象移动到其在对象并集中的相对位置
// dynamic position in the world
float refPosX, refPosY, refPosZ;
// dynamic orientation
float angle;
// constant positions of the sub object relative to the object union
float subPosX[], subPosY[], subPosZ[];
for ( int i = 0 i < noOfObj, ++i ) // for each object
{
glPushMatrix();
glTranslatef(refPosX, refPosY, refPosZ);
glRotatef(angle, 0, 1, 0);
glTranslatef(subPosX[i], subPosY[i], subPosZ[i]);
glScalef(9.0, 1.75, 1.75);
..... // draw the object here
glPopMatrix();
}
请参阅的文档
glTranslate
:
glTranslate(glTranslate)
生成翻译
x y z
. 电流矩阵(参见
glMatrixMode
)乘以该平移矩阵,乘积替换当前矩阵,
请参阅
glRotate
:
glRotate旋转
围绕矢量生成角度旋转
x y z
. 电流矩阵(参见
glMatrixMode
)乘以旋转矩阵,乘积替换当前矩阵,
注意,转换矩阵如下所示:
Matrix4x4 translate;
translate[0] : ( 1, 0, 0, 0 )
translate[1] : ( 0, 1, 0, 0 )
translate[2] : ( 0, 0, 1, 0 )
translate[3] : ( tx, ty, tz, 1 )
绕Y轴的旋转矩阵如下所示:
Matrix4x4 rotate;
float angle;
rotate[0] : ( cos(angle), 0, sin(angle), 0 )
rotate[1] : ( 0, 1, 0, 0 )
rotate[2] : ( -sin(angle), 0, cos(angle), 0 )
rotate[3] : ( 0, 0, 0, 1 )
矩阵乘法的工作原理如下:
Matrix4x4 A, B, C;
// C = A * B
for ( int k = 0; k < 4; ++ k )
for ( int l = 0; l < 4; ++ l )
C[k][l] = A[0][l] * B[k][0] + A[1][l] * B[k][1] + A[2][l] * B[k][2] + A[3][l] * B[k][3];
结果
translate * rotate
这是:
model[0] : ( cos(angle), 0, sin(angle), 0 )
model[1] : ( 0, 1, 0, 0 )
model[2] : ( -sin(angle), 0, cos(angle), 0 )
model[3] : ( tx, ty, tz, 1 )
注意,结果
rotate * translate
将是:
model[0] : ( cos(angle), 0, sin(angle), 0 )
model[1] : ( 0, 1, 0, 0 )
model[2] : ( -sin(angle), 0, cos(angle), 0 )
model[3] : ( cos(angle)*tx - sin(angle)*tx, ty, sin(angle)*tz + cos(angle)*tz, 1 )