3D数学基础_02

接上一篇

 

6: 几何图元

几何图元就是指点, 线, , 体之类.

这个没什么特别好说的. 主要需要注意两个缩写:

AABBOBB. 它们都是指矩形边框,

AABB axially aligned bounding box.  沿着坐标轴的矩形框

OBB oriented bounding box. 任意方向的矩形框

(作几何检测的时候, 有时候按照AABBOBB分成两类. 知道是什么东西就可以, 别被缩写骗了. 不知道是什么的时候, 觉得玄乎玄乎还挺神秘的, 知道了以后, 原来就是四方块…)

几何检测的几种方式。其中的(a),(b),(c)比较常用。

 

7: 3D模型

3D模型主要包括三类: 多边形网格模型, 曲面模型和离散模型. 其中, 在游戏中应用最广泛的是多边形网格. 而由于OpenGLDirect3D都使用三角形为最基本的图形单元, 所以我们只讨论三角形与三角网格.

一组相连的三角形称为三角网格.

3D数学中三角形有正面和反面, 并且拥有一条法线. 三角形的正面是其法线伸出的方向.

三角形的优点:只有三个顶点且不可被拆分. 一个三角形一定处于同一个平面中. 其他多变形都可能处于不同平面. 所有其他多边形都可以使用三角形来表示.

 

 

 

 三角形顶点的顺序十分重要. 而且左手坐标系和右手坐标系中, 它们的顺序也不尽相同. 如果手动指定了3个顶点, 但是没有显示对应的三角形. 那么很有可能是它们的顺序不对. 这时候你需要确认一下系统的坐标系和顶点的位置和顺序.

 

三角网格中因为存在大量重复使用的顶点, 所以一般常用索引三角网格方式来进行描述.

在索引三角网格中, 需要维护两个列表: 顶点(Vertex)表和三角形的索引(Index).

其中:

  A: 每个顶点必须包括一个3D位置. 可选包括纹理坐标, 表面法向量, 光照值等可选数据.

  B: 三角形索引表包含构成三角形的索引. 所以索引是三个一组出现.

 

 

这是一个普通的立方体模型. 它有8个顶点和6个面. 每个面都是四方形, 一个四方形由2个三角形构成. 所以它有12个三角形.

如果采用纯顶点方式, 那么它需要保存 12 * 3 = 36个顶点数据.

如果采用索引三角网格方式, 那么它需要保存8个顶点, 36个索引. 之后的文章中我会介绍典型的顶点和索引定义. 通常索引只是一个4字节整数, 而顶点可能包含多个数据(一般超过20个字节). 那么, 在渲染时, 动则需要向GPU传递几万个点信息的情况下, 使用索引是非常经济的选择.

 

 

 

8: 一个典型的图形管道

最后, 介绍一个典型的现代图形管道(pipe line).

主要通过数据流来介绍管道的各个部分.

这只是一条理论上的管道, 之后会介绍DirectX9的缺省pipe line(一个具体的例子.)

当然, 大家会发现, 它们之间还是非常相似的.

  A: 建立场景. 在开始渲染之前, 首先需要设置整个场景. 比如相机的位置, 方向. 视锥(可视范围), 环境光照, 雾化参数. 渲染的输出视图窗口等.

 

 

视锥 

 

 

  B: 可见性检测. 当选定好相机, 指定了视锥参数以后, 就可以决定那些物体是可见的, 那些是不可见的. 根据这些信息, 我们可以去掉那些不可见的物体. 因为计算并渲染看不见的东西是在浪费时间.

  C: 设置物体的渲染状态. 主要是物体的纹理属性.

  D: 几何体的生成与提交. 这一步是向3D API提交几何体. 通常提交的数据是各种三角形或者三角网格.

  E: 变换与光照. 几何体数据传递完成之后, 就可以计算顶点光照. 通常有四种形式的光: 环境光, 直线光, 点光, 锥形光. 物体上可以漫反射, 镜面反射照射过来的光线. 物体也可以自发光. (通常自发光的属性在物体材质中设置.)

点光

直线光

直线光

 

探照灯形光

锥形光

  

 

 

 

  F: 背面剔除与裁减(3D). 背对相机的面会被剔除(背面剔除). 因为它们不可见. 三角形在视锥外的部分也会被剔除, 同样因为它们不可见. 这是3D空间中的裁减. 不过这种裁减可能导致多边形出现.

  G: 投影到屏幕空间与裁减(2D) 之后, 3D世界中的几何体会被投影到2D屏幕空间中. 之后, 屏幕显示范围以外的部分会被裁减掉(2D裁减). 这种裁减相比之下简单易行. 但是必须在投影运算之后进行。

 

 

 

 

  H: 光栅化. 当完成多边形到屏幕的转换之后, 就进入光栅化阶段. 光栅化指根据投影过来的几何信息, 那些象素需要被绘制. 很多图形学的核心算法在这里体现. 比如抗锯齿等. 不过因为大多是硬件实现, 所以这里不具体讨论. 只要知道它是一个很复杂且重要的过程即可. 

 

数学世界中的图形 转换到 屏幕上的像素点

 

  I: 象素着色. 最后, 在图形管道的最后阶段, 计算各个象素的颜色值. 这个过程叫做着色.材质的颜色, alpha混合, 深度buffer都在这里应用. 而且在现代显卡上, 这一步是可以编程的. DirectX中叫做Pixel Shader, OpenGL中叫做Fragment Shader. 它们中可以包含一些复杂的算法. 而现在各种华丽的效果基本都通过它们实现. 比如HDR, 卡通渲染等等.

 

 

 

 

 

一个HDR和卡通渲染出来的茶壶. 可以虽然是同样的模型, 但他们的表现方式却可以千差万别.而这都是通过着色来实现的.

另外, 学习3D的人应该已经发现, 茶壶是出现频率非常高的一种物体, 基本快赶上立方体了不知道大家有没有想过原因?:)

 

------------------------- 3D数学原理 完 ------------------------- 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值