我真的想将与平面相关的Vector3复制到另一个平面。你可以看到图像。 我只想将蓝色vector3复制为红色vector3。 我试图找出如何在两个平面的前向/上/右向量的帮助下复制它。
我想要创建的C#函数是这样的:
public Vector3 CopyVector3RelatedFromOnePlaneToAnother(Vector3 point,
Vector3 plane1_position, Vector3 plane1_forward, Vector3 plane1_up, Vector3 plane1_right,
Vector3 plane1_position, Vector3 plane2_forward, Vector3 plane2_up, Vector3 plane2_right)
{
// ...
}
编辑: 在C#-unity中添加工作进度代码:
Vector3 CopyVector3RelatedFromOnePlaneToAnother(Vector3 point, Transform plane1, Transform plane2)
{
// Plane1.
Matrix4x4 ModelWorldToPlane1 = Matrix4x4.TRS(plane1.position, plane1.rotation, plane1.localScale);
ModelWorldToPlane1 = ModelWorldToPlane1.transpose;
// Plane2.
Matrix4x4 ModelWorldToPlane2 = Matrix4x4.TRS(plane2.position, plane2.rotation, plane2.localScale);
ModelWorldToPlane2 = ModelWorldToPlane2.transpose;
Vector3 pInCoord1 = ModelWorldToPlane1.inverse * point;
Vector3 pTransformedInCoord1 = ModelWorldToPlane1.inverse * ModelWorldToPlane2 * pInCoord1;
Vector3 pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1;
return pTransformedInWorld;
}
有人可以帮助我吗?此致!
答案 0 :(得分:3)
首先,我们构建从世界空间到平面空间的模型转换:
/ right1.x up1.x forward1.x position1.x \
| right1.y up1.y forward1.y position1.y |
ModelWorldToPlane1 = | right1.z up1.z forward1.z position1.z |
\ 0 0 0 1 /
为飞机2做同样的事。
步骤1:在平面1的坐标系中表示点:
pInCoord1 = (ModelWorldToPlane1)^-1 * p
第2步:将点转换为平面2(仍然以平面1的坐标表示:
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
第3步:在世界空间中表达新点:
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
总的来说:
pTransformedInWorld = ModelWorldToPlane1 * (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * (ModelWorldToPlane1)^-1 * p
= ModelWorldToPlane2 * (ModelWorldToPlane1)^-1 * p
这是数学表示。您必须将其映射到XNA等效项。请注意,XNA使用行向量布局。这基本上意味着矩阵被转置。因此,乘法顺序相反。
答案 1 :(得分:0)
由于您希望红点位于相对于plane2的相同位置,蓝点相对于plane1,因此蓝色和红色点在plane1空间中的位置与在plane2空间中的位置相同。因此,如果您将世界空间蓝点转换为表示plane1的世界空间矩阵的倒数,那么它也已经在plane2空间中。然后用表示plane2的世界空间矩阵变换该结果,你将得到红点的世界空间位置。
//in Xna
Vector3 CopyVector3RelatedFromOnePlaneToAnother(Matrix plane1, Matrix plane2, Vector3 bluePointWorldSpace)
{
Vector3 planeSpacePosition = Vector3.Transform(bluePointWorldSpace, Matrix.Invert(plane1));
return Vector3.Transform(planeSpacePosition, plane2);
}