function getIntersects(event) {
event.preventDefault();
let raycaster = new THREE.Raycaster();
let mouse = new THREE.Vector2();
//通过鼠标点击的位置计算出raycaster所需要的点的位置,以屏幕中心为原点,值的范围为-1到1.
let width = renderer.domElement.clientWidth;
let height = renderer.domElement.clientHeight;
let offsetX = renderer.domElement.getBoundingClientRect().left;
let offsetY = renderer.domElement.getBoundingClientRect().top;
mouse.x = ((event.clientX - offsetX) / width) * 2 - 1;
mouse.y = -((event.clientY - offsetY) / height) * 2 + 1;
// 通过鼠标点的位置和当前相机的矩阵计算出raycaster
raycaster.setFromCamera(mouse, camera);
// 获取raycaster直线和所有模型相交的数组集合
let intersects = raycaster.intersectObjects(group.children);
//返回选中的对象
return intersects;
}
// 鼠标双击触发的方法
function onMouseDblclick(event) {
// 获取 raycaster 和所有模型相交的数组,其中的元素按照距离排序,越近的越靠前
let intersects = getIntersects(event);
// 获取选中最近的 Mesh 对象
if (intersects.length != 0 && intersects[0].object instanceof THREE.Mesh) {
group.traverse(function (infoRow) {
//通过网格匹配
if(infoRow.isMesh){
infoRow.material.color.set(0xcccccc);//默认色
selectObject = intersects[0].object;
changeMaterial(selectObject);
}
})
for (let i = 0; i < array.length; i++){
if (selectObject.name == array[i].name){
selectObject = array[i];
}
}
} else {
alert("警告:您未选中人体骨架!");
}
}
//选中骨骼变为红色
function changeMaterial(object) {
object.material.color.set( 0xff0000 );
}
// 更新div的位置
function renderDiv(object) {
// 修改 div 的位置
$("#label").css({
left: window.innerWidth * 3 / 4 ,
top: window.innerHeight / 4 ,
width: window.innerWidth / 6,
height: window.innerHeight / 3
});
// 显示模型信息
$("#label").text("骨骼描述: " + object.describe);
}