实现一个能够跟随鼠标切换视角,进行动态消隐的正方体,能够帮助更好的实现立体三维几何在二维当中的实现。
系统主要涉及在二维平面中三维图形的绘制、图形的旋转、图形的平移、图形的缩放和图形的消隐算法。
1.正方体的三维呈现
首先将顶点标号,通过设置顶点的xyz坐标数组,将各个顶点的坐标对应起来。
x[8] = { a+o, a+o, 0+o, 0+o, a+o, a+o, 0+o, 0+o };
y[8] = { 0+o, a+o, a+o, 0+o, 0+o, a+o, a+o, 0+o };
z[8] = { a+o, a+o, a+o, a+o, 0+o, 0+o, 0+o, 0+o };
(关于+o的原因在后面会提到)
通过点面矩阵,将同一个面的所有点聚集起来,放入一个矩阵中,给六个面标上序号。
f[6] = { 0,1,2,3,4,5 }; //面的号码
fp[6][5] = { {0,1,2,3,0},{1,0,4,5,1},{4,0,3,7,4},{2,1,5,6,2}, {6,7,3,2,6},{6,5,4,7,6} }; //面的顶点序
2. 图形的旋转
利用 mouseDown 鼠标触发事件触发图形旋转,鼠标启动,摄像机可以进行坐标和角度的转换,利用:
glRotatef(xrot, 1.0f, 0.0f, 0.0f);
glRotatef(1.0f, yrot, 0.0f, 0.0f);//设置物体如何旋转的方式参数为旋转角度
函数获取旋转角度。
3. 图形的平移
x[8] = { a+o, a+o, 0+o, 0+o, a+o, a+o, 0+o, 0+o };
在最初初始化坐标时,利用‘可修改的变量o’对数组进行赋值,在触发键盘事件时修改o的值,重新画图,即可得到初始坐标变换的图像,即完成了图像的平移。
4. 图形的缩放
x[8] = { a+o, a+o, 0+o, 0+o, a+o, a+o, 0+o, 0+o };
在最初初始化坐标时,利用可修改的变量a对数组进行赋值,在触发键盘事件时修改a的值,重新画图,即可得到放大/缩小的图像,即完成了图像的缩放。
5. 图形的实时动态消隐
根据课上所学的知识:
(1)后向面总是看不见的;
(2)不会仅由于后向面的遮挡,而使别的棱成为不可见;
(3)可以把这些后向面全部去掉,并不影响消隐结果。
计算正方在当前视角下的视点向量S和正方体各个面的法向量(V)
①若V·S<0,称该多边形为前向面。② 若V·S>0,称该多边形为后向面。