完成下列功能:
1.板件显示 2.板件选中状态 3.标注显示 4.相机控制.
This commit is contained in:
58
src/PointPick.ts
Normal file
58
src/PointPick.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user