从三维平面上的三维点中获取二维坐标

3
我有一个点(x,y,z),在平面ax+by+cz+d=0上定义的平面上。我试图弄清楚相对于平面的(x',y')是什么,其中它的起点是(x0,y0,z0),x'-轴由(1,0)定义,y'-轴由(0,1)定义。
我的主要目标是让鼠标点击一个表面,并知道特定表面上的2D坐标。我已经成功将射线与平面相交,这很容易。
顺便说一句,我正在使用DirectX 9-我对矩阵/向量数学的熟悉程度受到了通过D3DX库提供给我的API的限制。
我想到的一个想法是使用一个轴向量之间的角度,并找到距离原点的距离,然后使用简单的三角函数来计算x/y。但我不确定那是否真的是最理想的解决方案,或者是否能够解决手头的问题。

坐标轴的定义不清楚,因为您使用二维坐标。您必须以某种方式将这些轴与您的三维环境相关联,或者指定您不关心这些轴相对于其周围环境的方向。 - MvG
@MvG 我认为我的目标的背景说明了我试图实现什么以及我的轴的相关性。 - Mike Weir
如果我已经明白了,就不会问了……既然你的评论也没有澄清,我担心我无法帮助解决这个问题。 - MvG
@MvG 抱歉,我想你可能错过了它。想象一下在三维平面上的二维图像。当我在屏幕上点击一个像素时,我想知道那个二维图像的x、y坐标。我已经在平面上有了三维坐标(我已经投射出光线并在平面上做了交点),我正在尝试从我已经与之相交的三维平面中获取图像的二维坐标。 - Mike Weir
1个回答

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

将其翻译成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

正如我所提到的,我的数学技能可能不是你所期望的那样好...... 你能否提供更多具体的例子或信息? - Mike Weir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接