59 lines
1.4 KiB
TypeScript
59 lines
1.4 KiB
TypeScript
import { Object3D, Raycaster, Face3, Vector3, Vector2, Mesh } from "three";
|
|
import { Viewer } from ".";
|
|
|
|
interface Intersect
|
|
{
|
|
distance: number;
|
|
face: Face3;
|
|
faceIndex: number;
|
|
object: Object3D;
|
|
point: Vector3;
|
|
uv: Vector2;
|
|
}
|
|
|
|
|
|
/**
|
|
* 点选
|
|
*
|
|
* @export
|
|
* @param {Viewer} view
|
|
* @param {number} ptx
|
|
* @param {number} pty
|
|
* @returns {(Mesh | undefined)}
|
|
*/
|
|
export function PointPick(view: Viewer, ptx: number, pty: number): Mesh | undefined
|
|
{
|
|
let raycaster = new Raycaster();
|
|
raycaster.setFromCamera({
|
|
x: (ptx / view._Width) * 2 - 1, //-1 到 1 所以 (x-(w/2))/(w/2) =>
|
|
y: - (pty / view._Height) * 2 + 1 //y轴相反
|
|
}, view.m_Camera.Camera);
|
|
|
|
//https://github.com/mrdoob/three.js/issues/14128
|
|
raycaster.ray.origin.set((ptx / view._Width) * 2 - 1, - (pty / view._Height) * 2 + 1, -1).unproject(view.m_Camera.Camera);
|
|
|
|
|
|
let minDis = Infinity;
|
|
let minObj = undefined;
|
|
|
|
view.m_Scene.children.forEach(obj =>
|
|
{
|
|
if (obj instanceof Mesh)
|
|
{
|
|
let intersects: Intersect[] = [];
|
|
obj.raycast(raycaster, intersects);
|
|
|
|
for (let i of intersects)
|
|
{
|
|
if (i.distance < minDis)
|
|
{
|
|
minObj = obj;
|
|
minDis = i.distance;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
return minObj;
|
|
}
|