假设我有一个平面3D Quad(a,b,c,d 3D顶点)并且我知道3D点e:e.x和e.z在该Quad的范围内,我将如何计算e.y?我已经尝试了几种可能的解决方案,但却无法让它发挥作用。
感谢您的帮助。
答案 0 :(得分:2)
平面方程
(a*x)+(b*y)+(c*z)=d;
其中n=(a,b,c)
是平面的法向量,因此要构建平面方程,需要a,b,c,d
常量:
获得正常的n
两个非平行向量的叉积的结果是垂直于每个向量的向量。因此,将四边形的两条边作为矢量。制作交叉乘积并将其标准化为单位矢量。这为您提供了法向量n
。因此,如果Quad由顶点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.y
计算e.x,e.z
?
e.y=(d-(n.x*e.x)-(n.z*e.z))/n.y;
仅当n.y
非零时才有效。如果它确实为零,则必须使用基向量而不是平面方程
基础向量(n.y==0)
所以计算基础向量
bu=p1-p0;
bv=p3-p0;
现在飞机上的任何一点都定义为:
p=p0+(bu*u)+(bv*v);
其中u,v
是标量(表示单个数字不是向量)平面坐标,bu,bv
是基础向量。现在,您需要计算x,z
坐标和u,v
的依赖关系:
p0
是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);
解决该系统,这就是您所需要的。现在为点u,v
计算e
,然后从e.y
计算u,v
<强> [注释] 强>
子弹#4 适用于所有非常重要的四边形,不仅适用于n.y==0
案例