地震2 md2文件格式(理论)

时间:2009-11-18 21:58:06

标签: c++ c opengl

我正在尝试在opengl中加载md2文件,但我注意到大多数示例程序只使用

预编译的法线列表。像这样......

//table of precalculated normals  
{ -0.525731f,  0.000000f,  0.850651f },   
{ -0.442863f,  0.238856f,  0.864188f },   
{ -0.295242f,  0.000000f,  0.955423f },   
{ -0.309017f,  0.500000f,  0.809017f },   
...  
... 

好吧这可能听起来很愚蠢,但我认为每个模型都是由不同的三角形组成,那么你怎么可能使用一组预编译法线来渲染所有模型呢? 这看起来很奇怪,任何想法都会受到赞赏。

3 个答案:

答案 0 :(得分:9)

您可以使用预编译的法线表,并使用查找表为特定情况选择“足够好”的表。每个三角形都在一个不同的平面上,而那个平面有一个法线,而不是三角形本身。

例如,让我们想象一下我们有一个观点。为了讨论的目的,将该点扩展为一个球体,使其在概念上更容易掌握。如果在y轴上围绕该球体绘制一个完美的圆,则每次将x轴上的圆圈旋转1度,最终会得到360个圆圈。如果您沿着每个圆圈以1度间隔取正常值,则最终会得到360 ** 2个点。从那里,你的法线是从球体中心到球体上的那个点的矢量,它是与球体上的点相切构造的平面的法线。如果你为那个球体上的每个点计算这两个,你最终得到的是一个预先计算的法线表,对于大多数情况来说几乎肯定是足够好的。现在您只需要为该数据设计查找方案(平面 - >正常)。

答案 1 :(得分:6)

已经回答了,但我想对此有所了解。

该表包含非常均匀地覆盖单位球体表面的矢量。似乎162个向量的集合是subdivided icosahedron的角落。这样做是为了将单位长度的3D矢量有损压缩到索引(8位),参见vector quantization。对于存储任意法向量,您可以在表中搜索最接近的匹配,并存储该匹配的索引。使用这个162个分布均匀的矢量表,原始矢量和近似矢量之间的角度预计低于11°,这似乎对Quake2引擎来说已经足够了。

答案 2 :(得分:2)

MD2 file format指定每个顶点都有一个“普通索引”,这是对well-known table of normals的查找。我会假设这些法线分布在球体周围。据推测,构建模型的工具为每个顶点选择了最合适的法线。

关于第一个答案:如果你想要一个非常多面的模型(比如一个立方体),那么每个多边形确实都有自己的法线,构成那个多边形的每个顶点应该使用相同的法向量。但是,如果需要平滑着色(例如躯干),则多边形中的每个顶点通常具有不同的法向量。这允许照明在多边形上变化,这在每顶点和每像素照明场景中都很有用。