博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opengl 教程(12) 投影矩阵
阅读量:6679 次
发布时间:2019-06-25

本文共 1579 字,大约阅读时间需要 5 分钟。

原帖地址:

 

     现在我们开始学习如何把三维物体投影到二维平面上,同时保持它的深度。通常的投影包括平行投影和透视投影:平行投影比较简单,就是把顶点垂直的投向投影平面,常用在cad或者机械制图中。另外一种投影是透视投影,这种投影能较好的使二维投影显示立体感,因为人眼观看物体符合透视原理,透视原理也是学美术的人的必修课程。最常见的透视原理表现形式就是三维世界的平行线在透视几何中是相交的,它们的交点叫做灭点,比如我们观察平行的马路,在远处会发觉它们越来越靠近,直至相交在一起。

      本教程我们将产生投影变化矩阵,所谓投影矩阵,就是把视觉空间的frustum(视锥体)投影到一个长方体中,这需要我们提供四个参数:

  1. 投影区域(四边形)的宽高比。
  2. 摄像机观察垂直视角的大小。
  3. 近z平面到视点的距离。
  4. 远z平面到视点距离。 

 

推导投影矩阵的过程见我转贴的另外一篇文章,比本教程原文还要详细:

最终的投影矩阵为:

其中ar为投影平面(四边形)的宽高比,alpha为垂直观察视角,NearZ,FarZ为近z和远z平面。

      投影矩阵乘以顶点位置,这时得到的顶点坐标就为裁剪空间,再经过透视除法后,就是所谓的归一化裁剪空间。前面的教程中,我们没有做任何投影变化,直接在裁剪空间定义顶点,进行操作。

      主要变化代码,增加了一个初始化透视矩阵的函数,该函数会根据传入的参数宽高比、垂直视角、近z平面和远z平面值计算出透视矩阵。

void Pipeline::InitPerspectiveProj(Matrix4f& m) const>
{
const float ar = m_persProj.Width / m_persProj.Height;
const float zNear = m_persProj.zNear;
const float zFar = m_persProj.zFar;
const float zRange = zNear - zFar;
const float tanHalfFOV = tanf(ToRadian(m_persProj.FOV / 2.0));
m.m[0][0] = 1.0f / (tanHalfFOV * ar);
m.m[0][1] = 0.0f;
m.m[0][2] = 0.0f;
m.m[0][3] = 0.0f;
m.m[1][0] = 0.0f;
m.m[1][1] = 1.0f / tanHalfFOV;
m.m[1][2] = 0.0f;
m.m[1][3] = 0.0f;
m.m[2][0] = 0.0f;
m.m[2][1] = 0.0f;
m.m[2][2] = (-zNear - zFar) / zRange;
m.m[2][3] = 2.0f * zFar * zNear / zRange;
m.m[3][0] = 0.0f;
m.m[3][1] = 0.0f;
m.m[3][2] = 1.0f;
m.m[3][3] = 0.0f;
}

定义了一个结构来保存透视投影参数。

struct {

    float FOV;
    float Width;
    float Height;
    float zNear;
    float zFar;
} m_persProj;

最终计算变化矩阵时候,会乘上投影矩阵,注意乘的顺序,位置向量在最右边,是列向量

m_transformation = PersProjTrans * TranslationTrans * RotateTrans * ScaleTrans;

在渲染函数中,我们增加了设置透视矩阵函数的调用

p.SetPerspectiveProj(30.0f, WINDOW_WIDTH, WINDOW_HEIGHT, 1.0f, 1000.0f);

程序执行后的界面如下:

转载地址:http://xjyao.baihongyu.com/

你可能感兴趣的文章
TCTF:鹅厂的“黑客游戏”上线
查看>>
Kief Morris:实现基础设施即代码
查看>>
《Drupal实战》——2.3 为图书添加对应的字段
查看>>
《Android和PHP开发最佳实践》一1.4 小结
查看>>
光伏发电与“鸭子曲线”
查看>>
博鳌直击 | 业界大佬激辩金融科技:互联网金融并不是翻牌就可以叫Fintech
查看>>
Amdocs将成为AT&T ECOMP平台的集成商
查看>>
热带地区数据中心需要太阳能发电,而不是自然冷却
查看>>
炙手可热的威胁情报!飞塔已应用了15年
查看>>
2015年度互联网安全报告发布 移动支付成重灾区
查看>>
数百亿美元半导体设备投资 如何避免被海外大厂瓜分?
查看>>
黑客测试有望提高智能家居安全性?
查看>>
思科推NCS4200家族 与Ciena竞争Verizon城域订单
查看>>
易成新能28亿驰援赛维破产重整 试水另类“债转股”
查看>>
医疗信息安全马虎不得
查看>>
智慧城市需依托社会共建
查看>>
中国首个LTE IoT多模外场测试启动 多模成物联网时代主旋律
查看>>
ARM 发布最新高端移动技术,提升沉浸式体验
查看>>
台积电签约南京拼抢大陆市场
查看>>
工业物联网 通用联手华为造起来!
查看>>