跳转至

三维模型的表示

三维模型的网格由一组顶点和一组索引组成:

  • 顶点: 组成网格的点, 包括坐标/颜色/法向量/纹理坐标等信息.
  • 索引: 说明了哪些顶点构成一个面. 假设图元为三角形, 那么索引就是三个数字一组.

这两部分数据从模型文件中读取出来, 并存放在顶点缓冲区(vertex buffer)和索引缓冲区(index buffer). 这两个缓冲区的数据将被提交给渲染器用于绘制图像.
顶点缓冲区的数据布局可以自定义, 所以在这之前还需要告知 GPU 如何解析顶点缓冲区中的数据.
用于描述数据布局的信息称为顶点属性, 能声明的顶点属性是有上限的, 一般由硬件决定. 这部分数据将在绘制时提交给着色器处理.

OBJ 文件格式

了解 OBJ 文件格式有利于理解 3D 模型的表示方式.
每行由关键字和数据组成.
关键字主要有:

  • v: 顶点坐标, 数据为三个浮点数, 分别表示 x, y, z 坐标.
  • vn: 顶点法向量, 数据为三个浮点数, 表示法向量.
  • vt: 顶点材质坐标, 数据为两个浮点数, 表示材质的 U, V 坐标.
  • f: 面

    数据格式为 顶点索引/顶点材质坐标索引/顶点法向量索引 重复三组, 分别表示组成三角形的三个顶点.
    顶点材质坐标索引和顶点法向量索引可以为空.
    索引从 1 开始, 可以为负数, 比如 -1 表示最后一个元素.

三角形:

o triangle

v 0.0  0.5  0.0 # 顶点 1, 坐标为 ( 0,   0.5, 0), 位于中上方
v -0.5 -0.5 0.0 # 顶点 2, 坐标为 (-0.5, 0.5, 0), 位于左下方
v 0.5  -0.5 0.0 # 顶点 3, 坐标为 (0.5, -0.5, 0), 位于右下方

f 1 2 3 # 顶点 1, 2, 3 连线, 构成一个三角形的面

立方体:

o cube

v 0.0 0.0 0.0
v 0.0 0.0 1.0
v 0.0 1.0 0.0
v 0.0 1.0 1.0
v 1.0 0.0 0.0
v 1.0 0.0 1.0
v 1.0 1.0 0.0
v 1.0 1.0 1.0

vn  0.0  0.0  1.0
vn  0.0  0.0 -1.0
vn  0.0  1.0  0.0
vn  0.0 -1.0  0.0
vn  1.0  0.0  0.0
vn -1.0  0.0  0.0

f 1//2 7//2 5//2
f 1//2 3//2 7//2 
f 1//6 4//6 3//6 
f 1//6 2//6 4//6 
f 3//3 8//3 7//3 
f 3//3 4//3 8//3 
f 5//5 7//5 8//5 
f 5//5 8//5 6//5 
f 1//4 5//4 6//4 
f 1//4 6//4 2//4 
f 2//1 6//1 8//1 
f 2//1 8//1 4//1

可以将上方数据保存为 obj 文件并使用 3D 查看器查看.

可以看出, 在指定面的构成时, 每个顶点被赋予了一个法向量, 也间接的为每个面指定了三个法向量.
在绘制面的过程中, 可以通过对三个法向量进行插值来获得当前像素的法向量, 绘制出平滑的曲面.

详情请参考法向量.

参考

评论