Javascript 计算矢量符号(正/负)

Javascript 计算矢量符号(正/负),javascript,3d,Javascript,3d,我试着用3点来计算法向量, 从中获取2个向量,并计算法线。 但我需要知道正常值是正的还是负的。 请帮助:)法线是另一个向量,所以你可以说它有方向和值(或大小或长度),但没有符号 法线的方向取决于传递值的顺序 我假设你要求剔除,另一个向量是从正面还是背面看人脸?然后你可以计算向量和法线的点积 结果>0它们指向同一方向, 结果

我试着用3点来计算法向量, 从中获取2个向量,并计算法线。 但我需要知道正常值是正的还是负的。
请帮助:)

法线是另一个向量,所以你可以说它有方向和值(或大小或长度),但没有符号

法线的方向取决于传递值的顺序

我假设你要求剔除,另一个向量是从正面还是背面看人脸?然后你可以计算向量和法线的点积

结果>0它们指向同一方向,
结果<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));

仅仅计算法向量什么都不告诉你

首先,您需要知道网格面的定义方式。无论它是由三角形还是四边形组成,都必须确保顶点的顺序正确-逆时针还是顺时针(阅读以查看OpenGL中的顺时针面)。该顺序确定面的哪一侧可见(可能受灯光特性的影响),哪一侧不可见

然后你需要计算你的向量和这个法向量的点积。根据顶点的顺序,您将获得负结果或正结果