从3D平面上的3D点检索2D坐标

时间:2013-05-22 18:37:40

标签: vector 3d geometry 2d plane

我有一个点(x,y,z)位于由ax + + + cz + d = 0定义的平面上。我试图找出相对于平面的(x',y'),它的起点为(x0,y0,z0),x'轴由(1,0)定义, y'轴由(0,1)定义。

我的主要目标是让鼠标点击表面,并知道特定表面上的2D坐标。我已经设法将光线相当平坦地交叉到飞机上。

作为旁注,我正在使用DirectX 9 - 我对矩阵/矢量数学的熟悉程度受到通过D3DX库提供给我的API的限制。

我想到的一个想法是使用其中一个轴向量之间的角度并找到距离原点的距离,并使用简单的trig来计算x / y。但我不确定这是否真的是一个理想的解决方案 - 或者它是否真的可以解决手头的问题。

1 个答案:

答案 0 :(得分:2)

由于您在该平面上有2D图像,因此您显然希望匹配其坐标系。为此,请确定图片的单位矢量。也就是说,对于任何x> 0的图片位置(x,0)取3d坐标 B ,并从中减去原点的3d坐标 A (0 ,0)的图片。生成的矢量 B - A 将描述图像的正 x 方向。对 y 方向执行相同操作。然后归一化这两个向量。这意味着将它们除以它们的长度sqrt(x²+y²+z²),但D3Dx有一个函数D3DXVec3Normalize。让我们调用生成的3d向量 X Y 。要计算任何3D点 p x y 坐标,只需从中减去原点 A 即可p ,即计算向量 p - A 。然后计算结果与单位向量 X Y 之间的点积。这将给你两个数字:所需的坐标。这是因为点积可用于计算正交投影。

将其翻译为D3Dx,看起来应该如下所示。由于我从未使用它,这可能会有错误。

D3DXVECTOR3 *p;                  // input point
D3DXVECTOR3 a, b, c, ab, ac, ap; // helper vectors
FLOAT x, y;                      // output coordinates
imagePosTo3D(&a, 0, 0);          // a = origin of image
imagePosTo3D(&b, 1, 0);          // b = anywhere on positive x axis, perhaps a corner
imagePosTo3D(&c, 0, 1);          // c = anywhere on positive y axis, perhaps a corner
D3DXVec3Subtract(&ab, &b, &a);   // ab = b - a
D3DXVec3Subtract(&ac, &c, &a);   // ac = c - a
D3DXVec3Normalize(&ab, &ab);     // ab = ab / |ab|
D3DXVec3Normalize(&ac, &ac);     // ac = ac / |ac|
// the above has to be done once for the image, the code below for every p
D3DXVec3Subtract(&ap, p, &a);    // ap = p - a
x = D3DXVec3Dot(&ab, &ap);       // x = ab∙ap
y = D3DXVec3Dot(&ac, &ap);       // y = ac∙ap