在此点基于X,Z计算3D QUAD PLANE上的3D点的Y.

时间:2014-11-27 01:24:22

标签: math 3d

假设我有一个平面3D Quad(a,b,c,d 3D顶点)并且我知道3D点e:e.x和e.z在该Quad的范围内,我将如何计算e.y?我已经尝试了几种可能的解决方案,但却无法让它发挥作用。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

平面方程

(a*x)+(b*y)+(c*z)=d;

其中n=(a,b,c)是平面的法向量,因此要构建平面方程,需要a,b,c,d常量:

  1. 获得正常的n

    两个非平行向量的叉积的结果是垂直于每个向量的向量。因此,将四边形的两条边作为矢量。制作交叉乘积并将其标准化为单位矢量。这为您提供了法向量n。因此,如果Quad由顶点p0,p1,p2,p3定义,那么

    n=cross(p1-p0,p2-p1);
    n=n/|n|;
    

    希望你知道交叉积的方程和矢量的绝对值,如果不是谷歌。现在,3D矢量n的坐标包含a,b,c常量

  2. 获取d常量

    简单地获取平面上的任何点并导出d例如:

    d=(n.x*p0.x)+(n.y*p0.y)+(n.z*p0.z);
    

    或同样可以写成:

    d=dot(n,p0);
    
  3. 现在如何从e.y计算e.x,e.z

    e.y=(d-(n.x*e.x)-(n.z*e.z))/n.y;
    

    仅当n.y非零时才有效。如果它确实为零,则必须使用基向量而不是平面方程

  4. 基础向量(n.y==0)

    quad with n.y==0

    所以计算基础向量

    bu=p1-p0;
    bv=p3-p0;
    

    现在飞机上的任何一点都定义为:

    p=p0+(bu*u)+(bv*v);
    

    其中u,v是标量(表示单个数字不是向量)平面坐标,bu,bv是基础向量。现在,您需要计算x,z坐标和u,v的依赖关系:

    • p0u=0,v=0
    • p1u=1,v=0
    • p3u=0,v=1

    我们需要等式:

    u=u0+(ux*x)+(uz*z);
    v=v0+(vx*x)+(vz*z);
    

    所以我们需要计算常数:u0,ux,uy,v0,vx,vy所以这3个点的替代导致:

    0=u0+(ux*p0.x)+(uz*p0.z);
    0=v0+(vx*p0.x)+(vz*p0.z);
    1=u0+(ux*p1.x)+(uz*p1.z);
    0=v0+(vx*p1.x)+(vz*p1.z);
    0=u0+(ux*p3.x)+(uz*p3.z);
    1=v0+(vx*p3.x)+(vz*p3.z);
    

    解决该系统,这就是您所需要的。现在为点u,v计算e,然后从e.y计算u,v

  5. <强> [注释]

    子弹#4 适用于所有非常重要的四边形,不仅适用于n.y==0案例