一、
MFC
框架下使用
OpenGL
绘图演示平移、旋转、缩放等操作的具体实现
二、
实现算法
绘制的图形以各种顶点及顶点之间的线、面构成
要想对这些图形进行操作,只需要对各种顶点在坐标系中的坐标进行转换即可
顶点在
OpenGL
中的坐标以四维形式表示:(
X,Y,Z,W
)
其中
X,Y,Z
对应三维系统中
X
,
Y
,
Z
三个柚;
W
默认为
1
,一般为了方便各种操作时坐标换算而将三维坐标系提升为四次,即齐次坐标系。
①
平移操作——对应
glTranslate
函数:
初始点:(
X,Y,Z,W
)
使用转换矩阵
TMatrix
:
1, 0, 0, Tx
0, 1, 0, Ty
0, 0, 1, Tz
0, 0, 0, 1
(X’, Y’, Z’) =
TMatrix * (X, Y, Z),
其中
Tx
,
Ty
,
Tz
对应
glTranslate
函数中的三个参数,分别表示三个方向的的平移量;原始坐标右乘平移矩阵后即得到新的坐标
③
缩放操作——对应
glScale
函数:
使用转换矩阵为
SMatrix
:
Sx, 0, 0, 0
0, Sy, 0, 0
0, 0, Sz, 0
0, 0, 0, 1
(X’, Y’, Z’) =
SMatrix * (X, Y, Z)
此次自己实现的缩放函数与
OpenGL
有所不同,我实现的是与图形的中心点为基准进行缩放,所以进行矩阵变换前需要计算各个坐标的位置并求几何中心。
②
旋转操作——对应
glRotate
函数(逆时针方向):
在三维坐标系统中,旋转操作与二维情况有所不同,因为三维中的一个点可以绕不同的方向进行旋转,所以除了要指定旋转角度外,还要指定旋转轴
当所取旋转轴为
X
,
Y
或
Z
三个坐标轴时,与二维情况相似
即所选取的轴那一方向上的坐标不变,在其它两个轴所成的平面上进行二维旋转变换
根据这个规律可以把三维中绕任意轴旋转的操作分为几个操作来完成
步骤:
先将待旋转的坐标与旋转轴平移,使旋转轴经过原点
进行若干次旋转操作,例旋转轴与
Z
轴正向重合
依据对坐标轴旋转的方法将待旋转坐标进行旋转操作
应用逆旋转使旋转轴回到原方向
应用逆平移使旋转轴回到原位置
二维情况下旋转矩阵为:
cosQ, -sinQ, 0
sinQ, cosQ, 0
0, 0, 1
此次采用先绕
X
转做旋转
Rx
,再绕
Y
转旋转
Ry
使旋转轴与
Z
转正向重合,再绕
Z
轴做
Rz
旋转
Q
度,再进行逆操作还原位置
即
: (X’, Y’, Z’) = Rx*Ry*Rz(Q)*(Ry
-1
)*(Rx-1)
其中
Q
是需要旋转的角度,
逆矩阵</