射线拾取

获取鼠标坐标及选取模型

Posted by OYH on March 3, 2018

以下纯属个人观点

方式

我所知道的选取模型分两种,

  1. 一种是代码创建的如正方体等,类型的mesh的;
  2. 一种是外部导入的模型如:obj后缀的,类型为Group的;
mesh
var mouse = new THREE.Vector2();	//初始化鼠标位置
var raycaster = new THREE.Raycaster();	//模拟涉嫌
window.addEventListener("mousedown",onMouseDown,false); //当鼠标按下是触发
function onMouseDown(event){
    event.preventDefault();	//阻止默认事件的触发
    mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;	//获取鼠标X坐标
    mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1; //获取鼠标Y坐标
    raycaster.setFromCamera(mouse,camera);	//用相机和鼠标位置更新射线
    var intersects = raycaster.intersectObjects(scene.children); //计算与射线相交的物体
    if(intersects.length>0){	//如果大于0,则鼠标选中的提为intersects[0]
        console.log(intersects);
    }
}
Group
var mouse = new THREE.Vector2();
var raycaster = new THREE.Raycaster();
window.addEventListener("mousedown",onMouseDown,false)
function onMouseDown(event){
    event.preventDefault();
    mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
    mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
    raycaster.setFromCamera(mouse,camera);
    for(key in scene.children){
        console.log(scene.children[key]);
        if(scene.children[key].type === 'Group'){
            var intersects = raycaster.intersectObjects(scene.children[key].children);
            if(intersects.length>0){
                console.log(intersects[0]);
            }
        }
    }
}