一个与平面相关的Vector3,将其复制到另一个平面

时间:2014-02-25 10:01:59

标签: c# math 3d xna unity3d

我真的想将与平面相关的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)
    {
       // ...
    }

enter image description here

编辑: 在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;
    }

有人可以帮助我吗?此致!

2 个答案:

答案 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);
}