【问题标题】:Retrieve 2D co-ordinate from a 3D point on a 3D plane从 3D 平面上的 3D 点检索 2D 坐标
【发布时间】:2013-05-24 14:24:52
【问题描述】:

我有一个点 (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。但我不确定这是否真的是一个理想的解决方案 - 或者它是否真的可以解决手头的问题。

【问题讨论】:

  • 轴的定义不清楚,因为您使用的是二维坐标。您必须以某种方式将这些轴与您的 3d 环境相关联,或者指定您不关心这些轴相对于其周围环境的方向。
  • @MvG 我认为我的目标背景阐明了我想要实现的目标以及我的轴有什么相关性。
  • 如果我很清楚,我就不会问了……而且由于您的评论也没有澄清,我担心我无法提供帮助。
  • @MvG 对不起,我想你可能错过了。想象一下 3D 平面上的 2D 图像。当我点击屏幕上的一个像素时,我想知道那个 2D 图像的 x,y 坐标。我在平面上有 3D 坐标(我已经将光线投射出来并在平面上进行了交叉) - 我正在尝试从我已经完成的 3D 平面获取图像的 2D 坐标相交。

标签: vector 3d geometry 2d plane


【解决方案1】:

由于您在该平面上有一个 2D 图像,您显然希望匹配其坐标系。为此,请确定图片的单位向量。也就是说,对于任意 x>0,取图片位置 (x,0) 的 3d 坐标 B,并从中减去原点 (0) 的 3d 坐标 A ,0) 的图片。结果向量 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

【讨论】:

  • 正如我所提到的,我的数学技能并不是你所期望的......你能提供更多细节/例子吗?
猜你喜欢
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
相关资源
最近更新 更多