3

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

4

5 回答 5

5

只是指出这完全不是副法线的定义。这就是 Bi Tangent的定义。副法线与曲面形成的“其他”法线完全不同。

人们需要学会不要重复那个错误(在法线映射的早期就有人犯了)。

于 2010-05-15T21:23:57.757 回答
3

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

请注意,严格来说,当您采取交叉产品时,订单很重要。cross(tangent,normal)指向与 的相反方向cross(normal,tangent)。根据您的应用程序,这可能会或可能不会重要。只要您的计算在内部是一致的,这真的没关系。

于 2010-05-15T14:23:34.433 回答
1

法线、切线和副法线向量构成一个正交基来表示切线空间切线空间(有时称为纹理空间)用于带有法线贴图
的逐像素照明以模拟表面细节(想象一堵墙或一个高尔夫球)。

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

所以从技术上讲 - 因为它们形成一个正交基础,然后 binormal = cross (tangent,normal )但是在实践中,由于副法线和切线是从法线贴图中的 UV 生成的,并且可能在几个顶点上平均,所以它们可能不是严格正交的.

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

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

于 2010-05-15T15:08:22.210 回答
1

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

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

只需使用您的出口商计算的任何东西。如果导出器同时提供切线和副法线,那就很好了。如果只有切线,则计算副法线作为切线和法线的垂线。

获取一个同时计算切线和副法线的复杂对象,并比较使用副法线时的光照,该光照与将副法线计算为叉积时获得的光照一起提供。会有区别。

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

于 2010-05-15T21:35:48.263 回答
1

是的,Binormal 或 Bitangent 是顶点的法线和切线之间的交叉点。如果这三个向量中有任何两个向量,则可以计算另一个向量。
例如,如果您有切线和副法线(或双切线),则可以计算法线。
这是一个示例,它可以在 GLSL 中创建具有法线的副法线和双切线:

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);
}

虽然有时它可能无法获得所需的结果,但它应该可以让您到达您想要的地方。

于 2010-05-16T12:29:57.403 回答