1 完整代码下载

  https://pan.baidu.com/s/1JJyVcP2KqXsd5G6eaYpgHQ  

  提取码 3fzt (压缩包名: 2020-4-5-demo.zip)

2 图片展示

3 主要代码

  1. "use strict"
  2.  
  3. class InitControl{
  4.  
  5. constructor(View, Three){
  6. this.view = View;
  7. this.three = Three;
  8. this.target = {object: null, isDown: false, isMove: false};
  9. this.dragTarget = {};
  10. this.group = this.add(new THREE.Group(), null, true);
  11. this.setDrag(Three.scene, Three.camera, Three.renderer, this.group.children);
  12. this.setOrbit(Three.scene, Three.camera, Three.renderer);
  13. this.setTransform(Three.scene, Three.camera, Three.renderer);
  14. this.setEvents(View, Three);
  15. this.view.updateLanguage(this.group, "ch");//更改为中文字体
  16. }
  17.  
  18. add (a, b, c){ // a 添加至-> b, c 如果没有定义,新添加的对象将自动获得焦点
  19. a = this.three.add(a, b);
  20. this.view.addList(a, b);
  21. if(c === undefined) this.setTarget(a, {focusList: true});
  22. return a;
  23. }
  24.  
  25. remove (a){
  26. this.removeTarget(a);
  27. this.view.removeList(a);
  28. this.three.remove(a);
  29. this.three.update();
  30. }
  31.  
  32. setDrag(scene, camera, renderer, children){
  33. let drag = new THREE.DragControls(children, camera, renderer.domElement);
  34. drag.addEventListener('hoveron', (e)=>{
  35. this.dragTarget.old = null;
  36. this.dragTarget.now = e.object;
  37. });
  38. drag.addEventListener('hoveroff', (e)=>{
  39. this.dragTarget.now = null;
  40. this.dragTarget.old = e.object;
  41. });
  42. drag.enabled = false;
  43. this.drag = drag;
  44. }
  45.  
  46. setOrbit(scene, camera, renderer){
  47. let orbit = new THREE.OrbitControls(camera, renderer.domElement);
  48. orbit.target = new THREE.Vector3(0, 0, 0);//控件焦点
  49. //orbit.minPolarAngle = Math.PI * 0.3;//向上最大角度
  50. //orbit.maxPolarAngle = Math.PI * 0.4;//向下最大角度
  51. orbit.minDistance = camera.near;//最小距离
  52. orbit.maxDistance = camera.far;//最大距离
  53. orbit.autoRotateSpeed = 10;//自动旋转速度
  54. //orbit.panSpeed = 100;//鼠标旋转速度
  55. orbit.enableZoom = true;//是否启用缩放
  56. orbit.enableKeys = true;//是否启用键盘
  57. orbit.panSpeed = 1;//鼠标平移速度
  58. orbit.keyPanSpeed = 100;//按键平移的速度
  59. orbit.keys.LEFT = 65;//key a左
  60. orbit.keys.UP = 87;//key w前
  61. orbit.keys.RIGHT = 68;//key d右
  62. orbit.keys.BOTTOM = 83;//key s后
  63. orbit.addEventListener("change", ()=>{renderer.render(scene, camera);});
  64. this.orbit = orbit;
  65. }
  66.  
  67. setTransform(scene, camera, renderer){
  68. var transform = new THREE.TransformControls(camera, renderer.domElement);
  69. transform.size = 1;
  70. scene.add(transform);
  71. this.transform = transform;
  72. transform.addEventListener( 'dragging-changed', (e)=>{this.orbit.enabled = !e.value;});
  73. transform.addEventListener('change', (e)=>{
  74. let type = transform.getMode(), mesh = this.target.object || e.target.object;
  75. let hc = mesh.WHX.elem.listContent.mesh.object;
  76. switch(type){
  77. case "translate":
  78. hc.position.x = mesh.position.x;
  79. hc.position.y = mesh.position.y;
  80. hc.position.z = mesh.position.z;
  81. break;
  82. case "rotate":
  83. hc.rotation.x = mesh.rotation.x;
  84. hc.rotation.y = mesh.rotation.y;
  85. hc.rotation.z = mesh.rotation.z;
  86. break;
  87. case "scale":
  88. hc.scale.x = mesh.scale.x;
  89. hc.scale.y = mesh.scale.y;
  90. hc.scale.z = mesh.scale.z;
  91. break;
  92. default: break;
  93. }
  94. this.three.boxHelper.update();
  95. renderer.render(scene, camera);
  96. });
  97. }
  98.  
  99. setTarget(object, param){
  100. this.removeTarget(this.target.object);
  101. if(!object || !object.WHX) return;
  102. param = param || {};
  103. this.three.boxHelper.setFromObject(object);
  104. this.three.boxHelper.visible = true;
  105. this.transform.attach(object);
  106. if(param.focusListStyle === undefined) this.view.focusListStyle(object.WHX.elem.son);
  107. if(param.focusList === true) this.view.focusList(object);
  108. object.WHX.elem.listContent.mesh.father.style.display = "block";//if(param.listContent === undefined) this.view.objectContents(object);
  109. this.target.object = object;
  110. this.three.update();
  111. }
  112.  
  113. removeTarget(object){
  114. if(!object || !object.WHX) return;
  115. this.three.boxHelper.visible = false;
  116. this.transform.detach(object);
  117. this.view.focusListStyle(object.WHX.elem.son, "remove");
  118. object.WHX.elem.listContent.mesh.father.style.display = "none"; //this.view.objectContents();
  119. this.target.object = null;
  120. this.three.update();
  121. }
  122.  
  123. setEvents(View, Three){
  124.  
  125. let _holdGroup = null, getObject = (a)=>{
  126. if(a.WHX_ID === undefined){return;}
  127. let o = Three.scene.getObjectById(a.WHX_ID);
  128. if(o === undefined){console.log("获取对象失败"); return;}
  129. //let object = a.tagName === "SUMMARY" ? o.WHX.backGroup : o;
  130. return o;
  131. }
  132.  
  133. //scene -> list
  134. let down = ()=>{this.target.isDown = true;}
  135. let move = ()=>{if(this.target.isDown === true && this.target.isMove === false) this.target.isMove = true;}
  136. let up = ()=>{
  137. if(this.target.isMove === false) this.setTarget(this.dragTarget.now, {focusList:true});
  138. this.target.isMove = false;
  139. this.target.isDown = false;
  140. Three.renderer.domElement.removeEventListener("mousedown", down);
  141. Three.renderer.domElement.removeEventListener("mousemove", move);
  142. Three.renderer.domElement.removeEventListener("mouseup", up);
  143. }
  144. View.addEvent(Three.renderer.domElement, "mousedown", down);
  145. View.addEvent(Three.renderer.domElement, "mousemove", move);
  146. View.addEvent(Three.renderer.domElement, "mouseup", up);
  147.  
  148. //list -> scene
  149. View.targetCallback = (a)=>{
  150. if(a.WHX_control_ID !== undefined){ //WHX_control_ID = 0 删除 1 复制 2 子级
  151. if(_holdGroup !== null) _holdGroup = null;
  152. if(a.WHX_control_ID === 2) a.style.background = "rgba(0, 0, 200, 0.5)";
  153. let o = this.target.object;
  154. switch(a.WHX_control_ID){
  155. case 0: this.remove(o); break;
  156. case 1: this.setTarget(this.add(o.clone(true), o)); break;
  157. case 2: _holdGroup = o; this.setTarget(o); break;
  158. default: break;
  159. }
  160. return;
  161. }
  162.  
  163. if(_holdGroup !== null){//分组操作
  164. let o = getObject(a);
  165. if(o){
  166. this.remove(o);
  167. this.add(o, _holdGroup);
  168. }
  169. _holdGroup = null;
  170. View.right.t_control[3].style.background = "";
  171. this.setTarget(o); return;
  172. }
  173.  
  174. this.setTarget(getObject(a));
  175. }
  176.  
  177. }
  178.  
  179. }

javascript 3d网页 示例 ( three.js 初探 七)的更多相关文章

  1. 网页3D效果库Three.js初窥

    网页3D效果库Three.js初窥 背景 一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手 ThreeJs官网 ThreeJs-github; 接下来我会陆续翻译 ...

  2. [JS]jQuery,javascript获得网页的高度和宽度

    [JS]jQuery,javascript获得网页的高度和宽度网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeigh ...

  3. Javascript模块化编程:require.js的用法

    摘自:http://blog.jobbole.com/30046/ 这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库 ...

  4. Three.js学习笔记 – “我和小伙伴都惊呆了”的特效和Three.js初探

    什么是Three.js three.js是JavaScript编写的WebGL第三方库.提供了非常多的3D显示功能.Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包 ...

  5. JavaScript交互式网页设计 • 【第1章 JavaScript 基本语法】

    全部章节   >>>> 本章目录 1.1 JavaScript 概述 1.1.1 JavaScript 简介 1.1.2 JavaScript 的概念和执行原理 1.1.3 J ...

  6. 将JavaScript 插入网页的方法

    将JavaScript 插入网页的方法 使用Javascript代码. 插入JavaScript 与在网页中插入CSS的方式相似.使用下面的代码可以在网页中插入JavaScript: ... 其中的. ...

  7. [转]backbone.js 初探

    本文转自:http://weakfi.iteye.com/blog/1391990 什么是backbone backbone不是脊椎骨,而是帮助开发重量级的javascript应用的框架. 主要提供了 ...

  8. Javascript调用ActiveX示例

      Javascript调用ActiveX示例   写一个ActiveX控件比如叫做MyNameSpace.SecreteInfo,安装在客户机器上,这样可以通过c++获取到机器的几乎任何信息. 在网 ...

  9. jquery的height()和javascript的height总结,js获取屏幕高度

    jquery的height()和javascript的height总结,js获取屏幕高度 2014年9月18日 15048次浏览 引子 今天是九一八事变八十三周年,大家勿忘国耻!加油学习!经济和技术等 ...

随机推荐

  1. 关于 服务器ip和域名进行一个绑定

    最近想让人访问我做个一个网站,但是我发现让服务器ip地址直接暴露不是很好 (做着玩) 于是就去阿里云买了一个5块1年的域名 先在网上百度了一下是怎么绑定域名的,发现全是含糊不清的信息,果然是垃圾百度 ...

  2. 关于JS的数据类型与转化(自动与强制)

    在我们谈到JS的数据类型转化时,一定会知道分为自动转化和强制转化两种方式吧,通俗来讲,自动就是在某种条件下,电脑浏览器自己会把其他类型的数据转化为相应的数据类型,而强制则是咋们程序员应该手动来做的了, ...

  3. MATLAB神经网络(5) 基于BP_Adaboost的强分类器设计——公司财务预警建模

    5.1 案例背景 5.1.1 BP_Adaboost模型 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类.其主要步骤为:首先给出弱学习算法和样本空间($X$,$Y$),从样本空间 ...

  4. Wireshark过滤器写法总结

    目录 #Wireshark提供了两种过滤器: 1.捕获过滤器 2.显示过滤器 #过滤器具体写法 #显示过滤器写法 #捕捉过滤器写法 #Wireshark提供了两种过滤器: 1.捕获过滤器 捕获过滤器: ...

  5. js Number方法总结

    Number构造属性 Number.EPSILON // 两个可表示(representable)数之间的最小间隔. Number.MAX_SAFE_INTEGER // JavaScript 中最大 ...

  6. javaScript 基础知识汇总 (十)

    1.New Function 语法:let func = new Function ([arg1[, arg2[, ...argN]],] functionBody) //无参数示例: let say ...

  7. rimraf node_modules 突然不能用了 怀疑是yarn的问题,从环境变量将yarn删掉,能用了

    rimraf node_modules 突然不能用了 怀疑是yarn的问题,从环境变量将yarn删掉,能用了

  8. SpringBoot2整合Redis多数据源

    配置文件属性 spring: redis: database: 1 host: 192.168.50.144 port: 6379 password: timeout: 600 #Springboot ...

  9. ASP.NET Core 3.x 中间件流程与路由体系

    中间件分类 ASP.NET Core 中间件的配置方法可以分为以上三种,对应的Helper方法分别是:Run(), Use(), Map(). Run(),使用Run调用中间件的时候,会直接返回一个响 ...

  10. 【西北大学集训队选拔赛】D温暖的签到题(自创数据结构)

    题目链接 #include <bits/stdc++.h> #define NUM #define ll long long using namespace std; int n, m; ...