opengl教程翻译 #7旋转矩阵
背景知识:
在我们的变换列表中的下一个是旋转,即,给定一个角度和一个点,绕着某条轴旋转这个点。我们总是在X,Y,Z仨中保持一个不变,改变另俩。这意味着旋转路径将会陈列在三个主平面其中之一上:XY平面(当绕着Z轴转时),YZ平面(当绕着X轴转时),XZ平面(当绕着Y轴转时)。有更加复杂的旋转变换允许你绕着一个随意的向量旋转,但这个阶段不讨论它们。
让我们大概定义一下问题。已知下面的图:
我们想把圈从(x1,y1)移到(x2,y2)。换句话说我们把(x1,y1)旋转角度α2。让我们假设圆的半径是1。这意味着以下:
我们会用下面的三角函数展示x2和y2:
我们这么写上面的式子:
上图我们盯着XY平面,而Z是指向纸的里面的。如果X和Y是4维向量的一部分,那么上面的等式就能被写成矩阵模式(没有影响到Z和W)
如果我们想为YZ(绕着X轴)和XZ(绕着Y轴)平面创建一个旋转,那么方程基本相同,只是矩阵的安排有一点点不同。这绕着Y轴旋转的矩阵:
而这是绕着X轴旋转的矩阵:
源码演练:
在这课中代码改变很小。我们只需在代码中改变单个变换矩阵的内容即可。
World.m[0][0]=cosf(Scale); World.m[0][1]=-sinf(Scale); World.m[0][2]=0.0f; World.m[0][3]=0.0f;
World.m[1][0]=sinf(Scale); World.m[1][1]=cosf(Scale); World.m[1][2]=0.0f; World.m[1][3]=0.0f;
World.m[2][0]=0.0f; World.m[2][1]=0.0f; World.m[2][2]=1.0f; World.m[2][3]=0.0f;
World.m[3][0]=0.0f; World.m[3][1]=0.0f; World.m[3][2]=0.0f; World.m[3][3]=1.0f;
如果所看到的我们绕着Z轴旋转。你也可以尝试着其他旋转,但我认为在现在没有实际的从3D到2D的投影其他旋转看起来很怪。我们将会在即将到来的全套的变换管线课程中完成它们。