three.js:使用createMultiMaterialObject创建的多材质对象无法使用光线跟踪Raycaster选中
创建多材质对象:
- var loader = new THREE.DDSLoader();
- var map = loader.load('../assets/textures/Mountains_argb_nomip.dds', function ( texture ) {
- texture.magFilter = THREE.LinearFilter;
- texture.minFilter = THREE.LinearFilter;
- texture.mapping = THREE.CubeReflectionMapping;
- material.needsUpdate = true;
- });
- var material = new THREE.MeshLambertMaterial({envMap: map, transparent: true, opacity: 0.8});
- var material1 = new THREE.MeshBasicMaterial({color: 0x2277ff, transparent: true, opacity: 0.3});
- //
- var leftdown1 = new THREE.SceneUtils.createMultiMaterialObject(new THREE.BoxGeometry(6, 1, 9),[material,material1.clone()]);
- leftdown1.position.set(-11, 3, 9);
- leftdown1.name = "movealbe-element-leftdown1";
- group.add(leftdown1);
- this.objects.push(leftdown1);
光线跟踪:
- onDocumentMouseMove: function (e) {
- var event = e || window.event;
- event.preventDefault();
- var mouseX = (event.clientX / map3d.width) * 2 - 1;//标准设备横坐标
- var mouseY = -(event.clientY / map3d.height) * 2 + 1;//标准设备纵坐标
- var vector = new THREE.Vector3(mouseX, mouseY, 0.5);//标准设备坐标
- //标准设备坐标转世界坐标
- var worldVector = vector.unproject(map3d.camera);
- //射线投射方向单位向量(worldVector坐标减相机位置坐标)
- var ray = worldVector.sub(map3d.camera.position).normalize();
- //创建射线投射器对象
- var raycaster = new THREE.Raycaster(map3d.camera.position, ray);
- //返回射线选中的对象
- var intersects = raycaster.intersectObjects(map3d.objects,true);
- if (intersects.length > 0) {
- var obj = intersects[0].object;
- var target=null;
- if (obj.name.startsWith("movealbe-element")) {
- target=obj;
- }else{
- if(obj.parent && obj.parent.name.startsWith("movealbe-element")){
- target=obj.parent;
- }
- }
- if(target){
- //如果聚焦的对象存在,并且相同
- if (map3d.focusobj && target.uuid == map3d.focusobj.uuid)
- return;
- //更新最新一次聚焦的对象引用
- map3d.focusobj = target;
- if(map3d.focusobj.children.length>1)
- map3d.focusobj.children[1].material.color = new THREE.Color("#00FF7F");
- }
- } else {
- }
- },
材质还原:
- map3d.scene.traverse(function (e) {
- if (e.name && e.name.startsWith("movealbe-element") && map3d.focusobj && map3d.focusobj.uuid != e.uuid) {
- if(e.children.length>1)
- e.children[1].material.color = new THREE.Color("#2277ff");
- }
- });
说明:多材质对象,是创建了一个group,可以通过获取子对象来获取这个group。另外加载的3d模型也是group,可以通过这种方式使用raycaster选中模型。
- initCityModel:function(){
- // this.addModel({name:'powerstation',x:-10});
- this.addModel({name:'movealbe-element-powerstation',model:'powerstation',x:0,y:0,z:-10});
- },
- // 根据模型名称像场景中添加一个模型对象
- addModel:function(obj){
- var self=this;
- if(!obj.model)
- return;
- if(!obj.path)
- obj.path='../assets/models/';
- if(!obj.x&&isNaN(obj.x))
- obj.x=0;
- if(!obj.y&&isNaN(obj.y))
- obj.y=0;
- if(!obj.z&&isNaN(obj.z))
- obj.z=0;
- var onProgress = function (xhr) {
- if (xhr.lengthComputable) {
- var percentComplete = xhr.loaded / xhr.total * 100;
- console.log(obj.model + Math.round(percentComplete,2) + '% downloaded');
- }
- };
- var onError = function () { };
- new THREE.MTLLoader()
- .setPath(obj.path)
- .load(obj.model+'.mtl', function (materials) {
- materials.preload();
- new THREE.OBJLoader()
- .setMaterials(materials)
- .setPath(obj.path)
- .load(obj.model+'.obj', function (object) {
- object.position.set(obj.x,obj.y,obj.z);
- if(obj.name){
- object.name=obj.name;
- console.log(object);
- self.objects.push(object);
- }
- self.scene.add(object);
- },onProgress,onError);
- });
- },
- // 鼠标事件
- onDocumentMouseDown: function (e) {
- var event = e || window.event;
- event.preventDefault();
- var mouseX = (event.clientX / map3d.width) * 2 - 1;//标准设备横坐标
- var mouseY = -(event.clientY / map3d.height) * 2 + 1;//标准设备纵坐标
- var vector = new THREE.Vector3(mouseX, mouseY, 0.5);//标准设备坐标
- //标准设备坐标转世界坐标
- var worldVector = vector.unproject(map3d.camera);
- //射线投射方向单位向量(worldVector坐标减相机位置坐标)
- var ray = worldVector.sub(map3d.camera.position).normalize();
- //创建射线投射器对象
- var raycaster = new THREE.Raycaster(map3d.camera.position, ray);
- //返回射线选中的对象
- var intersects = raycaster.intersectObjects(map3d.objects,true);
- console.log(map3d.camera.position);
- if (intersects.length > 0) {
- // 禁用轨道控制器
- // map3d.controls.enabled = false;
- var obj = intersects[0].object;
- var target=null;
- if (obj.name.startsWith("movealbe-element")) {
- target=obj;
- }else{
- if(obj.parent && obj.parent.name.startsWith("movealbe-element")){
- target=obj.parent;
- }
- }
- // 设置选中的元素
- if(target){
- map3d.selection = target;
- }
- } else {
- map3d.selection = null;
- }
- },
three.js:使用createMultiMaterialObject创建的多材质对象无法使用光线跟踪Raycaster选中的更多相关文章
- 08-THREE.JS 点面创建物体,克隆物体,多材质物体
<!DOCTYPE html> <html> <head> <title></title> < <script src=&quo ...
- Three.js开发指南---创建,加载高级网格和几何体(第八章)
本章的主要内容: 一, 通过Three.js自带的功能来组合和合并已有的几何体,创建出新的几何体 二, 从外部资源中加载网格和几何体 1 前面的章节中,我们学习到,一个几何体创建的网格,想使用多个材质 ...
- JS面向对象,创建,继承
很开心,最近收获了很多知识,而且发现很多东西,以前理解的都是错的,或者是肤浅的,还以为自己真的就get到了精髓,也很抱歉会影响一些人往错误的道路上走,不过这也告诉了我们,看任何一篇文章都不能盲目的去相 ...
- JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- js函数的创建
1.js 函数的创建有几种方式: 1.1 直接声明 1.2 创建匿名函数,然后赋值 1.3 声明函数,然后赋值给变量 1.4 使用1.3 得到的变量再赋值给变量 1.5 使用函数对象创建函数 < ...
- Unity 游戏开发技巧集锦之创建透明的材质
Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示. ...
- js如何动态创建表格(两种方法)
js如何动态创建表格(两种方法) 一.总结 一句话总结: 1.方法一:写好创建表格的html代码,将之赋值给div的innerHTML. 2.方法二.直接用创建好的table元素的方法insertRo ...
- react快速上手一(使用js语法,创建虚拟DOM元素)
1.装包,引包 首先需要安装两个包 react ,react-dom cnpm i react react-dom 介绍下这两个包: react:专门用来创建React组件,组件生命周期等这些东西. ...
随机推荐
- Spring 内部注入bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 2018-计算机系机试(第二批)-B-二进制输出
B. 二进制输出 单点时限: 1.0 sec 内存限制: 256 MB 输入一个十进制表示的非负整数,输出其 8 位二进制表示. 例如:输入 10 ,输出 00001010. 输入格式 一行一个非负整 ...
- 【Java】关于项目启动大请求量高负载时如何确保db等资源不出错的问题
如果一个项目启动时(单机), 瞬间来了1000个访问, 如何确保db等资源不会压垮呢? 现在想想我当时回答的并不好, 而现在看公司框架才发现其实有针对于这一块做过专门的优化的.下面就来分享下公司关 ...
- Tomcat生成的session持久化到MySQL
Telling Tomcat to save session records in MySQL 此部分内容摘自 MySQL cookbook 3th.具体内容不做翻译,哈哈,懒 The default ...
- leetcode 764.Largest Plus Sign
根据题意的话就是在非0的地方开始寻找上下左右分别能够走到的最大步长的. 那么使用暴力的方法竟然leetcode还是给过了. class Solution { public: int orderOfLa ...
- 自学java_Struts2框架
一.Struts2基础 1.Struts2是有Apache在Struts1和Webwork的基础上研发出的新一代MVC框架. 2.Struts2开发环境的搭建: 打开https://struts.ap ...
- tornado--输入和输出
tornado--输入和输出 tornado的self.write只接受byte,Unicode,dict三种格式的对象. self.write会存在一个缓冲区,当不强制断开缓冲的时候,它会把当前函数 ...
- python 使用pip安装使用国内镜像加速下载安装包的方法
清华大学提供开源镜像站:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ pypi 镜像每 5 分钟同步一次. pip install 包的名字 == 版 ...
- git忽视上传规则文件 .gitignore
语法 语法 作用 例子 "/" 忽略根目录下的文件 /data "*" 忽略所有文件 *.txt => 1.txt,2.txt... "?&qu ...
- java面试总躲不过的并发(二):volatile原理 + happens-before原则
一.happens-before原则 同一个线程中的,前面的操作 happens-before 后续的操作.(即单线程内按代码顺序执行.但是,在不影响在单线程环境执行结果的前提下,编译器和处理器可以进 ...