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中保存的对象会根据距离进行排序,根据项目需要选择
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。