GAMES101作業解答-作業1 旋轉與投影


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>\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM