2016-02-06 59 views

回答

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

指向只是法线矢量的计算告诉你什么。

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

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