3

1.构造射线,方向垂直屏幕向内,并反向延申一定距离,防止图形在射线反方向

let raycaster = new Raycaster();
raycaster.setFromCamera({
    x: (ptVcs.x / view.Width) * 2 - 1,
    y: - (ptVcs.y / view.Height) * 2 + 1
}, view.Camera);
raycaster.ray.origin.sub(raycaster.ray.direction.clone().multiplyScalar(1e3));

2.循环场景中对象和射线求交,如果对象有子元素,要考虑是否深度去和子元素求交,这里不考虑有子元素求交的情况

let pickObj: Object3D; //选到的对象
let minDis: number; 对象离射线源点最近的距离,用于选取最近的对象
let intersect;//该对象保存了交点,交点处的法向量,法向量要注意矩阵变换
for (let obj of selectObjects)
{
    let intersects = [];
    if (!obj.visible) continue;
    obj.raycast(raycaster, intersects)
    if (intersects.length > 0)
        if (!minDis || minDis > intersects[0].distance)
        {
            pickObj = obj;
            minDis = intersects[0].distance
            intersect = intersects[0];
        }
}
return { pickObj, intersect };

3.要想获取到该对象周围的对象,可以用交点和对应方向的向量构建射线,在于场景中的对象求交即可,intersects中保存的对象会根据距离进行排序,根据项目需要选择


ZoeLee
104 声望4 粉丝

不忘初心


引用和评论

0 条评论