Files
CADViewComponent/src/PointPick.ts
ChenX ba3e5cabfd 完成下列功能:
1.板件显示
2.板件选中状态
3.标注显示
4.相机控制.
2018-05-24 17:13:23 +08:00

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;
}