Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将三维坐标投影到二维平面_C#_Math - Fatal编程技术网

C# 将三维坐标投影到二维平面

C# 将三维坐标投影到二维平面,c#,math,C#,Math,我有一个平面,由一个法向量和另一个沿该平面移动的法向量定义,都是在三维空间中 我试图找出如何将法线方向的3D向量投影到平面上,使其最终成为具有x/y坐标的2D向量。听起来你需要找到方向向量和平面之间的角度。投影的大小将与该角度的余弦成比例。因为平面的法向量是垂直的,我想你可以找到法向量和方向向量之间的正弦 两个矢量之间的角度由矢量与量值相乘的点积给出。这给了我们θ。取θ的sin,我们有比例因子(我称之为s) 接下来,需要在要投影到的平面上定义单位大小向量。这可能是最简单的方法,在投影方向上设置一

我有一个平面,由一个法向量和另一个沿该平面移动的法向量定义,都是在三维空间中


我试图找出如何将法线方向的3D向量投影到平面上,使其最终成为具有x/y坐标的2D向量。

听起来你需要找到方向向量和平面之间的角度。投影的大小将与该角度的余弦成比例。因为平面的法向量是垂直的,我想你可以找到法向量和方向向量之间的正弦

两个矢量之间的角度由矢量与量值相乘的点积给出。这给了我们θ。取θ的sin,我们有比例因子(我称之为s)

接下来,需要在要投影到的平面上定义单位大小向量。这可能是最简单的方法,在投影方向上设置一个单位向量来向前移动

如果在投影方向上设置单位向量,则通过使用比例因子并乘以向量长度,可以知道该单位空间中投影的长度

然后,用单位向量乘以长度,找到相对于通常定义的xyz轴的向量


我希望这有帮助。

试试这样的东西。不久前我写了一篇关于这种精确方法的论文,如果你愿意,我可以给你一份

 PointF Transform32(Point3 P)
    {
        float pX = (float)(((V.J * sxy) - V.I * cxy) * zoom);
        float pY = (float)(((V.K * cz) - (V.I * sxy * sz) - (V.J * sz * cxy)));
        return new PointF(Origin.X + pX, Origin.Y - pY);
    }
cxy是x-y相机角度的余弦,在xy平面上从正x轴以弧度测量。 sxy是x-y相机角度的正弦。 cz是z摄影机角度的余弦,从x-y平面以弧度测量(因此,如果摄影机位于该平面上,则角度为零)。 sz是z摄像机角度的正弦

或者:

        Vector3 V = new Vector3(P.X, P.Y, P.Z);
        Vector3 R = Operator.Project(V, View);
        Vector3 Q = V - R;
        Vector3 A = Operator.Cross(View, zA);
        Vector3 B = Operator.Cross(A, View);
        int pY = (int)(Operator.Dot(Q, B) / B.GetMagnitude());
        int pX = (int)(Operator.Dot(Q, A) / A.GetMagnitude());
pY和pX应该是你的坐标。这里,向量V是所讨论点的位置向量,R是该向量在观察向量上的投影,Q是与观察向量正交的V分量,A是由观察向量与向量(0,0,1)的叉积形成的人造X轴,B是由A和(0,0,1)的叉积形成的人工Y轴

听起来你想要的是一个简单的渲染引擎,类似于此,它使用了上述公式:


希望这能有所帮助。

已经有了所有的数学知识,它将归结为一些矩阵数学,其中填充的值表示“注视”3D对象的“相机”。也许会有帮助。祝你好运具有x/y坐标的二维向量?关于什么轴?如果不清楚,请告诉我。我对c#不在行,但如果你能告诉我你到目前为止做了什么,我可能会给你举个例子。