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#不在行,但如果你能告诉我你到目前为止做了什么,我可能会给你举个例子。