日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GAMES101-现代计算机图形学学习笔记(作业01)

發(fā)布時間:2023/12/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GAMES101-现代计算机图形学学习笔记(作业01) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GAMES101-現代計算機圖形學學習筆記(作業(yè)01)

Assignment 01

    • GAMES101-現代計算機圖形學學習筆記(作業(yè)01)
  • 作業(yè)
    • 作業(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); // z-axis rotationfloat 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::Vector3f axis_start 為起點// Eigen::Vector3f axis_end 為終點Eigen::Matrix4f model = Eigen::Matrix4f::Identity();// normalize axisEigen::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;// compute radianfloat radian = rotation_angle / 180.0 * MY_PI;// compute component 計算軸角旋轉矩陣分量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 自帶構造軸角旋轉矩陣// 下列注釋用于驗證我們構造的軸角旋轉矩陣是否和Eigen的構造的軸角旋轉矩陣一致//Eigen::AngleAxisf rotation_vector(radian, Vector3f(axis[0], axis[1], axis[2])); //Eigen::Matrix3f rotation_matrix;//rotation_m = rotation_vector.toRotationMatrix();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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 99精品福利视频 | 午夜一级片 | 手机在线看片你懂的 | 色网站视频 | 伊人狼人影院 | 国产婷婷一区二区三区 | 97视频在线免费 | 伊人婷婷久久 | 欧美性第一页 | 成人片黄网站久久久免费 | 国产制服丝袜 | 久草色视频 | 黄色aa网站 | 国产免费aa | 成人羞羞免费 | 老妇裸体性猛交视频 | 久久精品免费在线观看 | 亚洲一区二区av在线 | 疯狂做受xxxx高潮人妖 | 久久久久久久久久久91 | 国产日韩欧美综合 | 国产精品99久久久精品无码 | 日本视频一区二区三区 | 男人扒女人添高潮视频 | 丝袜 中出 制服 人妻 美腿 | 亚洲国产精品国自产拍久久 | 成人亚洲免费 | 欧美性猛交xxxx黑人交 | 国产热视频 | 久久久久久久久久综合 | 久久久久亚洲AV成人网人人小说 | 337p日本欧洲亚洲鲁鲁 | 免费爱爱网站 | 亚洲宅男天堂 | 一个人看的www视频在线观看 | 精国产品一区二区三区a片 国产精品第一 | 国产日韩中文字幕 | 五月天精品| 国产美女黄色片 | 免费观看a级片 | 国产精品久久综合视频 | 午夜视频在线观看国产 | 亚洲每日在线 | 亚日韩欧美 | 男人猛进女人爽的大叫 | 天天射网 | 校园春色av | 仙踪林av | 欧美又大粗又爽又黄大片视频 | 亚洲色图 在线视频 | 夜夜久久久 | 黄色三极片 | 日韩欧美在线一区二区三区 | 国产在线观看一区 | 午夜激情电影在线观看 | а√天堂8资源中文在线 | 精品一卡二卡三卡 | 韩国无码一区二区三区精品 | 无遮挡又爽又刺激的视频 | 亚洲另类自拍 | 亚洲乱码av| 91av在线看 | 五月婷婷色综合 | 国产成人在线视频免费观看 | 午夜视频 | 欧美粗又大| jizz黑人| 美女色诱男人激情视频 | 五月天婷婷社区 | 欧美成人综合在线 | 国内外成人免费视频 | 国产女18毛片多18精品 | 91网在线| 99综合色 | 天天操天天操天天 | 午夜国产免费 | 偷拍视频久久 | 美女操出白浆 | 亚洲欧美天堂网 | 91香蕉视频污污 | 午夜在线看片 | 香蕉综合在线 | 逼逼爱插插网站 | 日欧视频 | 国语对白自拍 | 天天射狠狠干 | 91久久精品日日躁夜夜躁欧美 | 国产成人精品一区二区三区无码熬 | www,五月天,com | 国模精品视频一区二区 | 诱夫1v1高h | 男女一区| 国产99久久久国产精品 | 女同亚洲精品一区二区三 | 天天夜夜人人 | 国产婷婷色一区二区 | 男人激情网 | 国产肉体xxxx裸体784大胆 | 亚洲国产一区二区三区 |