当前位置: 首页 > news >正文

可以在线编程的网站虚拟主机 网站镜像

可以在线编程的网站,虚拟主机 网站镜像,设计师培训体系,江门模板建站哪家好题目 给定三维下三个点 v0(2.0, 0.0, −2.0), v1(0.0, 2.0, −2.0), v2(−2.0, 0.0, −2.0), 你需要将这三个点的坐标变换为屏幕坐标并在屏幕上绘制出对应的线框三角形 (在代码框架中#xff0c;我们已经提供了 draw_triangle 函数#xff0c;所以你只需要去构建变换矩阵即可…题目 给定三维下三个点 v0(2.0, 0.0, −2.0), v1(0.0, 2.0, −2.0), v2(−2.0, 0.0, −2.0), 你需要将这三个点的坐标变换为屏幕坐标并在屏幕上绘制出对应的线框三角形 (在代码框架中我们已经提供了 draw_triangle 函数所以你只需要去构建变换矩阵即可)。简而言之我们需要进行模型、视图、投影、视口等变换来将三角形显示在屏幕上。在提供的代码框架中我们留下了模型变换和投影变换的部分给你去完成。题解 本次作业需要实现代码框架中的两个接口 Eigen::Matrix4f get_model_matrix(float rotation_angle); Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,float zNear, float zFar);1. 旋转 第一个接口相对比较简单直接返回旋转矩阵即可。注意需要将角度转为弧度。 绕Z轴旋转矩阵如下 R z ( α ) ( cos ⁡ α − sin ⁡ α 0 0 sin ⁡ α cos ⁡ α 0 0 0 0 1 0 0 0 0 1 ) \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​ ​ 课程中还讲到了绕X 轴的旋转矩阵 R x ( α ) ( 1 0 0 0 0 cos ⁡ α − sin ⁡ α 0 0 sin ⁡ α cos ⁡ α 0 0 0 0 1 ) \mathbf{R}_x(\alpha)\left(\begin{array}{cccc} 1 0 0 0 \\ 0 \cos \alpha -\sin \alpha 0 \\ 0 \sin \alpha \cos \alpha 0 \\ 0 0 0 1 \end{array}\right) Rx​(α) ​1000​0cosαsinα0​0−sinαcosα0​0001​ ​ 绕Y轴的旋转矩阵( 注意这里的sin符号和其他两种情况不同是因为右手坐标系从x-z旋转Y轴和拇指方向相反) R y ( α ) ( cos ⁡ α 0 sin ⁡ α 0 0 1 0 0 − sin ⁡ α 0 cos ⁡ α 0 0 0 0 1 ) \mathbf{R}_y(\alpha)\left(\begin{array}{cccc} \cos \alpha 0 \sin \alpha 0 \\ 0 1 0 0 \\ -\sin \alpha 0 \cos \alpha 0 \\ 0 0 0 1 \end{array}\right) Ry​(α) ​cosα0−sinα0​0100​sinα0cosα0​0001​ ​ 角度转为弧度 α θ π 180 \alpha\theta \frac{\pi}{180} αθ180π​ 2. 正交投影 根据课程中的推导过程其中 z ∈ [ − 1 , 1 ] z \in[-1,1] z∈[−1,1]采用右手坐标系。观察变换完成后将物体投影到相机坐标系中。然后在相机坐标系中进行投影变换正交投影或者透视投影。正交投影的基本思想是将长方体视窗体平移到原点然后进行缩放使得 x , y , z ∈ [ − 1 , 1 ] x,y,z \in[-1,1] x,y,z∈[−1,1] 假设长方体视窗体的左右上下前后六个面的坐标分别为 l , r , t , b , n , f l,r,t,b,n,f l,r,t,b,n,f. 正交投影矩阵如下 M ortho  [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 − r l 2 0 1 0 − t b 2 0 0 1 − n f 2 0 0 0 1 ] [ 2 r − l 0 0 − r l r − l 0 2 t − b 0 − t b t − b 0 0 2 n − f − n f n − f 0 0 0 1 ] M_{\text {ortho }}\left[\begin{array}{cccc} \frac{2}{r-l} 0 0 0 \\ 0 \frac{2}{t-b} 0 0 \\ 0 0 \frac{2}{n-f} 0 \\ 0 0 0 1 \end{array}\right]\left[\begin{array}{cccc} 1 0 0 -\frac{rl}{2} \\ 0 1 0 -\frac{tb}{2} \\ 0 0 1 -\frac{nf}{2} \\ 0 0 0 1 \end{array}\right]\left[\begin{array}{cccc} \frac{2}{r-l} 0 0 -\frac{rl}{r-l} \\ 0 \frac{2}{t-b} 0 -\frac{tb}{t-b} \\ 0 0 \frac{2}{n-f} -\frac{nf}{n-f} \\ 0 0 0 1 \end{array}\right] Mortho ​ ​r−l2​000​0t−b2​00​00n−f2​0​0001​ ​ ​1000​0100​0010​−2rl​−2tb​−2nf​1​ ​ ​r−l2​000​0t−b2​00​00n−f2​0​−r−lrl​−t−btb​−n−fnf​1​ ​ 3.透视投影 透视投影可以看作是将视锥体的大端进行压缩成长方体视窗体。透视投影矩阵可以写成如下形式 M persp  M ortho  M persp  → ortho  M_{\text {persp }}M_{\text {ortho }} M_{\text {persp } \rightarrow \text { ortho }} Mpersp ​Mortho ​Mpersp → ortho ​ 压缩过程需要满足以下两个条件 1.所有近平面的坐标不发生改变 2.远平面的z坐标不发生改变。 教程中根据上述条件可以推出 M persp  → ortho  ( n 0 0 0 0 n 0 0 0 0 n f − n f 0 0 1 0 ) M_{\text {persp } \rightarrow \text { ortho }}\left(\begin{array}{cccc} n 0 0 0 \\ 0 n 0 0 \\ 0 0 nf -nf \\ 0 0 1 0 \end{array}\right) Mpersp → ortho ​ ​n000​0n00​00nf1​00−nf0​ ​ 所以投影矩阵如下 M persp  M ortho  M persp  → ortho  [ 2 r − l 0 0 − r l r − l 0 2 t − b 0 − t b t − b 0 0 2 n − f − n f n − f 0 0 0 1 ] [ n 0 0 0 0 n 0 0 0 0 n f − n f 0 0 1 0 ] [ 2 n r − l 0 r l l − r 0 0 2 n t − b t b b − t 0 0 0 n f n − f − 2 n f n − f 0 0 1 0 ] M_{\text {persp }}M_{\text {ortho }} M_{\text {persp } \rightarrow \text { ortho }} \left[\begin{array}{cccc} \frac{2}{r-l} 0 0 -\frac{rl}{r-l} \\ 0 \frac{2}{t-b} 0 -\frac{tb}{t-b} \\ 0 0 \frac{2}{n-f} -\frac{nf}{n-f} \\ 0 0 0 1 \end{array}\right] \left[\begin{array}{cccc} n 0 0 0 \\ 0 n 0 0 \\ 0 0 nf -nf \\ 0 0 1 0 \end{array}\right] \left[\begin{array}{cccc} \frac{2n}{r-l} 0 \frac{rl}{l-r} 0 \\ 0 \frac{2n}{t-b} \frac{tb}{b-t} 0 \\ 0 0 \frac{nf}{n-f} -\frac{2nf}{n-f} \\ 0 0 1 0 \end{array}\right] Mpersp ​Mortho ​Mpersp → ortho ​ ​r−l2​000​0t−b2​00​00n−f2​0​−r−lrl​−t−btb​−n−fnf​1​ ​ ​n000​0n00​00nf1​00−nf0​ ​ ​r−l2n​000​0t−b2n​00​l−rrl​b−ttb​n−fnf​1​00−n−f2nf​0​ ​ 此时投影矩阵就算推导完毕但是投影接口的参数是张角 f o v fov fov,纵横比 a s p e c t aspect aspect,近平面到原点的距离 n e a r near near,远平面到原点的距离 f a r far far 下面将矩阵中的参数都转为接口中的入参: 一般情况下长方体视窗体是轴对称故有 l − r , b − t l-r,b-t l−r,b−t,由于从原点看向 − z -z −z方向看去所以 n − n e a r , f − f a r n-near,f-far n−near,f−far w r − l , h t − b , t a n ( f o v 2 ) h / 2 n e a r , a s p e c t w h , wr-l,\\ ht-b,\\ tan(\frac{fov}{2})\frac{h/2}{near},aspect\frac{w}{h}, wr−l,ht−b,tan(2fov​)nearh/2​,aspecthw​, 故 h 2 ∗ n e a r ∗ t a n ( f o v 2 ) w h ∗ a s p e c t 2 ∗ n e a r ∗ t a n ( f o v 2 ) ∗ a s p e c t h2*near *tan(\frac{fov}{2})\\ wh*aspect2*near *tan(\frac{fov}{2})*aspect h2∗near∗tan(2fov​)wh∗aspect2∗near∗tan(2fov​)∗aspect 化简后 M persp  [ − 1 a s p e c t ∗ t a n ( f o v 2 ) 0 0 0 0 − 1 t a n ( f o v 2 ) 0 0 0 0 n e a r f a r n e a r − f a r 2 ∗ n e a r ∗ f a r n e a r − f a r 0 0 1 0 ] M_{\text {persp }}\left[\begin{array}{cccc} -\frac{1}{aspect*tan(\frac{fov}{2})} 0 0 0 \\ 0 -\frac{1}{tan(\frac{fov}{2})} 0 0 \\ 0 0 \frac{nearfar}{near-far} \frac{2*near*far}{near-far} \\ 0 0 1 0 \end{array}\right] Mpersp ​ ​−aspect∗tan(2fov​)1​000​0−tan(2fov​)1​00​00near−farnearfar​1​00near−far2∗near∗far​0​ ​ 这个结果和glm库中实现不同 templatetypename TGLM_FUNC_QUALIFIER mat4, 4, T, defaultp perspectiveRH_NO(T fovy, T aspect, T zNear, T zFar){assert(abs(aspect - std::numeric_limitsT::epsilon()) static_castT(0));T const tanHalfFovy tan(fovy / static_castT(2));mat4, 4, T, defaultp Result(static_castT(0));Result[0][0] static_castT(1) / (aspect * tanHalfFovy);Result[1][1] static_castT(1) / (tanHalfFovy);Result[2][2] - (zFar zNear) / (zFar - zNear);Result[2][3] - static_castT(1);Result[3][2] - (static_castT(2) * zFar * zNear) / (zFar - zNear);return Result;}都是右手坐标系为什么不同呢博客对此进行了解释。主要由于glm 是基于 n , f n,f n,f都是正值进行推导的同时glm的透视投影中还进行了NDC坐标转换而NDC坐标系是左手坐标系。 完整代码如下 constexpr double MY_PI 3.1415926;inline double DEG2RAD(double deg) { return deg * MY_PI / 180; } Eigen::Matrix4f get_model_matrix(float rotation_angle) {Eigen::Matrix4f model Eigen::Matrix4f::Identity();double rad DEG2RAD(rotation_angle);model cos(rad), -sin(rad), 0, 0,sin(rad), cos(rad), 0, 0,0, 0, 1, 0,0, 0, 0, 1;return model; }Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,float zNear, float zFar) {Eigen::Matrix4f projection Eigen::Matrix4f::Identity();double rad DEG2RAD(eye_fov/2);projection -1/(aspect_ratio * tan(rad)),0, 0, 0,0, -1/tan(rad), 0, 0,0, 0, (zNearzFar) /(zNear - zFar), 2*zNear*zFar/(zNear - zFar),0, 0, 1, 0;return projection; }参考文献 OpenGL NDC 左手还是右手 Games101中的透视矩阵和glm::perspective的关系
http://www.w-s-a.com/news/28671/

相关文章:

  • google网页版入口seo索引擎优化
  • 东乡做网站常州网络公司联系方式
  • 做网站激励语家居装饰网站设计论文
  • 镜像的网站怎么做排名无极网站建设质量
  • 奉贤集团公司网站建设小工具文本wordpress
  • 不用代码做网站网站建设和运行费用
  • 阜阳网站开发招聘网站建设合作协议申请
  • 电子配件 技术支持 东莞网站建设wordpress 生成html代码
  • 网站用免费空间好不好网站建设的视频
  • 网站开发项目职责门户资源分享网站模板
  • 建网站需要什么语言如何做二维码跳转到网站
  • 天津建设交培训中心网站做网站起名字
  • 黑河北京网站建设湛江市住房和城乡建设局网站
  • 网站建设拾金手指下拉十九企业查询官网
  • 邢台提供网站建设公司哪家好五合一建站
  • 京东网站设计代码驻马店做网站的公司
  • 织梦网站模板使用教程福州网站建设工作
  • 做网站要准备的需求asp 网站后台
  • 滨州网站开发公司中立建设集团有限公司网站
  • 泰安建设厅网站做网站为什么要建站点
  • 有什么好的手机推荐网站创建网站需要哪些工作
  • 网站能给企业带来什么上饶市网站建设公司
  • 学做网站卖东西去哪学南宁网站建设gxjzdrj
  • 欧美网站建设案例网站开发 男生
  • 网站正在开发中做电子元器件的网站
  • 做网站搭建的公司中国建设银行官网站u盾证书
  • 大连哪里有手机自适应网站建设公司网站介绍模板 html
  • 佛山模板建站宣传片制作公司电话
  • 文字网站居中能自己做网站接业务吗
  • 免备案自助建站网站广州珈瑶公司是哪一年注册的