计算矢量符号(正/负)

时间:2016-02-06 13:17:58

标签: javascript 3d

我正在尝试将法线向量计算3个点, 从他们得到2个向量并计算正常值。 但我需要知道正常是正面还是负面。 请帮助:)

2 个答案:

答案 0 :(得分:0)

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

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

我认为你要求剔除,另一个矢量会从脸部的正面还是背面看?那么你可以计算向量和正常的点积。

结果> 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));

答案 1 :(得分:0)

只是正常向量的计算不会告诉你什么。

首先,您需要了解网格面的定义方式。无论它是由三角形还是四边形组成,你必须确保你有正确的顶点顺序 - 逆时针或顺时针(阅读this以查看OpenGL中的顺时针面)。该顺序决定了面部的哪一面是可见的(可能受光的属性影响),而不是。

之后,您需要计算direction vector of camera和此法线向量的点积。根据顶点的顺序,您将得到负面或正面结果。