GAMES101作業解答-作業1 旋轉與投影
1. 題目要求
- 作業任務是填寫一個旋轉矩陣和一個透視投影矩陣。給定三維下三個 點 v0(2.0,0.0,−2.0),v1(0.0,2.0,−2.0),v2(−2.0,0.0,−2.0), 需要將這三個點的坐 標變換為屏幕坐標並在屏幕上繪制出對應的線框三角形 (在代碼框架中,已經提供了 draw_triangle 函數,所以你只需要去構建變換矩陣即可)。簡而言之, 需要進行模型、視圖、投影、視口等變換來將三角形顯示在屏幕上。在提供 的代碼框架中,我們留下了模型變換和投影變換的部分給你去完成。
2. 作業解答
- 所需環境在前面作業 0 已經介紹了,包括進行數學矩陣向量計算的 Eigen 和 openCV 庫的配置。
- 要寫的代碼主要是在main方法里面的模型、視圖、投影轉換方法的實現。
# 視圖轉換
Eigen::Matrix4f get_view_matrix(Eigen::Vector3f eye_pos)
{
Eigen::Matrix4f view = Eigen::Matrix4f::Identity(); # 定義 4*4 單位矩陣
Eigen::Matrix4f translate; # 初始化視角變換矩陣
translate << 1,0,0,-eye_pos[0],
0,1,0,-eye_pos[1],
0,0,1,-eye_pos[2],
0,0,0,1;
view = translate*view;
return view;
}
# 模型轉換
Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
#// 初始化一個單位矩陣model
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
#// 定一個一個變換矩陣translate
Eigen::Matrix4f translate;
#// math.h定義的三角函數均采用弧度制,這里先將旋轉角度轉換一下
double radian = rotation_angle / 180.0 * MY_PI;
translate << cos(radian), -sin(radian), 0, 0,
sin(radian), cos(radian), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1;
model = translate * model;
return model;
}
# 透視投影轉換
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio, float zNear, float zFar)
{
#// 初始化一個單位矩陣projection
Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
#/* 初始化一個單位矩陣persp2ortho,其作用為將透視點映射為適合
# 進行正交投影的點*/
Eigen::Matrix4f persp2ortho = Eigen::Matrix4f::Identity();
persp2ortho << zNear, 0, 0, 0,
0, zNear, 0, 0,
0, 0, zNear + zFar, -zNear * zFar,
0, 0, 1, 0;
double halfEyeRadian = eye_fov * MY_PI / 2 / 180.0;
double top = zNear * tan(halfEyeRadian);
double bottom = -top;
double right = top * aspect_ratio;
double left = -right;
Eigen::Matrix4f orthoScale = Eigen::Matrix4f::Identity();
orthoScale << 2 / (right - left), 0, 0, 0,
0, 2 / (top - bottom), 0, 0,
0, 0, 2 / (zNear - zFar), 0,
0, 0, 0, 1;
Eigen::Matrix4f orthoTrans = Eigen::Matrix4f::Identity();
orthoTrans << 1, 0, 0, -(right + left) / 2,
0, 1, 0, -(top + bottom) / 2,
0, 0, 1, -(zNear + zFar) / 2,
0, 0, 0, 1;
Eigen::Matrix4f matrixOrtho = orthoScale * orthoTrans;
projection = matrixOrtho * persp2ortho;
return projection;
}
- 上述三種方法的實現,參照閆老師提供的課程ppt,以及網上一些解答基本上可以自己寫出來,也可以理解。這里我參考了鏈接
- 主要解釋的是在mac big sur系統下,利用cmake編譯時遇到的一些問題,以及經過查閱資料解決的過程。
3. 問題
- 問題1:
開始查了很多資料,一直找不到比較好的解決辦法,后來看到一個解決方法是:刪除bulid目錄下的CMakeCache.txt文件,然后重新編譯鏈接即可解決。 - 問題2
這個問題較為簡單,缺失頭文件array,在該文件首部添加 \(#include <array>\)