【问题标题】:Calculate vector sign(positive/negative)计算矢量符号(正/负)
【发布时间】:2016-05-16 10:52:00
【问题描述】:

我正在尝试通过 3 个点计算法向量, 从中获取 2 个向量并计算法线。 但我需要知道正常是正还是负。 请帮助:)

【问题讨论】:

    标签: javascript 3d


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-12-31
        • 1970-01-01
        • 2014-05-28
        • 1970-01-01
        • 1970-01-01
        • 2017-08-13
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多