Three.js如何选中外部模型
1.问题
three.js中模型选中使用的是射线法,根据摄像机角度,鼠标点击位置和模型选中的distance参数判断来选中模型。对于原生的矢量模型完全没有问题,但是当遇到导入的外部模型,如obj、stl等的时候,就发现完全选中不了,本文就如果解决选中外部模型和原生模型问题进行解决。
先说说射线法,参考文章:https://blog.csdn.net/qq_30100043/article/details/79054862

2.选中原生矢量模型
直接上代码:
function click(e){
  // 声明 raycaster 和 mouse 变量
    var raycaster = new THREE.Raycaster();
    var mouse = new THREE.Vector2();
    // 通过鼠标点击位置,计算出 raycaster 所需点的位置,以屏幕为中心点,范围 -1 到 1
    mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
    mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
    //通过鼠标点击的位置(二维坐标)和当前相机的矩阵计算出射线位置
    raycaster.setFromCamera(mouse, camera);
    // 获取与射线相交的对象数组,其中的元素按照距离排序,越近的越靠前
    var intersects = raycaster.intersectObjects(scene.children);
    var objs=[];
    for (var i = 0; i < intersects.length; i++) {
        var intersect = intersects[i];
        if (intersect.object instanceof THREE.Mesh) {
            var obj = intersect.object;
            //把距离加到模型用户数据里面,方便后面排序
            obj.userData.distance = intersect.distance;
            objs.push(obj);
        }
    }
    //按照距离排序
    objs = objs.sort(function (a, b) {
    return a.userData.distance - b.userData.distance;
    });
    //objs就是按照距离由近到远排列的选中模型数组集合
    //todo:后面操作渲染展示等等...
    //....
}
3.选中外部模型
内容2中的方法可以实现完美选中立方体、圆柱等矢量三维模型,但是当场景中有obj等3d max导入的外部模型时却无法选中,为什么呢?原因参考文章:https://segmentfault.com/a/1190000004382956。
(图片来源:https://segmentfault.com/a/1190000004382956)
核心原因如上图,外部模型本质是一个group,里面包含了多个mesh,而内容2里面的方法其实只查询了scene下第一层的mesh模型,见下图。
由此可以看出,要想选中外部模型,需要将遍历对象修改为外部模型的children就可以了。代码如下:
function click(e){
  //声明 raycaster 和 mouse 变量
  var raycaster = new THREE.Raycaster();
  var mouse = new THREE.Vector2();
  // 通过鼠标点击位置,计算出 raycaster 所需点的位置,以屏幕为中心点,范围 -1 到 1
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
  //通过鼠标点击的位置(二维坐标)和当前相机的矩阵计算出射线位置
  raycaster.setFromCamera(mouse, camera);
  //找到场景中所有外部模型
    var scensObjs = [];
    main.scene.children.forEach(child => {
    for (var i = 0; i < child.children.length; i++) {
      var obj=child.children[i];
      scensObjs.push(obj);
      }
    });
    //返回选中的外部模型对象
    var intersects = raycaster.intersectObjects(scensObjs);
    var objs = [];
    for (var i = 0; i < intersects.length; i++) {
        var intersect = intersects[i];
        if (intersect.object instanceof THREE.Mesh) {
            var obj = intersect.object.parent;
            //把距离加到模型用户数据里面,方便后面排序
            obj.userData.distance = intersect.distance;
            objs.push(obj);
        }
    }
  //按照距离排序
  objs = objs.sort(function (a, b) {
      return a.userData.distance - b.userData.distance;
  });
  //objs就是按照距离由近到远排列的选中模型数组集合
  //todo:后面操作渲染展示等等...
  //....
}
用上面的方法就可以选中外部模型,不过会遇到一个问题,就是选中的外部模型不是整个模型,而是模型中的一部分,这个与模型有关系,上面就说过一个外部模型其实是一个group,里面有很多个mesh组成,射线法选中的模型只是一个mesh,也就是group的children的某一个。如果想返回整个模型,很简单,取mesh的parent就可以了。代码如下:
//假设selectedMesh是选中的外部模型中的一部分
var selectedMesh=...;
//obj就是整个模型
var obj=selectedMesh.parent;
Three.js如何选中外部模型的更多相关文章
- 【Three.js】如何选中外部模型
		1.问题 three.js中模型选中使用的是射线法,根据摄像机角度,鼠标点击位置和模型选中的distance参数判断来选中模型.对于原生的矢量模型完全没有问题,但是当遇到导入的外部模型,如obj.st ... 
- WebGL three.js学习笔记 加载外部模型以及Tween.js动画
		WebGL three.js学习笔记 加载外部模型以及Tween.js动画 本文的程序实现了加载外部stl格式的模型,以及学习了如何把加载的模型变为一个粒子系统,并使用Tween.js对该粒子系统进行 ... 
- 原始js调用 选中事件
		curRadio.get(0).checked=true;//原始js调用 选中事件,curRadio是radio单个对象 
- js获取选中日期的当周的周一和周日
		js获取选中日期的当周的周一和周日 第一种方法(推荐): function getWeekStr(str) { // 将字符串转为标准时间格式 str2 = Date.parse(str); let ... 
- js中的盒子模型
		说到盒子模型,你第一时间会想到css盒子模型,css中的盒子模型包括(内容区+内边距+边框).那在js中怎么去获取这些属性值呢?下面一起来学习js中的盒子模型. css样式 body { margin ... 
- 【黑金原创教程】【TimeQuest】【第五章】网表质量与外部模型
		声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ... 
- 【黑金原创教程】【TimeQuest】【第六章】物理时钟与外部模型
		声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ... 
- js、css外部文件的相对路径问题
		如果js.css外部文件有使用到相对路径时,需要注意其相对路径的基准是不一样的. 比如说,在index.html中引用到了外部的js和css文件,这两个文件都通过相对路径引用了某一张图片:这些文件所在 ... 
- 【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式
		目录 一. 方案1:ThreeBSP.js或ThreeCSG.js扩展库 二. 方案2:平面镂空模型拉伸 三. 方案3:Cinema 4D建模后输出模型文件 示例代码托管在:http://www.gi ... 
随机推荐
- 基于Docker搭建Nginx图片服务器
			前言 一般开发中,都会把图片上传到一个目录,然后将目录和文件名拼接存储在数据库中,但是,这种方法如果没弄好的话可能有一定的缺陷. 若项目搬迁,即时这台服务器本身还在用,存放在服务器的跟项目相关的图片也 ... 
- CentOS7设置环境变量
			目录 一.环境变量的概念 1.环境变量的含义 2.环境变量的分类 3.Linux环境变量 二.常用的环境变量 1.查看环境变量 2.常用的环境变量 三.设置环境量 1.系统环境变量 2.用户环境变量 ... 
- matplotlib 的几种柱状图
			1.x 表示数量,y 表示名字 import matplotlib.pyplot as plt dic = {'a': 22, 'b': 10, 'c': 6, 'd': 4, 'e': 2, 'f' ... 
- greenplum数据库常用操作
			1. 场景描述 greenplum集群部署好后,软件老王在实际使用过程中碰到一些问题,简单记录下,希望能帮到有需要的朋友. 2 .解决方案 2.1 gpcc监控地址 说明:非常重要,greenplum ... 
- bugku论剑场web解题记录
			前言 国庆这几天感觉没什么好玩的地方,家又离的太远,弱鸡的我便决定刷刷题涨涨知识,于是就有了这篇文章.. 正文 写的不对的地方欢迎指正 web26 打开直接就是代码,这应该就是一道代码审计的题了 这里 ... 
- 多伦多大学&NVIDIA最新成果:图像标注速度提升10倍!
			图像标注速度提升10倍! 这是多伦多大学与英伟达联合公布的一项最新研究:Curve-GCN的应用结果. Curve-GCN是一种高效交互式图像标注方法,其性能优于Polygon-RNN++.在自动模式 ... 
- (线段树 -星星等级)Stars POJ - 2352
			题意: 给出n个星星的坐标 x,y ,当存在其他星星的坐标x1,y1满足x>=x1&&y>=y1时 这个星星的等级就加1. 注意: 题中给的数据是有规律的 ,y是逐渐增加的 ... 
- WiX 简介
			最近研究了一下WIX打包,简单总结一下,方便自己以后查阅,也希望能给需要的人一些提示和帮助. WiX 简介 Windows Installer XML (WiX ) 平台是一组工具与规范,使您能够创建 ... 
- Cplex教育版申请
			任何人:直接在公众号"毒书 彼记" ,“资源下载” 板块下载: 如果你的学校没有购买cplex软件没那么,你就不可以下载教育版的cplex软件,如过下载免费板,它的功能会有一些限制 ... 
- JVM中垃圾回收机制如何判断是否死亡?详解引用计数法和可达性分析 !
			因为热爱,所以坚持. 文章下方有本文参考电子书和视频的下载地址哦~ 这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们 ... 
