我试着用3个点计算一个法向量,从中得到2个向量,然后计算法线。但我需要知道常态是正数还是负数。请帮助:)
发布于 2016-02-06 22:31:45
法线是另一个向量,所以你可以说它有一个方向,一个值(或幅度或长度),但没有符号。
法线的方向取决于传递值的顺序。
我假设你是在请求剔除,是另一个向量从前面看还是从后面看脸?
结果<0它们指向相反的方向
function pt(x,y,z){ return { x: +x||0, y: +y||0, z: +z||0 } }
function dot(a,b){ return b.x*a.x + b.y*a.y + b.z-a.z }
function delta(a,b){ return pt(b.x-a.x, b.y-a.y, b.z-a.z) }
function cross(a,b){
return pt( a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x )
}
var face = [
pt(0,0,0),
pt(1,0,0),
pt(0,1,0)
];
var vector;
var normal = cross(
delta(face[0], face[1]),
delta(face[1], face[2])
);
console.log('normal', normal);
console.log(vector = pt(0, 0, 10), dot(normal,vector));
console.log(vector = pt(0, 0, -1), dot(normal,vector));
//pretty flat angle but still enough to determine the direction
console.log(vector = pt(1, 1, .00005), dot(normal,vector));发布于 2016-02-07 07:06:27
只是法向量的计算不会告诉你任何事情。
首先,你需要知道网格的面是如何定义的。无论它是由三角形还是四边形组成的,你都必须确保顶点的顺序是正确的-逆时针还是顺时针(阅读this了解OpenGL中顺时针的面是什么)。顺序决定了面的哪一侧是可见的(可能受灯光属性的影响),以及哪一侧不可见。
然后你需要计算你的direction vector of camera和这个法向量的点积。根据顶点的顺序,您将获得负或正的结果。
https://stackoverflow.com/questions/35241473
复制相似问题