一、預備知識
- 齊次座標:https://blog.csdn.net/zhanxi1992/article/details/106222998
- 圖形學變換——平移、旋轉和縮放 https://blog.csdn.net/zhanxi1992/article/details/106532991
二、實現
- 八面體頂點數據
const int NumVertices = 24; // 8個面,每個面1個三角形,每個三角形3個頂點,共24個頂點
point4 points[NumVertices] =
{
// 立方體頂點座標數組
// 上半部分
vertices[0], vertices[1], vertices[2],
vertices[0], vertices[2], vertices[3],
vertices[0], vertices[3], vertices[4],
vertices[0], vertices[4], vertices[1],
// 下半部分
vertices[1], vertices[5], vertices[2],
vertices[2], vertices[5], vertices[3],
vertices[3], vertices[5], vertices[4],
vertices[4], vertices[5], vertices[1],
};
- 顏色數據
// 右邊圖形頂點顏色數組
color4 colorsRight[NumVertices] =
{
// 上半部分
colors[RED], colors[RED], colors[RED],
colors[GREEN], colors[GREEN], colors[GREEN],
colors[BLUE], colors[BLUE], colors[BLUE],
colors[YELLOW], colors[YELLOW], colors[YELLOW],
// 下半部分
colors[HALF_RED], colors[HALF_RED], colors[HALF_RED],
colors[HALF_GREEN], colors[HALF_GREEN], colors[HALF_GREEN],
colors[HALF_BLUE], colors[HALF_BLUE], colors[HALF_BLUE],
colors[HALF_YELLOW], colors[HALF_YELLOW], colors[HALF_YELLOW],
};
// 左邊圖形頂點顏色數組(注意和points中頂點序列對應)
color4 colorsLeft[NumVertices] =
{
// 上半部分
colors[WHITE], colors[RED], colors[GREEN],
colors[WHITE], colors[GREEN], colors[BLUE],
colors[WHITE], colors[BLUE], colors[YELLOW],
colors[WHITE], colors[YELLOW], colors[RED],
// 下半部分
colors[RED], colors[BLACK], colors[GREEN],
colors[GREEN], colors[BLACK], colors[BLUE],
colors[BLUE], colors[BLACK], colors[YELLOW],
colors[YELLOW], colors[BLACK], colors[RED],
};
- 透視矩陣
matProj = Perspective(15.0, aspectRatio, 15.0, 35.0); // 透視投影變換
- 變換矩陣
注:因爲矩陣的運算符合結合律,所有對於點p的一系列變換可轉換爲所有變換矩陣的乘積,在圖形學中稱爲變換的級聯。即p’= ABCp = A(B(Cp)),越先變換的離 p 點最近,這裏的 P 是列矩陣。
// 創建變換矩陣 p'= ABCp = A(B(Cp))
mat4 transform = matProj // 投影矩陣
* Translate(0.0, 0.0, -25.0) // 沿z軸平移
* RotateY(RotateAngle) // 繞y軸旋轉
* RotateX(Azimuth); // 繞x軸旋轉
三、控制
方向鍵控制旋轉
按 w 鍵切換線框模式
按 R 鍵 增加旋轉速度, r 鍵 降低旋轉速度
四、預覽與源碼
Demo源碼: https://github.com/WarZhan/Graphics-Demo/tree/master/Octahedra.
歡迎關注個人公衆號,實時推送最新博文!