【发布时间】:2016-05-16 10:52:00
【问题描述】:
我正在尝试通过 3 个点计算法向量, 从中获取 2 个向量并计算法线。 但我需要知道正常是正还是负。 请帮助:)
【问题讨论】:
标签: javascript 3d
我正在尝试通过 3 个点计算法向量, 从中获取 2 个向量并计算法线。 但我需要知道正常是正还是负。 请帮助:)
【问题讨论】:
标签: javascript 3d
法线是另一个向量,所以你可以说它有一个方向和一个值(或大小或长度),但没有符号。
法线的方向取决于顺序,你传递值。
我假设您要求剔除,另一个向量会从正面还是背面看脸?然后你可以计算向量和你的法线的点积。
结果 > 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));
【讨论】:
仅仅计算法线向量什么都不会告诉你。
首先,您需要了解网格面的定义方式。无论它是由三角形还是四边形组成,您都必须确保顶点的正确顺序 - 逆时针或顺时针(阅读 this 以查看 OpenGL 中的顺时针面是什么)。顺序决定了脸部的哪一侧是可见的(可能受光的属性影响),哪一侧不可见。
之后你需要计算你的direction vector of camera 和这个法线向量的点积。根据顶点的顺序,您将得到负或正结果。
【讨论】: