我创建了一个光线投射器,使我可以用鼠标从场景中拾取物体,如下所示:
this.raycaster = new THREE.Raycaster()
// then in onMouseDown event
this.raycaster.setFromCamera(this.mouse, this.camera)
let intersects = this.raycaster.intersectObjects(this.scene.children)
当我平移相机和偏航相机时,它可以按预期工作,但是,一旦我倾斜相机,光线投射器就会使对象与物体在屏幕上渲染的地方相交。如果我从对象上方看,光线投射器将在渲染对象的上方与对象相交。如果我在对象下面看,光线投射器将在渲染对象下与该对象相交。
this.yaw = new THREE.Object3D()
this.pitch = new THREE.Object3D()
this.camera = new THREE.PerspectiveCamera(70, this.width / this.height, 0.01, 50)
this.yaw.add(this.pitch.add(this.camera))
this.scene = new THREE.Scene().add(this.yaw)
// then in onMouseMove event
if (this.state === this.STATE.PAN) {
this.yaw.translateX(-this.mouseDelta.x)
this.yaw.translateZ(-this.mouseDelta.y)
}
if (this.state === this.STATE.ROTATE) {
this.yaw.rotation.y -= this.mouseDelta.x
this.pitch.rotation.x -= this.mouseDelta.y
}
我尝试禁用除音调之外的所有变换,并且问题仍然存在。我认为问题可能出在射线发生器上,而不是物体本身,因为物体在一个位置渲染而在另一位置相交是没有意义的。
我在做什么错?旋转后,光线投射器是否可能不会从相机的原点投射?
答案 0 :(得分:1)
当我将鼠标指向对象上方时,单击鼠标上方的对象时,光线投射器正在检测相交,因为mouse.y坐标未正确归一化。
// Incorrect
this.mouse.y = (e.clientY / window.innerHeight) * 2 - 1
// Correct
this.mouse.y = -(e.clientY / window.innerHeight) * 2 + 1
通过排除否定,我的mouse.y位置有效地反映在场景中。因此,如果我单击场景的最高点,则将对光线投射器进行镜像以检测场景的最低点处的交叉点。
当没有俯仰角时这不是问题,因为我正在测试与相机水平放置的盒子几何形状。因此,由于几何图形是对称的,因此在射线发生器上进行的任何镜像操作仍会检测到碰撞。