1

Waht 是使用 Away3D 从 2D 鼠标坐标中获取 3D 坐标的正确方法。(version 3.6.0) 一般是ambigoius问题,所以3D点属于某个固定平面是有限制的。

有一些 camera.unproject 和 plane.getIntersectionLineNumbers 方法的例子,但如果相机旋转或平面不是微不足道的,它们就不起作用。

4

2 回答 2

2

我很确定 Away3D 已经在一些不错的功能中实现了这一点,但这就是我的做法。我假设您的意思是从相机“胶片”到世界空间的正交投影(不知道它是如何实现的)。

您正在从相机视图平面投射光线,因此您基本上是在寻找光线和平面的交点。光线从相机的“眼睛”开始并穿过相机的视平面。

因此,两者之间的 3D 交点将是:

Point getIntersection(Ray ray) {
  float k, t;
  Point point;
  Vector toPoint;

  k = ray.direction.dot(this.normal);

  if (k != 0.0) {
    t = (this.position - ray.origin).dot(this.normal) / k;
  } else {
    return false;
  }

  if (t < 0.0000001) {
    return false;
  }

  return ray.origin + ray.direction * t;
}

我在光线追踪器中使用了类似的代码,所以它应该可以工作。

于 2011-08-01T17:00:04.133 回答
1

您必须首先获得鼠标点击实际产生到 3D 空间中的“射线”。然后你通过计算那条射线和你的表面的交点找到你想要的点(这里有一些数学)。就我而言,我必须在用户点击的球体上找到点。

要获得“射线”:

var vector:Vector3D = new Vector3D(mX/camera.zoom, -mY/camera.zoom, camera.focus);
vector = camera.transform.matrix3D.deltaTransformVector(vector);

请注意上面的“相机”对象。

如果您想查看我的球体实现,请查看https://github.com/SabinT/Earth3D

于 2013-11-27T18:47:01.637 回答