要把一个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. MySQL 通用查询日志和慢查询日志分析

    MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句.2)慢查询 ...

  2. IDEA安装以及项目初始化

    首先安装idea: 如果15.0版本安装不上就安装16.0: 点击安装文件以后,一直点下一步就可以了. 安装完成后设置: 如果没有的话,需要点击SDKs,点击+,然后选择电脑上安装的JDK. 接下来创 ...

  3. C#+GDAL读写文件

    读取shp文件: private void btnBrower_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFil ...

  4. C#字母转换成数字/数字转换成字母 - ASCII码转换

    字母转换成数字 byte[] array = new byte[1];   //定义一组数组arrayarray = System.Text.Encoding.ASCII.GetBytes(strin ...

  5. Windows Server 2008 R2(X64) MSDN镜像简体中文版与英文版ISO下载及Key激活码

    Windows Server 2008 R2 MSDN ISO镜像简体中文版 文件名:cn_windows_server_2008_r2_standard_enterprise_datacenter_ ...

  6. redis客户端hiredis

    Hiredis 在官网 http://redis.io/clients 中有说明This is the official C client. Support for the whole command ...

  7. 什么是API测试

    什么是API API是Application Programming Interface的简写. 实现了两个或多个独立系统或模块间的通信和数据交换能力. 什么是API测试 图片.png API测试是不 ...

  8. javascript-复制

    cefCopy:function(str){ var t=this; if(!str || str=="暂无激活码") { $.notice("暂无激活码", ...

  9. #C++初学记录(素数判断)

    练习题目二 素数判断 A prime number is a natural number which has exactly two distinct natural number divisors ...

  10. Qml应用程序的性能考虑与建议

    本文翻译自Qt官网文档: http://doc.qt.io/qt-5/qtquick-performance.html QtQml应用程序的性能考虑与建议 1.时间考虑 作为一名程序开发者,应该努力使 ...