创建多材质对象:

  1. var loader = new THREE.DDSLoader();
  2. var map = loader.load('../assets/textures/Mountains_argb_nomip.dds', function ( texture ) {
  3. texture.magFilter = THREE.LinearFilter;
  4. texture.minFilter = THREE.LinearFilter;
  5. texture.mapping = THREE.CubeReflectionMapping;
  6. material.needsUpdate = true;
  7. });
  8. var material = new THREE.MeshLambertMaterial({envMap: map, transparent: true, opacity: 0.8});
  9. var material1 = new THREE.MeshBasicMaterial({color: 0x2277ff, transparent: true, opacity: 0.3});
  10.  
  11. //
  12. var leftdown1 = new THREE.SceneUtils.createMultiMaterialObject(new THREE.BoxGeometry(6, 1, 9),[material,material1.clone()]);
  13. leftdown1.position.set(-11, 3, 9);
  14. leftdown1.name = "movealbe-element-leftdown1";
  15. group.add(leftdown1);
  16. this.objects.push(leftdown1);

光线跟踪:

  1. onDocumentMouseMove: function (e) {
  2. var event = e || window.event;
  3. event.preventDefault();
  4.  
  5. var mouseX = (event.clientX / map3d.width) * 2 - 1;//标准设备横坐标
  6. var mouseY = -(event.clientY / map3d.height) * 2 + 1;//标准设备纵坐标
  7. var vector = new THREE.Vector3(mouseX, mouseY, 0.5);//标准设备坐标
  8. //标准设备坐标转世界坐标
  9. var worldVector = vector.unproject(map3d.camera);
  10. //射线投射方向单位向量(worldVector坐标减相机位置坐标)
  11. var ray = worldVector.sub(map3d.camera.position).normalize();
  12. //创建射线投射器对象
  13. var raycaster = new THREE.Raycaster(map3d.camera.position, ray);
  14. //返回射线选中的对象
  15. var intersects = raycaster.intersectObjects(map3d.objects,true);
  16. if (intersects.length > 0) {
  17. var obj = intersects[0].object;
  18. var target=null;
  19. if (obj.name.startsWith("movealbe-element")) {
  20. target=obj;
  21. }else{
  22. if(obj.parent && obj.parent.name.startsWith("movealbe-element")){
  23. target=obj.parent;
  24. }
  25. }
  26. if(target){
  27. //如果聚焦的对象存在,并且相同
  28. if (map3d.focusobj && target.uuid == map3d.focusobj.uuid)
  29. return;
  30. //更新最新一次聚焦的对象引用
  31. map3d.focusobj = target;
  32. if(map3d.focusobj.children.length>1)
  33. map3d.focusobj.children[1].material.color = new THREE.Color("#00FF7F");
  34. }
  35. } else {
  36.  
  37. }
  38. },

材质还原:

  1. map3d.scene.traverse(function (e) {
  2. if (e.name && e.name.startsWith("movealbe-element") && map3d.focusobj && map3d.focusobj.uuid != e.uuid) {
  3. if(e.children.length>1)
  4. e.children[1].material.color = new THREE.Color("#2277ff");
  5. }
  6. });

说明:多材质对象,是创建了一个group,可以通过获取子对象来获取这个group。另外加载的3d模型也是group,可以通过这种方式使用raycaster选中模型。

  1. initCityModel:function(){
  2. // this.addModel({name:'powerstation',x:-10});
  3. this.addModel({name:'movealbe-element-powerstation',model:'powerstation',x:0,y:0,z:-10});
  4. },
  5. // 根据模型名称像场景中添加一个模型对象
  6. addModel:function(obj){
  7. var self=this;
  8. if(!obj.model)
  9. return;
  10. if(!obj.path)
  11. obj.path='../assets/models/';
  12. if(!obj.x&&isNaN(obj.x))
  13. obj.x=0;
  14. if(!obj.y&&isNaN(obj.y))
  15. obj.y=0;
  16. if(!obj.z&&isNaN(obj.z))
  17. obj.z=0;
  18.  
  19. var onProgress = function (xhr) {
  20. if (xhr.lengthComputable) {
  21. var percentComplete = xhr.loaded / xhr.total * 100;
  22. console.log(obj.model + Math.round(percentComplete,2) + '% downloaded');
  23. }
  24. };
  25.  
  26. var onError = function () { };
  27.  
  28. new THREE.MTLLoader()
  29. .setPath(obj.path)
  30. .load(obj.model+'.mtl', function (materials) {
  31. materials.preload();
  32.  
  33. new THREE.OBJLoader()
  34. .setMaterials(materials)
  35. .setPath(obj.path)
  36. .load(obj.model+'.obj', function (object) {
  37. object.position.set(obj.x,obj.y,obj.z);
  38. if(obj.name){
  39. object.name=obj.name;
  40. console.log(object);
  41. self.objects.push(object);
  42. }
  43. self.scene.add(object);
  44. },onProgress,onError);
  45. });
  46. },
  1. // 鼠标事件
  2. onDocumentMouseDown: function (e) {
  3. var event = e || window.event;
  4. event.preventDefault();
  5.  
  6. var mouseX = (event.clientX / map3d.width) * 2 - 1;//标准设备横坐标
  7. var mouseY = -(event.clientY / map3d.height) * 2 + 1;//标准设备纵坐标
  8. var vector = new THREE.Vector3(mouseX, mouseY, 0.5);//标准设备坐标
  9. //标准设备坐标转世界坐标
  10. var worldVector = vector.unproject(map3d.camera);
  11. //射线投射方向单位向量(worldVector坐标减相机位置坐标)
  12. var ray = worldVector.sub(map3d.camera.position).normalize();
  13. //创建射线投射器对象
  14. var raycaster = new THREE.Raycaster(map3d.camera.position, ray);
  15. //返回射线选中的对象
  16. var intersects = raycaster.intersectObjects(map3d.objects,true);
  17. console.log(map3d.camera.position);
  18. if (intersects.length > 0) {
  19. // 禁用轨道控制器
  20. // map3d.controls.enabled = false;
  21.  
  22. var obj = intersects[0].object;
  23. var target=null;
  24. if (obj.name.startsWith("movealbe-element")) {
  25. target=obj;
  26. }else{
  27. if(obj.parent && obj.parent.name.startsWith("movealbe-element")){
  28. target=obj.parent;
  29. }
  30. }
  31. // 设置选中的元素
  32. if(target){
  33. map3d.selection = target;
  34. }
  35. } else {
  36. map3d.selection = null;
  37. }
  38. },

three.js:使用createMultiMaterialObject创建的多材质对象无法使用光线跟踪Raycaster选中的更多相关文章

  1. 08-THREE.JS 点面创建物体,克隆物体,多材质物体

    <!DOCTYPE html> <html> <head> <title></title> < <script src=&quo ...

  2. Three.js开发指南---创建,加载高级网格和几何体(第八章)

    本章的主要内容: 一, 通过Three.js自带的功能来组合和合并已有的几何体,创建出新的几何体 二, 从外部资源中加载网格和几何体 1 前面的章节中,我们学习到,一个几何体创建的网格,想使用多个材质 ...

  3. JS面向对象,创建,继承

    很开心,最近收获了很多知识,而且发现很多东西,以前理解的都是错的,或者是肤浅的,还以为自己真的就get到了精髓,也很抱歉会影响一些人往错误的道路上走,不过这也告诉了我们,看任何一篇文章都不能盲目的去相 ...

  4. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  5. JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  6. js函数的创建

    1.js 函数的创建有几种方式: 1.1  直接声明 1.2 创建匿名函数,然后赋值 1.3 声明函数,然后赋值给变量 1.4 使用1.3 得到的变量再赋值给变量 1.5 使用函数对象创建函数 < ...

  7. Unity 游戏开发技巧集锦之创建透明的材质

    Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示. ...

  8. js如何动态创建表格(两种方法)

    js如何动态创建表格(两种方法) 一.总结 一句话总结: 1.方法一:写好创建表格的html代码,将之赋值给div的innerHTML. 2.方法二.直接用创建好的table元素的方法insertRo ...

  9. react快速上手一(使用js语法,创建虚拟DOM元素)

    1.装包,引包 首先需要安装两个包 react ,react-dom cnpm i react react-dom 介绍下这两个包: react:专门用来创建React组件,组件生命周期等这些东西. ...

随机推荐

  1. Spring 内部注入bean

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  2. 2018-计算机系机试(第二批)-B-二进制输出

    B. 二进制输出 单点时限: 1.0 sec 内存限制: 256 MB 输入一个十进制表示的非负整数,输出其 8 位二进制表示. 例如:输入 10 ,输出 00001010. 输入格式 一行一个非负整 ...

  3. 【Java】关于项目启动大请求量高负载时如何确保db等资源不出错的问题

      如果一个项目启动时(单机), 瞬间来了1000个访问, 如何确保db等资源不会压垮呢? 现在想想我当时回答的并不好, 而现在看公司框架才发现其实有针对于这一块做过专门的优化的.下面就来分享下公司关 ...

  4. Tomcat生成的session持久化到MySQL

    Telling Tomcat to save session records in MySQL 此部分内容摘自 MySQL cookbook 3th.具体内容不做翻译,哈哈,懒 The default ...

  5. leetcode 764.Largest Plus Sign

    根据题意的话就是在非0的地方开始寻找上下左右分别能够走到的最大步长的. 那么使用暴力的方法竟然leetcode还是给过了. class Solution { public: int orderOfLa ...

  6. 自学java_Struts2框架

    一.Struts2基础 1.Struts2是有Apache在Struts1和Webwork的基础上研发出的新一代MVC框架. 2.Struts2开发环境的搭建: 打开https://struts.ap ...

  7. tornado--输入和输出

    tornado--输入和输出 tornado的self.write只接受byte,Unicode,dict三种格式的对象. self.write会存在一个缓冲区,当不强制断开缓冲的时候,它会把当前函数 ...

  8. python 使用pip安装使用国内镜像加速下载安装包的方法

    清华大学提供开源镜像站:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ pypi 镜像每 5 分钟同步一次. pip install 包的名字 == 版 ...

  9. git忽视上传规则文件 .gitignore

    语法 语法 作用 例子 "/" 忽略根目录下的文件 /data "*" 忽略所有文件 *.txt => 1.txt,2.txt... "?&qu ...

  10. java面试总躲不过的并发(二):volatile原理 + happens-before原则

    一.happens-before原则 同一个线程中的,前面的操作 happens-before 后续的操作.(即单线程内按代码顺序执行.但是,在不影响在单线程环境执行结果的前提下,编译器和处理器可以进 ...