Waht 是使用 Away3D 从 2D 鼠标坐标中获取 3D 坐标的正确方法。(version 3.6.0) 一般是ambigoius问题,所以3D点属于某个固定平面是有限制的。
有一些 camera.unproject 和 plane.getIntersectionLineNumbers 方法的例子,但如果相机旋转或平面不是微不足道的,它们就不起作用。
我很确定 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;
}
我在光线追踪器中使用了类似的代码,所以它应该可以工作。
您必须首先获得鼠标点击实际产生到 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