有三个顶点的坐标(x1,y1,z1),(x2,y2,z2),(x3,y3,z3),以逆时针方向围成一个三角形面片,我想根据右手法则求出这个面片的向量的方向,请问这么求?是不是要用到向量的叉乘?叉乘又是怎么实现的?谢谢!

解决方案 »

  1.   

    void CalculateNormal(float* fVertex1,float* fVertex2,float* fVertex3,float* fNormal)
    {
    float fVector1[3],fVector2[3]; fVector1[0] = fVertex2[0] - fVertex1[0];
    fVector1[1] = fVertex2[1] - fVertex1[1];
    fVector1[2] = fVertex2[2] - fVertex1[2]; fVector2[0] = fVertex3[0] - fVertex1[0];
    fVector2[1] = fVertex3[1] - fVertex1[1];
    fVector2[2] = fVertex3[2] - fVertex1[2]; fNormal[0] = fVector1[1] * fVector2[2] - fVector1[2] * fVector2[1];
    fNormal[1] = fVector1[2] * fVector2[0] - fVector1[0] * fVector2[2];
    fNormal[2] = fVector1[0] * fVector2[1] - fVector1[1] * fVector2[0]; float dLength = sqrt(fNormal[0] * fNormal[0] + fNormal[1] * fNormal[1] + fNormal[2] * fNormal[2]); if (dLength != 0.0)
    {
    fNormal[0] /= dLength;
    fNormal[1] /= dLength;
    fNormal[2] /= dLength;
    }
    else
    {
    fNormal[0] = 0.0;
    fNormal[1] = 0.0;
    fNormal[2] = 0.0;
    }
    }
      

  2.   

    法向量是两个边向量的叉乘结果
    所以,第一步是 p2-p1, 和p3-p1的操作,形成两个边向量关于叉乘,假定i,j,k是三个轴,那么V1(x1,y1,z1)和V2(x2,y2,z2)的叉乘结果表示为行列式的方式:
    | x1 y1 z1 |
    | x2 y2 z2 | =  V(y1*z2-y2*z1,  z1*x2-x1*z2, x1*y2-x2*y1)
    | i  j  k  |
    注意: V1×V2 = - V2×V1
    左手和右手的区别就是谁在先谁在后最后如果需要,就把V单位化即可