threejs实现点击模型选中以及对选中模型修改材质

利用 groud来实现对模型的存储

let group = new THREE.Group();

模型加入场景修改

  var scene = new THREE.Scene();
 var loaderStl = new THREE.STLLoader();
			//导入模型
			loaderStl.load('离心叶轮.stl', function(geometry) {

				geometry.name = "李欣"
				console.log(geometry);
				var demoMaterial = new THREE.PointsMaterial({
					color: 0x0000ff,
					size: 0.5 //点对象像素尺寸
				})

				var meshd = new THREE.Points(geometry, demoMaterial)
				group.add(meshd)
				scene.add(group)

			})
 //先将对应的模型加入 对应的groud中,再讲整个groud 加入场景,同时为模型定义唯一的名字,方便后期知道是否点击了整个模型

获取点击模型的数据(具体原理无)

//获取与射线相交的对象数组
			function getIntersects(event) {
				event.preventDefault(); // 阻止默认的点击事件执行, https://developer.mozilla.org/zh-CN/docs/Web/API/Event/preventDefault
				//console.log("event.clientX:" + event.clientX);
				//console.log("event.clientY:" + event.clientY);

				//声明 rayCaster 和 mouse 变量
				let rayCaster = new THREE.Raycaster();
				let mouse = new THREE.Vector2();

				//通过鼠标点击位置,计算出raycaster所需点的位置,以屏幕为中心点,范围-1到1
				mouse.x = ((event.clientX - document.body.getBoundingClientRect().left) / document.body.offsetWidth) * 2 - 1;
				mouse.y = -((event.clientY - document.body.getBoundingClientRect().top) / document.body.offsetHeight) * 2 +1; //这里为什么是-号,没有就无法点中

				//通过鼠标点击的位置(二维坐标)和当前相机的矩阵计算出射线位置
				rayCaster.setFromCamera(mouse, camera);

				//获取与射线相交的对象数组, 其中的元素按照距离排序,越近的越靠前。
				//+true,是对其后代进行查找,这个在这里必须加,因为模型是由很多部分组成的,后代非常多。
				console.log(group)
				let intersects = rayCaster.intersectObjects(group.children, true);

				//返回选中的对象

				// console.log(intersects)

				return intersects;
			}

document.body 为场景,整个根据具体需求去修改

判断是否点击了模型

//鼠标双击触发的方法
			function onMouseDblclick(event) {
				//获取raycaster和所有模型相交的数组,其中的元素按照距离排序,越近的越靠前
				let intersects = getIntersects(event);
				// console.log(intersects);
				// console.log(intersects[0].object);
				
				//获取选中最近的Mesh对象
				//instance坐标是对象,右边是类,判断对象是不是属于这个类的
				if (intersects.length !== 0 && intersects[0].object.geometry.name === '李欣') {

					console.log(intersects, 'xuanz')
					console.log('Mesh!');

					for (var i = 0; i < intersects.length; i++) {
                        
						if(intersects[i].object.geometry.name === '李欣'){
							intersects[i].object.material.color.set(0xff0000);//变为红色
						}
						
						// render();
					}

				} else {
					console.log('未选中 Mesh!');
				}
			}

			document.addEventListener('click', onMouseDblclick);
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

圣京都

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值