生活随笔
收集整理的這篇文章主要介紹了
GAMES101-现代计算机图形学学习笔记(作业01)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
GAMES101-現代計算機圖形學學習筆記(作業(yè)01)
Assignment 01
- GAMES101-現代計算機圖形學學習筆記(作業(yè)01)
- 作業(yè)
原課程視頻鏈接以及官網
b站視頻鏈接: link.
課程官網鏈接: link.
作業(yè)
作業(yè)描述
本次作業(yè)的任務是填寫一個旋轉矩陣和一個透視投影矩陣。給定三維下三個 點
v0(2.0,0.0,?2.0),
v1(0.0,2.0,?2.0),
v2(?2.0,0.0,?2.0),
你需要將這三個點的坐標變換為屏幕坐標并在屏幕上繪制出對應的線框三角形 (在代碼框架中,我們已經提供了 draw_triangle 函數,所以你只需要去構建變換矩陣即可)。簡而言之, 我們需要進行模型、視圖、投影、視口等變換來將三角形顯示在屏幕上。在提供的代碼框架中,我們留下了模型變換和投影變換的部分給你去完成。
提高篇: 在 main.cpp 中構造一個函數,該函數的作用是得到繞任意過原點的軸的旋轉變換矩陣。
需要補充的函數
get_model_matrix(float rotation_angle): 逐個元素地構建模型變換矩陣并返回該矩陣。在此函數中,你只需要實現三維中繞 z 軸旋轉的變換矩陣,而不用處理平移與縮放。
get_projection_matrix(float eye_fov, float aspect_ratio, float zNear, float zFar):使用給定的參數逐個元素地構建透視投影矩陣并返回該矩陣。
思路
①model 變換
model矩陣是MVP變換中的第一個矩陣,它用于將物體從自身局部坐標變換到世界坐標,題目要求實現三維中繞z軸旋轉的變換矩陣和任意軸旋轉的變換矩陣。
對于繞z軸旋轉的變換矩陣有如下特點:
Rz(α)=(cos?α?sin?α00sin?αcos?α0000100001)\mathbf{R}_{z}(\alpha)=\left(\begin{array}{cccc} \cos \alpha & -\sin \alpha & 0 & 0 \\ \sin \alpha & \cos \alpha & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right)Rz?(α)=?????cosαsinα00??sinαcosα00?0010?0001??????
Eigen
::Matrix4f
get_model_matrix(float rotation_angle
)
{Eigen
::Matrix4f model
= Eigen
::Matrix4f
::Identity();Eigen
::Matrix4f
rotate(4,4); float radian
= rotation_angle
/ 180.0 * MY_PI
;rotate
<< cos(radian
), -sin(radian
), 0, 0,sin(radian
), cos(radian
), 0, 0,0, 0, 1, 0,0, 0, 0, 1;model
= rotate
* model
;return model
;
}
而如果想要實現任意軸旋轉,我們需要先得到一個交于原點的旋轉軸和旋轉角度,得到了之后只需要根據軸角公式旋轉即可:
R(n,α)=cos?(α)I+(1?cos?(α))nnT+sin?(α)(0?nznynz0?nx?nynx0)?N\mathbf{R}(\mathbf{n}, \alpha)=\cos (\alpha) \mathbf{I}+(1-\cos (\alpha)) \mathbf{n} \mathbf{n}^{T}+\sin (\alpha) \underbrace{\left(\begin{array}{ccc} 0 & -n_{z} & n_{y} \\ n_{z} & 0 & -n_{x} \\ -n_{y} & n_{x} & 0 \end{array}\right)}_{\mathbf{N}}R(n,α)=cos(α)I+(1?cos(α))nnT+sin(α)N???0nz??ny???nz?0nx??ny??nx?0??????
Eigen
::Matrix4f
get_model_matrix_axis(float rotation_angle
, Eigen
::Vector3f axis_start
, Eigen
::Vector3f axis_end
)
{Eigen
::Matrix4f model
= Eigen
::Matrix4f
::Identity();Eigen
::Vector3f axis
;axis
[0] = axis_end
[0] - axis_start
[0];axis
[1] = axis_end
[1] - axis_start
[1];axis
[2] = axis_end
[2] - axis_start
[2];float norm
= sqrt(axis
[0] * axis
[0] + axis
[1] * axis
[1] + axis
[2] * axis
[2]);axis
[0] /= norm
;axis
[1] /= norm
;axis
[2] /= norm
;float radian
= rotation_angle
/ 180.0 * MY_PI
;Eigen
::Matrix3f
n(3, 3);n
<< 0, -axis
[2], axis
[1],axis
[2], 0, -axis
[0],-axis
[1], axis
[0], 0;Eigen
::Matrix3f component1
= Eigen
::Matrix3f
::Identity() * cos(radian
);Eigen
::Matrix3f component2
= axis
* axis
.transpose() * (1 - cos(radian
));Eigen
::Matrix3f component3
= n
* sin(radian
); Eigen
::Matrix3f rotate_m
= component1
+ component2
+ component3
;Eigen
::Matrix4f rotate_martix
= Eigen
::Matrix4f
::Identity();rotate_martix
.block(0, 0, 3, 3) = rotate_m
; model
= rotate_martix
* model
;return model
;
}
②view變換
view變換用于計算相機視角,這里采用透視投影的方式,第一步先計算M_persp2ortho矩陣,用于將視錐擠壓成長方體,第二步計算M_ortho,即將長方體內的坐標進行投影,最后一步通過兩次變換即可計算出最終的透視投影矩陣。
Eigen
::Matrix4f
get_projection_matrix(float eye_fov
, float aspect_ratio
,float zNear
, float zFar
)
{Eigen
::Matrix4f projection
= Eigen
::Matrix4f
::Identity();Eigen
::Matrix4f
M_persp2ortho(4, 4);Eigen
::Matrix4f
M_ortho_scale(4, 4);Eigen
::Matrix4f
M_ortho_trans(4, 4);float angle
= eye_fov
* MY_PI
/ 180.0; float height
= zNear
* tan(angle
) * 2;float width
= height
* aspect_ratio
;auto t
= -zNear
* tan(angle
/ 2); auto r
= t
* aspect_ratio
; auto l
= -r
; auto b
= -t
; M_persp2ortho
<< zNear
, 0, 0, 0,0, zNear
, 0, 0,0, 0, zNear
+ zFar
, -zNear
* zFar
,0, 0, 1, 0;M_ortho_scale
<< 2 / (r
- l
), 0, 0, 0,0, 2 / (t
- b
), 0, 0,0, 0, 2 / (zNear
- zFar
), 0,0, 0, 0, 1;M_ortho_trans
<< 1, 0, 0, -(r
+ l
) / 2,0, 1, 0, -(t
+ b
) / 2,0, 0, 1, -(zNear
+ zFar
) / 2,0, 0, 0, 1;Eigen
::Matrix4f M_ortho
= M_ortho_scale
* M_ortho_trans
;projection
= M_ortho
* M_persp2ortho
* projection
;return projection
;
}
結果
以下依次是繞z軸旋轉0/45/90度的結果:
繞任意軸旋轉的結果可以通過調用get_model_matrix_axis函數實現。
總結
以上是生活随笔為你收集整理的GAMES101-现代计算机图形学学习笔记(作业01)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。