Math 基于该点的X、Z计算三维四元平面上三维点的Y
假设我有一个平面3D四边形(a、b、c、d 3D顶点),并且我知道3D点e:e.x和e.z在该四边形的边界内,我将如何计算e.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
(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
的相关性,我们现在:
isp0
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
Bullet#4适用于所有非平凡的四边形,不仅仅适用于
n.y==0
case你试过得到平面的方程了吗?我没有很强的数学背景,所以我不确定如何做到这一点….(目前)。是的,我的库中既有CrossProduct()函数,也有Dot()函数。我在第4项中使用了你建议的基向量。非常感谢您以有效简洁的方式将其详细阐述。