项目3D坐标到2D平面

时间:2016-06-29 13:24:52

标签: c# math

我有一个由法线向量定义的平面和另一个沿着该平面移动的正常方向向量,都在3D空间中。

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

2 个答案:

答案 0 :(得分:1)

听起来你需要找到方向矢量和平面之间的角度。投影的大小将与该角度的余弦一起缩放。由于平面的法向量是垂直的,我认为你可以找到法向量和方向向量之间的正弦值。

两个矢量之间的角度由矢量的点积乘以一起。这给了我们theta。接受theta的罪,我们有缩放因子(我称之为s)

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

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

之后,使用单位向量,乘以长度,找到相对于正常定义的xyz轴的向量。

我希望这会有所帮助。

答案 1 :(得分:1)

尝试这样的事情。我刚才写了一篇关于这个确切方法的论文,如果你愿意,可以为你提供一份副本。

 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是由交叉形成的人造X轴。观察向量与向量(0,0,1)的乘积,B是由A和(0,0,1)的叉积形成的人工Y轴。

听起来你正在寻找的东西就像一个简单的渲染引擎,类似于这个,它使用了上面的公式:Mathematical surface

希望这有帮助。