我试图在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 },
...
... 好吧,这听起来可能有点傻,但是我认为每个模型都是由不同的三角形组成的,那么你怎么可能使用一组预编译的法线来渲染所有的模型呢?这看起来有点奇怪,任何想法都会受到欢迎。
发布于 2009-11-19 06:05:49
您可以使用预编译法线表,并使用查找表为特定情况选择一个“足够好”的表。每个三角形都在一个不同的平面上,它是有法线的平面,而不是三角形本身。
例如,让我们假设我们有一个点。为了讨论的目的,将这一点扩展到一个范围内,使其在概念上更容易掌握。如果在y轴上围绕球体绘制一个完美的圆,然后每次将该圆在x轴上旋转1度,则最终将得到360个圆。如果你沿着每个圆以1度的间隔取法线,你最终会得到360 ** 2点。从那里开始,您的法线是从球体中心到球体上该点的向量,并且它是与球体上的点相切的平面的法线。如果你为球面上的每个点计算这两个点,你最终得到的是一个预先计算的法线表,对于大多数情况来说,这几乎肯定是足够好的。现在您只需要为该数据设计一个查找方案(plane -> normal)。
发布于 2009-11-19 08:05:20
这个问题已经得到了回答,但我想更多地说明一下。
该表包含相当均匀地覆盖单位球体表面的向量。这组162个向量似乎是subdivided icosahedron的边角。这样做是为了将单位长度的3D矢量有损压缩为索引(8位),请参阅vector quantization。为了存储任意的法向量,您可以在表中搜索最接近的匹配项,并存储此匹配项的索引。有了这个包含162个均匀分布的向量的表,原始向量和近似向量之间的角度预计将低于11°,这对于Quake2引擎来说似乎足够好了。
发布于 2009-11-19 07:53:41
MD2 file format指定每个顶点都有一个“正常索引”,这是对well-known table of normals的查找。我假设这些法线分布在一个球体周围。大概,构建模型的工具为每个顶点选择了这些法线中最合适的。
关于第一个答案:如果您想要一个非常多面的模型(如立方体),那么每个多边形确实有其自己的法线,并且组成该多边形的每个顶点都应该使用相同的法线向量。但是,如果需要平滑着色(如躯干),多边形中的每个顶点通常具有不同的法线向量。这允许照明在多边形中变化,这在逐顶点和逐像素照明方案中都很有用。
https://stackoverflow.com/questions/1759397
复制相似问题