顶点的副法线是它的法线和切线之间的交叉吗?

时间:2010-05-15 14:15:24

标签: math opengl directx shader vertex

我试图找出图形编程环境中的副标准是什么但是很短,我在一个网站上看到,正常算法被计算为正常和切线之间的交叉积(即交叉(正常) ,tangent)),这是计算副法线的正确方法吗?

5 个答案:

答案 0 :(得分:5)

只是指出那完全不是binormal的定义。这是Bi Tangent 的定义。对于由曲面形成的“其他”法线,Binormal是完全不同的。

人们需要学习不要重复这个错误(在正常映射的早期由某人制作)。

答案 1 :(得分:2)

根据mathworld,副法线向量定义为cross(tangent,normal),其中tangentnormal单位法向量。

请注意,严格来说,当你选择跨产品时,订单很重要。 cross(tangent,normal)指向与cross(normal,tangent)相反的方向。根据您的申请,这可能或不重要。只要您的计算在内部一致,它就没关系。

答案 2 :(得分:1)

正态,正切和副法向量形成orthonormal basis来表示tangent space 切线空间(有时称为纹理空间)用于带有normal maps的每像素照明,以模拟表面细节(想象墙壁或高尔夫球)。

切线和副法线矢量表示等效纹理UV,即平行于表面法线的矢量。

从技术上来说 - 因为它们形成了一个标准正交基础,然后binormal = cross(正切,正常)然而在实践中,因为正规映射和切线是从法线贴图中的UV生成的并且可以是平均的在几个顶点上,它们可能不是严格的正交。

有关该主题的几篇好文章,请阅读 http://www.3dkingdoms.com/weekly/weekly.php?a=37

http://www.blacksmith-studios.dk/projects/downloads/bumpmapping_using_cg.php

答案 3 :(得分:1)

实际上,不,有时不是。在3d图形中,至少。

如果纹理被拉伸,那么副法线可能不垂直于法线和切线(尽管它应该是垂直的)。

只需使用出口商计算的任何内容即可。如果导出器同时提供切线和副法线,那就很好。如果只有切线,则将binormal计算为与切线和法线的垂直。

获取一个复杂的对象,同时计算切线和二进制,并在使用binormal时比较光照,这是在将binormal作为交叉乘积计算时得到的光照。会有所不同。

无论如何,我认为正确的方法是在导出器中计算切线和副法线,并使用导出器提供的内容。

答案 4 :(得分:1)

是Binormal或Bitangent是顶点的法线和切线之间的交叉。如果这三个中有任何2个向量,则可以计算另一个向量 例如,如果你有一个正切和一个正常(或比特),你可以计算法线 这是一个可以在正常情况下在GLSL中创建binormal和bitangents的示例:

varying vec3 normal;
varying vec4 vpos;
varying vec3 T,B;
void main()
{
    gl_TexCoord[0] = gl_MultiTexCoord0;
    normal = normalize(gl_NormalMatrix*gl_Normal);
    gl_Position =gl_ProjectionMatrix*gl_ModelViewMatrix*gl_Vertex;
    vpos = gl_ProjectionMatrix*gl_ModelViewMatrix*gl_Vertex;
    T = cross(normal,vec3(-1,0,0));
    B = cross(T,normal);
}

虽然它可能无法得到理想的结果,但它有时会让你到达你想要的地方。