Math 基于该点的X、Z计算三维四元平面上三维点的Y

Math 基于该点的X、Z计算三维四元平面上三维点的Y,math,3d,Math,3d,假设我有一个平面3D四边形(a、b、c、d 3D顶点),并且我知道3D点e:e.x和e.z在该四边形的边界内,我将如何计算e.y?我试过几种可能的解决办法,但就是没能奏效 谢谢你的帮助。平面方程 (a*x)+(b*y)+(c*z)=d; 其中,n=(a,b,c)是平面的法向量,因此要构造平面方程,需要a,b,c,d常数: 获取正常的n 两个非平行向量的叉积的结果是向量垂直于每个向量。因此,将四边形的两条边作为向量。生成叉积并将其规格化为单位向量。这就给出了法向量n。因此,如果四边形是由顶点p0

假设我有一个平面3D四边形(a、b、c、d 3D顶点),并且我知道3D点e:e.x和e.z在该四边形的边界内,我将如何计算e.y?我试过几种可能的解决办法,但就是没能奏效

谢谢你的帮助。

平面方程

(a*x)+(b*y)+(c*z)=d;
其中,
n=(a,b,c)
是平面的法向量,因此要构造平面方程,需要
a,b,c,d
常数:

  • 获取正常的
    n

    两个非平行向量的叉积的结果是向量垂直于每个向量。因此,将四边形的两条边作为向量。生成叉积并将其规格化为单位向量。这就给出了法向量
    n
    。因此,如果四边形是由顶点
    p0、p1、p2、p3定义的,那么

    n=cross(p1-p0,p2-p1);
    n=n/|n|;
    
    希望你知道向量的叉积和绝对值的公式,如果不知道的话,谷歌。现在,3D矢量
    n
    的坐标保持
    a、b、c
    常数

  • 获取
    d
    常数

    只需获取平面上的任意点并导出
    d
    ,例如:

    d=(n.x*p0.x)+(n.y*p0.y)+(n.z*p0.z);
    
    或者也可以写为:

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

    e.y=(d-(n.x*e.x)-(n.z*e.z))/n.y;
    
    仅当
    n.y
    为非零时,此选项才有效。如果它确实为零,那么你必须使用基向量而不是平面方程

  • (a*x)+(b*y)+(c*z)=d;
    
  • 基向量
    (n.y==0)

    所以计算基向量

    bu=p1-p0;
    bv=p3-p0;
    
    现在,平面上的任何点定义为:

    p=p0+(bu*u)+(bv*v);
    
    其中,
    u,v
    为标量(表示单个数字而非矢量)平面坐标,
    bu,bv
    为基本矢量。现在您需要计算
    x,z
    坐标和
    u,v
    的相关性,我们现在:

    • p0
      is
      u=0,v=0
    • p1
      u=1,v=0
    • p3
      u=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);
    
    解决这个系统,这就是你所需要的。现在为点
    e
    计算
    u,v
    ,然后从
    u,v

  • [notes]


    Bullet#4适用于所有非平凡的四边形,不仅仅适用于
    n.y==0
    case

    你试过得到平面的方程了吗?我没有很强的数学背景,所以我不确定如何做到这一点….(目前)。是的,我的库中既有CrossProduct()函数,也有Dot()函数。我在第4项中使用了你建议的基向量。非常感谢您以有效简洁的方式将其详细阐述。