C# 一个矢量3与一个平面相关,将其复制到另一个平面

C# 一个矢量3与一个平面相关,将其复制到另一个平面,c#,math,3d,xna,unity3d,C#,Math,3d,Xna,Unity3d,我真的想把一个向量3复制到另一个平面上。你可以看到图像。 我只想把蓝色的矢量复制成红色的矢量。 我试图找出如何通过两个平面的正向/向上/向右向量来复制它 我想创建的C#-函数如下: public Vector3 CopyVector3RelatedFromOnePlaneToAnother(Vector3 point, Vector3 plane1_position, Vector3 plane1_forward, Vector3 plane1_up, Vector3 plane1_r

我真的想把一个向量3复制到另一个平面上。你可以看到图像。 我只想把蓝色的矢量复制成红色的矢量。 我试图找出如何通过两个平面的正向/向上/向右向量来复制它

我想创建的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中添加工作进度代码:


有人能帮我吗?问候

首先,我们构造从世界空间到平面空间的模型变换:

                        / 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
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
步骤2:将点变换为平面2(仍以平面1的坐标表示):

pInCoord1 = (ModelWorldToPlane1)^-1 * p
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
步骤3:表达世界空间中的新点

pInCoord1 = (ModelWorldToPlane1)^-1 * p
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
因此,总体而言:

pTransformedInWorld = ModelWorldToPlane1 * (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * (ModelWorldToPlane1)^-1 * p
                    = ModelWorldToPlane2 * (ModelWorldToPlane1)^-1 * p

这是数学表示法。您必须将其映射到XNA等价物。请注意,XNA使用行向量布局。这基本上意味着矩阵是转置的。因此,乘法顺序是颠倒的。

首先,我们构造从世界空间到平面空间的模型变换:

                        / 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
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
步骤2:将点变换为平面2(仍以平面1的坐标表示):

pInCoord1 = (ModelWorldToPlane1)^-1 * p
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
步骤3:表达世界空间中的新点

pInCoord1 = (ModelWorldToPlane1)^-1 * p
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
因此,总体而言:

pTransformedInWorld = ModelWorldToPlane1 * (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * (ModelWorldToPlane1)^-1 * p
                    = ModelWorldToPlane2 * (ModelWorldToPlane1)^-1 * p

这是数学表示法。您必须将其映射到XNA等价物。请注意,XNA使用行向量布局。这基本上意味着矩阵是转置的。因此,乘法顺序是颠倒的。

首先,我们构造从世界空间到平面空间的模型变换:

                        / 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
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
步骤2:将点变换为平面2(仍以平面1的坐标表示):

pInCoord1 = (ModelWorldToPlane1)^-1 * p
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
步骤3:表达世界空间中的新点

pInCoord1 = (ModelWorldToPlane1)^-1 * p
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
因此,总体而言:

pTransformedInWorld = ModelWorldToPlane1 * (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * (ModelWorldToPlane1)^-1 * p
                    = ModelWorldToPlane2 * (ModelWorldToPlane1)^-1 * p

这是数学表示法。您必须将其映射到XNA等价物。请注意,XNA使用行向量布局。这基本上意味着矩阵是转置的。因此,乘法顺序是颠倒的。

首先,我们构造从世界空间到平面空间的模型变换:

                        / 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
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
步骤2:将点变换为平面2(仍以平面1的坐标表示):

pInCoord1 = (ModelWorldToPlane1)^-1 * p
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
步骤3:表达世界空间中的新点

pInCoord1 = (ModelWorldToPlane1)^-1 * p
pTransformedInCoord1 = (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * pInCoord1
pTransformedInWorld = ModelWorldToPlane1 * pTransformedInCoord1
因此,总体而言:

pTransformedInWorld = ModelWorldToPlane1 * (ModelWorldToPlane1)^-1 * ModelWorldToPlane2 * (ModelWorldToPlane1)^-1 * p
                    = ModelWorldToPlane2 * (ModelWorldToPlane1)^-1 * p

这是数学表示法。您必须将其映射到XNA等价物。请注意XNA使用行向量布局。这基本上意味着矩阵是转置的。因此,乘法顺序是相反的。

因为您希望红点位于相对于平面2的同一位置,而蓝点位于相对于平面的同一位置e1,那么蓝点和红点在plane1空间中的位置与在plane2空间中的位置相同。因此,如果你通过表示plane1的世界空间矩阵的逆变换世界空间蓝点,那么它也已经在plane2空间中了。然后通过表示plane2的世界空间矩阵变换结果,你将得到世界空间d红色点的空间位置

//in Xna
Vector3 CopyVector3RelatedFromOnePlaneToAnother(Matrix plane1, Matrix plane2, Vector3 bluePointWorldSpace)
{
   Vector3 planeSpacePosition = Vector3.Transform(bluePointWorldSpace, Matrix.Invert(plane1));
   return Vector3.Transform(planeSpacePosition, plane2);
}

由于您希望红点相对于plane2的位置与蓝点相对于plane1的位置相同,因此蓝点和红点在plane1空间中的位置与在plane2空间中的位置相同。因此,如果您通过表示plane1的世界空间矩阵的逆变换世界空间蓝点,那么这已经在p中了然后通过表示plane2的世界空间矩阵对结果进行变换,得到红点的世界空间位置

//in Xna
Vector3 CopyVector3RelatedFromOnePlaneToAnother(Matrix plane1, Matrix plane2, Vector3 bluePointWorldSpace)
{
   Vector3 planeSpacePosition = Vector3.Transform(bluePointWorldSpace, Matrix.Invert(plane1));
   return Vector3.Transform(planeSpacePosition, plane2);
}

由于您希望红点相对于plane2的位置与蓝点相对于plane1的位置相同,因此蓝点和红点在plane1空间中的位置与在plane2空间中的位置相同。因此,如果您通过表示plane1的世界空间矩阵的逆变换世界空间蓝点,那么这已经在p中了然后通过表示plane2的世界空间矩阵对结果进行变换,得到红点的世界空间位置

//in Xna
Vector3 CopyVector3RelatedFromOnePlaneToAnother(Matrix plane1, Matrix plane2, Vector3 bluePointWorldSpace)
{
   Vector3 planeSpacePosition = Vector3.Transform(bluePointWorldSpace, Matrix.Invert(plane1));
   return Vector3.Transform(planeSpacePosition, plane2);
}

由于您希望红点相对于plane2的位置与蓝点相对于plane1的位置相同,因此蓝点和红点在plane1空间中的位置与在plane2空间中的位置相同。因此,如果您通过表示plane1的世界空间矩阵的逆变换世界空间蓝点,那么这已经在p中了然后通过表示plane2的世界空间矩阵对结果进行变换,得到红点的世界空间位置

//in Xna
Vector3 CopyVector3RelatedFromOnePlaneToAnother(Matrix plane1, Matrix plane2, Vector3 bluePointWorldSpace)
{
   Vector3 planeSpacePosition = Vector3.Transform(bluePointWorldSpace, Matrix.Invert(plane1));
   return Vector3.Transform(planeSpacePosition, plane2);
}

您可以使用适当的变换矩阵。但是,使用两个
平面
对象无法唯一解决此问题。该平面仅包含上方向向量,因此您缺少该平面的方向(向前和向右).你想怎么做?哦,对了。现在我只是将平面更改为位置、前进、右上的向量3。:)你可以使用适当的变换矩阵。但是,使用两个
平面
对象并不能唯一解决此问题。平面只包含上向量,因此你丢失了平面的方向(向前和向右)。你想怎么做?哦,对了。现在我只是将平面更改为位置、向前、向右上的向量3。你可以使用适当的变换矩阵。但是,使用两个
Plane
对象并不能唯一解决此问题。平面只包含上向量,因此你缺少t