地震2游戏中的MD2文件格式(理论)

6
我正在尝试在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个回答

9
你可以使用预编译的法线表,然后使用查找表来选择一个在特定情况下“足够好”的法线。每个三角形都在不同的平面上,而正是这个平面具有法线,而不是三角形本身。
例如,假设我们有一个点。为了方便理解,将该点扩展为球体。如果您在y轴上画出一个完美的圆圈,然后将该圆圈在x轴上每次旋转1度,最终将得到360个圆圈。如果您在每个圆圈沿着1度间隔取法线,则最终将得到360 ** 2个点。从那里开始,您的法线就是从球体中心到球体上的那个点的向量,并且它是构成与球体上该点相切的平面的法线。如果您对该球体上每个点都计算这两个值,就会得到一个预先计算的法线表,这几乎肯定对大多数情况都足够好。现在您只需要为该数据设计一个查找方案(平面->法线)。

你有相关的文献资料可以提供吗? - Dr Deo
不好意思,这只是我凭记忆和对所涉及的数学理解而得出的。 - Matthew Scharley
涉及3D几何的大多数高级数学书籍都应该涵盖此内容。 - Matthew Scharley
1
+1. 这是我听说的。该表涵盖了单位球的有限子集。因此,为了节省空间,您可以存储索引而不是在 .md2 中存储法线(这就是向量量化的含义)。 - sellibitze

6

这个问题已经有人回答了,但我想再多说一些。

该表包含覆盖单位球面相当均匀的向量。似乎162个向量的集合是细分 二十面体 的角落。这样做是为了将长度为1的三维向量进行有损压缩,以便将其转换为索引(8位),请参见矢量量化。要存储任意法向量,可以搜索最接近的匹配项并存储该匹配项的索引。使用这个包含162个分布良好的向量的表格,原始向量和近似向量之间的角度预计将低于11°,这似乎对Quake2引擎来说已经足够好了。


2

MD2文件格式规定每个顶点都有一个“法线索引”,这是一个查找已知法线表格的过程。我认为这些法线分布在一个球体周围。大概,建立模型的工具会选择每个顶点最合适的法线。

关于第一个答案:如果你想要一个非常平面化的模型(比如一个立方体),那么每个多边形确实都有自己的法线,由构成该多边形的顶点使用相同的法向量。然而,如果你想要光滑的着色效果(比如一个躯干),通常情况下每个多边形中的每个顶点都有不同的法线向量。这使得光照可以在多边形上变化,这对于每个顶点和每个像素的光照场景都很有用。


如果你正在谈论顶点法线,那么你仍然没有谈论多边形本身具有一个法线。你仍然在谈论一个平面具有一个法线,并且这个平面通常被认为是垂直于形状在顶点出现的点处预期曲率构造的平面。 - Matthew Scharley
我只是想澄清一下你在第一段中所表达的观点。对于MD2模型,我认为考虑每个顶点处的切平面比考虑每个三角形的切平面更有用(这是我最初阅读你的答案的方式)。从你对我的回答的评论来看,我认为我们的想法是一致的。 - Daniel Yankowsky
我已经做了足够多的图形工作,以至于有些危险,但还不足以了解所有的东西。我只是恰好在数学上足够强大,可以理解发生了什么。第一段是试图回答我所理解的问题。顺便说一句,多边形所在平面的法线并不无用,只是在光照中没有使用(它可能会在物理引擎、碰撞检测等方面使用)。 - Matthew Scharley
如果您正在绘制平面着色的多边形,那么您将使用多边形平面法线进行照明。 - Incredulous Monk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接