我想用鼠标沿着与投影平面平行的平面移动物体。这意味着在移动过程中,任何被选中的物体与相机投影平面(而不是相机位置)之间的距离必须保持不变。有一个类似的问题被问到:鼠标/画布X,Y到Three.js世界坐标系X,Y,Z的转换,但与此不同的是,我需要解决方案适用于任意相机角度和相机/物体位置,而不仅仅是Z=0的平面。它还必须适用于正交投影。现在我创建了一个示例:
圆圈跟随鼠标的位置移动,但它到相机的距离保持不变,因此实际上是在进行球形运动。当切换到正交相机时(点击),它也没有按预期跟随鼠标位置移动。
以下是mousemove事件处理程序中的代码:
var v = new THREE.Vector3(
(event.clientX/window.innerWidth)*2-1,
-(event.clientY/window.innerHeight)*2+1,
1
);
projector.unprojectVector(v,camera);
var dist = circle.position.sub(camera.position,circle.position),
pos = camera.position.clone();
pos = pos.add(pos,
v.sub(v,camera.position).normalize().multiplyScalar(dist.length())
);
圆圈跟随鼠标的位置移动,但它到相机的距离保持不变,因此实际上是在进行球形运动。当切换到正交相机时(点击),它也没有按预期跟随鼠标位置移动。