您的位置:首页 > 运维架构

OpenGL学习之路(五)

2016-05-23 00:39 302 查看

1 引子

不知不觉我们已经进入到读书笔记(五)了,我们先对前四次读书笔记做一个总结。前四次读书笔记主要是学习了如何使用OpenGL来绘制几何图形(包括二维几何体和三维几何体),并学习了平移、旋转、缩放坐标变换矩阵的理论推导和实践应用。

这一次读书笔记,我们一起来学习OpenGL中常用的坐标系以及坐标变换。在OpenGL中有几个坐标系,初学者常常被它们搞得晕头转向:为什么需要这些坐标系?各个坐标系有什么作用?……本文就来学习一下这些OpenGL中常用坐标系。

之后来看看投影矩阵的推导,投影变换矩阵比较特殊,不能通过平移、旋转、缩放变换得到。投影分为简单的正交投影和复杂一些的透视投影,我们都将逐一进行推导。最后展示一下透视投影的显示效果,以供大家参考。

三维图形绘制和二维最大区别就是坐标变换变得更复杂了。在三维中,理解好坐标、坐标系(坐标空间)以及坐标变换之类知识点不是很容易的,楼主也是花了不少时间才大致有所理解。不过呢,如果线性代数、线性变换之类学的比较好的童鞋,理解三维坐标变换应该很简单——他们都是牛人。其实理解了之后,也就是那么回事(先藐视它一下吧!)。好了,废话也不多说了,下面我们正式踏上OpenGL学习之路——第五站。

#include "Camera.h"
#include <cmath>
#include <iostream>

Camera::Camera(void)
{}

Camera::~Camera(void)
{}

Matrix4X4 Camera::createProjectMatrix() const
{
double dHalfHeight = m_dNearClipDistance * std::tan(m_dFOVy * 0.5 * PI / 180);
double dHalfWidth = m_dAspectRatio * dHalfHeight;

Matrix4X4 matProject;
matProject.m[0][0] = m_dNearClipDistance / dHalfWidth;
matProject.m[1][1] = m_dNearClipDistance / dHalfHeight;
matProject.m[2][2] = -(m_dFarClipDistance + m_dNearClipDistance)
/ (m_dFarClipDistance - m_dNearClipDistance);
matProject.m[2][3] = 2 * m_dFarClipDistance * m_dNearClipDistance
/ (m_dFarClipDistance - m_dNearClipDistance);
matProject.m[3][2] = -1.0;
matProject.m[3][3] = 0;

return matProject;
}

void Camera::setFarClipDistance( double dFarClipDistance )
{
m_dFarClipDistance = dFarClipDistance;
}

double Camera::getFarClipDistance() const
{
return m_dFarClipDistance;
}

void Camera::setNearClipDistance( double dNearClipDistance )
{
m_dNearClipDistance = dNearClipDistance;
}

double Camera::getNearClipDistance() const
{
return m_dNearClipDistance;
}

void Camera::setFOVy( double dFOVy )
{
m_dFOVy = dFOVy;
}

double Camera::getFOVy() const
{
return m_dFOVy;
}

void Camera::setAspectRatio( double dAspectRatio )
{
m_dAspectRatio = dAspectRatio;
}

double Camera::getAspectRatio() const
{
return m_dAspectRatio;
}


View Code
另外,如果需要源代码的童鞋,也可以自行去百度云盘下载:http://pan.baidu.com/s/1pLVab1L。(读书笔记(五))

4 总结

本文主要是对前几篇博文的总结,同时对投影变换矩阵做了推导,至此,三维坐标矩阵变换部分应该是告一段落了。从下一篇文章开始,我们将介绍3ds文件的载入与显示,当然也会用到矩阵变换的知识,敬请期待!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: