要把一个3d物体呈现在屏幕上,要经过一系列的步骤。

  • 描述3d世界
  • 把3d世界绘制在二维屏幕上

如何描述一个3D世界?

  • 数学家早就给出了3D世界的模型,我们日常最熟悉的3维坐标系就是一个欧几里得空间(线性空间)。
  • 在空间中分为两类对象:静态的物体,物体的运动
  • 静态的对象用 向量 表示,运动用 矩阵 表示

齐次坐标

欧几里得空间并不能充分的描述3d世界,数学家扩展了一下,出来个仿射空间。仿射空间里面的坐标叫做 齐次坐标

物体对象的运动-【模型矩阵】

一个正方体,我们知道8个顶点的信息就可以描述(即8个向量)。 把这个正方体从一个位置,移动另外一个位置, 我们只需要算出这8个顶点的新的坐标就可以了。

我们知道这是一个方程组,我们要解方程才能算出新的坐标。伟大的数学家们,发明了矩阵来解方程。

所以,矩阵是描述模型变化的。实际上就是解方程组

视图矩阵

我们描述物体都是以原点(0,0,0)点 为参考。然而实际上,我们是从摄像机来看世界的。 也就是说要以摄像机的那一点来确定一个坐标系。所有物体的坐标要转化成相对于 摄像机那点为原点的新的坐标系

要确定新的坐标系,需要几个参数,这几个参数也正好是描述摄像机的参数。

1.摄像机的位置

2.摄像机的观察点

3.摄像机的上方向(正着看,倒着看,斜着看)

这样我们会得到两个向量,一个观察点=>位置 一个上方向。 这两个向量的叉积 会得到垂直面这两个方向的法向量。

设M矩阵表达原坐标系到新坐标系的转化。那么就相当于 原世界中所有的物体左乘M的逆矩阵。

这样,3d世界就被描述了。接下来,怎么把这3d世界绘制到二维的屏幕上

投影矩阵-【透视投影】

透视投影是稍复杂的一种投影方法,并且用的越来越平凡,因为它创造了距离感,因此会生成更逼真的图像。从几何上说,这种方法与正交投影不同的地方在于透视投影的视域体是一个平截头体——也就是,一个截断的金字塔,而不是一个轴对称盒子

在这个图中,你从点(x, y, z)到原点画了条直线,注意直线与z=n平面相交的那个点——用黑色标记的那个

这样的投影 就会造成距离感,Z轴就聚有深度的作用。

视锥体(红色区域)以外的所有物体不会被呈现。这样形成的空间叫 裁剪空间


  

3d世界是怎样呈现到屏幕上的的更多相关文章

  1. IOS UIView 01-View开始深入 绘制像素到屏幕上

    注:本人是翻译过来,并且加上本人的一点见解. 前言 一个像素是如何绘制到屏幕上去的?有很多种方式将一些东西映射到显示屏上,他们需要调用不同的框架.许多功能和方法的结合体.这里我们大概的看一下屏幕之后发 ...

  2. 第1部分: 游戏引擎介绍, 渲染和构造3D世界

    原文作者:Jake Simpson译者: 向海Email:GameWorldChina@myway.com ---------------------------------------------- ...

  3. NeHe OpenGL教程 第十课:3D世界

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. DirectX 11---从空间变换来看3D场景如何转化到2D屏幕

    DirectX 11---从空间变换来看3D场景如何转化到2D屏幕 在看<Introduction to 3D Game Programming with DirectX 11>的时候,发 ...

  5. 向 3D 世界迈出一小步

    前言 OpenGL 的学习资料很多,一个是比较著名的 OpenGL 红宝书<OpenGL 编程指南>,可以在这里 http://opengl-redbook.com/ 下载该书配套的源代码 ...

  6. 第10课 OpenGL 3D世界

    加载3D世界,并在其中漫游: 在这一课中,你将学会如何加载3D世界,并在3D世界中漫游.这一课使用第一课的代码,当然在课程说明中我只介绍改变了代码. 这一课是由Lionel Brits (βtelge ...

  7. Unity3D之如何创建正确的像素比在屏幕上

    关于这篇文章的命名,实在不知道怎么命名好,大概功能就是:比如一张宽高为100x100的图片显示在屏幕上,那2D摄像头的Size值为多少时,屏幕上显示出来图片大小和图片的实际像素一致. 这里涉及到一个G ...

  8. 【Stage3D学习笔记续】真正的3D世界(六):空间大战

    这就是书上的最终效果了,一个完整的空间大战游戏: 点击查看源码 这里并没有太多的新知识,所涉及的东西更多的是游戏开发方面的优化和技巧,下面我们大家一起来看看: 飞船: 类似粒子效果中的粒子创建方法,我 ...

  9. 【Stage3D学习笔记续】真正的3D世界(二):显示模型

    虽然我们进入真3D世界了,但是上一章的Demo仍然是显示的一个平面,尽管我们的平面在3D空间中旋转可以看出一点3D透视的效果,但是既然是真3D,就要拿出点3D的样子来! 如果要显示3D模型,我们就要告 ...

随机推荐

  1. Day06 DOM4J&schema介绍&xPath

    day06总结 今日内容 XML解析之JAXP( SAX ) DOM4J Schema   三.XML解析器介绍   操作XML文档概述   1 如何操作XML文档 XML文档也是数据的一种,对数据的 ...

  2. mysql 数据操作 单表查询 having 过滤 练习

    1. 查询各岗位内包含的员工个数小于2的岗位名.岗位内包含员工名字.个数 mysql> select post,group_concat(name),count(id) from employe ...

  3. 005-ant design -结合echart

    原因: ant design本省提供图标组件,是基于 BizCharts ,但是使用有些限制比如:TimelineChart带有时间轴的图表.使用 TimelineChart 组件可以实现带有时间轴的 ...

  4. java-mybaits-010-mybatis-spring-使用 SqlSession、注入映射器

    一. SqlSession概述 在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession.一旦你获得一个 session 之后,你可以使用它来执行映射语句, ...

  5. [WorldWind学习]19.WebDownload

    using System; using System.Diagnostics; using System.Globalization; using System.Net; using System.I ...

  6. 比特股-去中心化交易所, STEEM - 去中心化社区, EOS - 下一代智能合约

    libsnark 是实现了 zkSNARK 模式的 C++ 库.zkSNARK 是一个证明/验证计算完整性的加密方法,也即零知识验证的算法, https://github.com/scipr-lab/ ...

  7. [转]AJAX 跨源 HTTP 请求

    转自OSChina, 原文: http://www.oschina.net/translate/ajax-cross-origin-http-request 背景 跨源HTTP请求(也称跨域AJAX请 ...

  8. EF Code First学习笔记:数据库创建(转)

    控制数据库的位置 默认情况下,数据库是创建在localhost\SQLEXPRESS服务器上,并且默认的数据库名为命名空间+context类名,例如我们前面的BreakAway.BreakAwayCo ...

  9. 微信小程序:全局配置app.json

    微信小程序:全局配置app.json 一.全局配置app.json app.json文件用来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. 以下是一个包 ...

  10. 上传jar包至nexus

    上传命令: mvn deploy:deploy-file -DgroupId=com.xxx -DartifactId=xxx-pdf -Dversion=16.10.0 -Dpackaging=ja ...