有没有办法在Flash中使用Away3D在2D鼠标坐标的某个平面上获得3D坐标?

时间:2011-08-01 16:49:47

标签: flash away3d

Waht是使用Away3D从2D鼠标坐标获取3D坐标的正确方法。 (版本3.6.0) 这是一般的ambigoius问题,因此3D点属于某个固定平面存在限制。

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

2 个答案:

答案 0 :(得分:1)

我很确定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;
}

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

答案 1 :(得分:0)

你必须首先获得一个&#34; ray&#34;鼠标单击生效进入3D空间。 然后通过计算该光线与表面的交点来找到所需的点(这里有一些数学)。就我而言,我必须在用户点击的球体上得到点。

获得&#34; ray&#34;:

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

注意&#34;相机&#34;上面的对象。

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