Three.js select 带摄像头的对象,没有鼠标
Three.js select object with camera, no mouse
在 Three.js 应用程序中,我想获取透视相机指向的对象,为此我阅读了 raycaster 文档。
我找到的所有文档都在谈论使用相机和鼠标坐标的 Vector2 进行光线投射,但我不想使用鼠标的 2d 坐标。相机可以出于任何原因旋转:单击并拖动屏幕,触摸控制甚至 VR 控制,我只想从透视相机的中心点进行光线投射并设置为 "selected" 它所注视的对象。
有什么建议吗?
THREE.Raycaster.set()
期望 origin
和一个 direction
向量:
origin — The origin vector where the ray casts from.
direction — The direction vector that gives direction to the ray. Should be normalized.
将摄像机的世界位置设置为 origin
并将其世界方向设置为 direction
:
var raycaster = new THREE.Raycaster();
raycaster.set( camera.getWorldPosition(), camera.getWorldDirection() );
var intersects = raycaster.intersectObjects( objectsArray );
if ( intersects.length > 0 ) {
//...
}
Falk 的代码仍然有效,但 Three.js (>r90) 要求您定义一个目标 [1]:
target is now required
您所要做的就是:
let camera_world_pos = new THREE.Vector3();
let camera_world_dir = new THREE.Vector3();
let raycaster = new THREE.Raycaster();
camera.getWorldPosition(camera_world_pos);
camera.getWorldDirection(camera_world_dir);
raycaster.set(camera_world_pos, camera_world_dir);
let intersects = raycaster.intersectObjects( objectsArray );
if ( intersects.length > 0 ) {
//...
}
在 Three.js 应用程序中,我想获取透视相机指向的对象,为此我阅读了 raycaster 文档。 我找到的所有文档都在谈论使用相机和鼠标坐标的 Vector2 进行光线投射,但我不想使用鼠标的 2d 坐标。相机可以出于任何原因旋转:单击并拖动屏幕,触摸控制甚至 VR 控制,我只想从透视相机的中心点进行光线投射并设置为 "selected" 它所注视的对象。
有什么建议吗?
THREE.Raycaster.set()
期望 origin
和一个 direction
向量:
origin — The origin vector where the ray casts from.
direction — The direction vector that gives direction to the ray. Should be normalized.
将摄像机的世界位置设置为 origin
并将其世界方向设置为 direction
:
var raycaster = new THREE.Raycaster();
raycaster.set( camera.getWorldPosition(), camera.getWorldDirection() );
var intersects = raycaster.intersectObjects( objectsArray );
if ( intersects.length > 0 ) {
//...
}
Falk 的代码仍然有效,但 Three.js (>r90) 要求您定义一个目标 [1]:
target is now required
您所要做的就是:
let camera_world_pos = new THREE.Vector3();
let camera_world_dir = new THREE.Vector3();
let raycaster = new THREE.Raycaster();
camera.getWorldPosition(camera_world_pos);
camera.getWorldDirection(camera_world_dir);
raycaster.set(camera_world_pos, camera_world_dir);
let intersects = raycaster.intersectObjects( objectsArray );
if ( intersects.length > 0 ) {
//...
}