renderer.domElement.addEventListener('mousedown', function(event) {
event.preventDefault();
var vector = new THREE.Vector3(
renderer.devicePixelRatio * (event.pageX - this.offsetLeft) / this.width * 2 - 1,
- renderer.devicePixelRatio * (event.pageY - this.offsetTop) / this.height * 2 + 1,
0.5
);
projector.unprojectVector(vector, camera);
var raycaster = new THREE.Raycaster(
camera.position,
vector.sub( camera.position ).normalize()
);
var intersects = raycaster.intersectObjects(YOUR_CLICKABLE_OBJECTS);
if (intersects.length) {
camera.position = intersects[0].point;
// Alternatively, camera.position = intersects[0].object.position.clone();
}
}, false);
このコード:
mousedown
イベントにリスナーを登録します
- 2D 画面空間でクリックした位置を 3D シーン空間の位置に投影します
- カメラからクリックに向かって仮想線 (光線) をキャストします。
- その線と交差するオブジェクトがあるかどうかを確認します。交差する最初のオブジェクトは、クリックされたオブジェクトです
- クリックした位置にカメラをスナップします
クリックした場所にカメラをすぐにスナップするのではなく、ゆっくりと遷移させたい場合は、TweenJSなどのトゥイーン ライブラリを調べて、遷移のタイミングを確認することをお勧めします。
(PS: WebGL レンダラーにのみ存在すると思いrenderer.devicePixelRatio
ます。他のレンダラーでは削除できます。)