计算机图形学----投影矩阵

投影矩阵概述

在得到相机坐标后,就相当于得到了人眼观察世界中物体的坐标,但是我们需要把物体映射到一个二维平面上用于显示,投影矩阵就起到把三维坐标映射到二维坐标的作用,同时因为三维空间有深度的概念,因此把Z轴转化成深度。W作为一个系数,用于检测是否超出窗口范围。

投影变换最终的效果是把各个坐标映射到 [ − 1 , 1 ] [-1,1] [1,1]之间,然后再乘以相应的屏幕高度和宽度,得到最终的屏幕坐标。 [ − 1 , 1 ] [-1,1] [1,1]的坐标又成为NDC坐标

推导过程参照:http://www.songho.ca/opengl/gl_transform.html ,一般直接套公式使用即可。

透视投影

M p r o j e c t i o n = [ 2 n r − l 0 r + l r − l 0 0 2 n t + b t − b 0 0 0 − f + n f − n − 2 f n f − n 0 0 − 1 0 ] \bf{M}_{projection}= \begin{bmatrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0\\ 0 & \frac{2}{n} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2fn}{f-n} \\ 0 & 0 & -1 & 0 \end{bmatrix} Mprojection=rl2n0000n200rlr+ltbt+bfnf+n100fn2fn0
n是近平面距离,f是远平面距离。l、r、t、b分别是左右上下
此时变换完成后,还不是NDC坐标,需要每个坐标乘以 w w w分量才行,下面的操作:
[ x c l i p y c l i p z c l i p w c l i p ] = M p r o j e c t i o n [ x e y e y e y e z e y e w e y e ] \begin{bmatrix} x_{clip}\\y_{clip}\\z_{clip}\\w_{clip} \end{bmatrix}=\bf{M}_{projection}\begin{bmatrix} x_{eye}\\y_{eye}\\z_{eye}\\w_{eye} \end{bmatrix} xclipyclipzclipwclip=Mprojectionxeyeyeyezeyeweye
其中,eye表示相机坐标,clip表示初步映射的坐标。

之后,再除以 w w w分量,得到NDC坐标:
[ x n d c y n d c z n d c ] = [ x c l i p / w c l i p y c l i p / w c l i p z c l i p / w c l i p ] \begin{bmatrix} x_{ndc}\\y_{ndc}\\z_{ndc} \end{bmatrix}= \begin{bmatrix} x_{clip}/w_{clip}\\y_{clip}/w_{clip}\\z_{clip}/w_{clip} \end{bmatrix} xndcyndczndc=xclip/wclipyclip/wclipzclip/wclip
如果NDC不在[-1,1],表示超出屏幕范围,不能显示。

正交投影

正交投影的基本步骤是一致的,只是变换矩阵不同:
[ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 − 2 f − n − f + n f − n 0 0 0 1 ] \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & -\frac{2}{f-n} & -\frac{f+n}{f-n} \\ 0 & 0 & 0 & 1 \end{bmatrix} rl20000tb20000fn20rlr+ltbt+bfnf+n1

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程解决的问题: 作为游戏行业或者图形学从业者,你是否面临以下问题: 到底openGL底层如何实现的? 到底矩阵操作变换是怎么做到的? 到底光栅化的算法以及原理是什么? 到底如何才能从3D世界投射到2D屏幕呢? 图形学有这么多的矩阵操作,到底如何推导如何应用呢? 学完这门课程,你应该就可以从底层了解一个初级的openGL图形接口如何实现,图形学最底层的封装到底面临哪些挑战;跟随我们一行一行写完代码,你就会得到一个迷你版本的openGL图形库,你可以深度体会图形从模型变换,观察矩阵变换,投影矩阵变换一直到光栅化纹理操作的全套模拟流程。 课程介绍: 本课程将带领学员不使用任何图形库,实现从0到1的图形学接口封装以及算法讲解,并且带领大家手敲代码,一行一行进行实现。 涵盖了(环境搭建,绘制点,Bresenham算法绘制完美直线,三形拆分绘制算法,颜色插值算法,图片操作,图片二次插值放缩算法,纹理系统接口搭建及封装,矩阵操作理论以及实践,openGL类似接口封装,3D世界的图形学理论及接口封装等) 最终将带领大家通过C++实现一个3D世界的图形接口,方便所有人入门图形学,进行接下来的openGL接口以及GPU编程的学习   本课程为系列课程的第一步入门,且带领所有人进行实现,更加实用,可以让大家打牢图形学的基础知识及编程技能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值