我的目标是以这样的方式在虚拟世界中移动一个形状,使其最终到达鼠标指针在画布上的位置。
我有: - Canvas3D 对象上的鼠标位置 (x,y) -Point3d 对象,从 Canvas3D 视口开始的拾取射线与第一个场景对象相交。(在我想要开始拖动的 3D 空间中的点)
我想要什么: - 某种方式来转换 Point3d 的坐标,以便初始交点(Point3d 对象)始终与画布上的鼠标位置重叠(与我使用拾取射线确定用户点击的内容相同)来自 Canvas3D 对象)。
谢谢!
我的目标是以这样的方式在虚拟世界中移动一个形状,使其最终到达鼠标指针在画布上的位置。
我有: - Canvas3D 对象上的鼠标位置 (x,y) -Point3d 对象,从 Canvas3D 视口开始的拾取射线与第一个场景对象相交。(在我想要开始拖动的 3D 空间中的点)
我想要什么: - 某种方式来转换 Point3d 的坐标,以便初始交点(Point3d 对象)始终与画布上的鼠标位置重叠(与我使用拾取射线确定用户点击的内容相同)来自 Canvas3D 对象)。
谢谢!
听起来好像您想使用与背景平面平行并包含与对象的交点的平面。即使鼠标移动到实际背景之外,您也可以使用这个平面,因为它只是一个延伸到无穷大的数学概念。
我不是 Java 程序员,所以我不能给你代码,但我是数学家,所以这是你需要的方程式;)
令P表示原来的交点,称背景平面单位法线为n。这个法线也是我们感兴趣的平面的法线。令 R 表示射线上的一个点,l 表示它的单位方向向量。
那么平面方程是 (xP).n = 0,对于平面中的点 x(. 表示两个向量的点积)。射线上一点的方程是 x = R + t*l,其中 t 是任意实数。因此,当光线与平面相交时
(t*l + R - P).n = 0
即什么时候
t = (P - R).n / ( ln )
这使您可以将值重新插入您的射线方程以给出交点。