javascript 3d網頁 示例 ( three.js 初探 七)

来源:https://www.cnblogs.com/weihexinCode/archive/2020/04/10/12675513.html
-Advertisement-
Play Games

1 完整代碼下載 https://pan.baidu.com/s/1JJyVcP2KqXsd5G6eaYpgHQ 提取碼 3fzt (壓縮包名: 2020-4-5-demo.zip) 2 圖片展示 3 主要代碼 1 "use strict" 2 3 class InitControl{ 4 5 co ...


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         
134         //scene -> list
135         let down = ()=>{this.target.isDown = true;}
136         let move = ()=>{if(this.target.isDown === true && this.target.isMove === false) this.target.isMove = true;}
137         let up = ()=>{
138             if(this.target.isMove === false) this.setTarget(this.dragTarget.now, {focusList:true});
139             this.target.isMove = false;
140             this.target.isDown = false;
141             Three.renderer.domElement.removeEventListener("mousedown", down);
142             Three.renderer.domElement.removeEventListener("mousemove", move);
143             Three.renderer.domElement.removeEventListener("mouseup", up);
144         }
145         View.addEvent(Three.renderer.domElement, "mousedown", down);
146         View.addEvent(Three.renderer.domElement, "mousemove", move);
147         View.addEvent(Three.renderer.domElement, "mouseup", up);
148         
149         
150         //list -> scene
151         View.targetCallback = (a)=>{
152             if(a.WHX_control_ID !== undefined){ //WHX_control_ID = 0 刪除  1 複製  2 子級
153                 if(_holdGroup !== null) _holdGroup = null;
154                 if(a.WHX_control_ID === 2) a.style.background = "rgba(0, 0, 200, 0.5)";
155                 let o = this.target.object;
156                 switch(a.WHX_control_ID){
157                     case 0: this.remove(o); break;
158                     case 1: this.setTarget(this.add(o.clone(true), o)); break;
159                     case 2: _holdGroup = o; this.setTarget(o); break;
160                     default: break;
161                 }
162                 return;
163             }
164             
165             if(_holdGroup !== null){//分組操作
166                 let o = getObject(a);
167                 if(o){
168                     this.remove(o);
169                     this.add(o, _holdGroup);
170                 }
171                 _holdGroup = null; 
172                 View.right.t_control[3].style.background = "";
173                 this.setTarget(o); return;
174             }
175             
176             this.setTarget(getObject(a));
177         }
178         
179     }
180 
181 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第3章 你也有控制權(DOM操作) 如何用JavaScript去操作HTML元素和CSS樣式,實現簡單的動態操作。 3-1 認識DOM 3-2 通過ID獲取元素 3-3 innerHTML 屬性 3-4 改變 HTML 樣式 3-5 顯示和隱藏(display屬性) 3-6 控制類名(classNa ...
  • 佈局的常用方法有幾下幾種 一,float佈局 float 屬性定義元素在哪個方向浮動。以往這個屬性總應用於圖像,使文本圍繞在圖像周圍,不過在 CSS 中,任何元素都可以浮動。 浮動元素會生成一個塊級框,而不論它本身是何種元素。 屬性值: float:left 元素向左浮動。 float:reght ...
  • JavaScript中 沒有 塊級作用域,“塊級作用域”中聲明的變數將被添加到 當前 的執行環境中 在JavaScript中,由for語句創建的變數,即使在for迴圈執行結束後,也依舊會存在於迴圈外部的執行環境中。 javascript function add(num1, num2) { var ...
  • 項目構建打包--webpack cnpm run build 打包完成後會提示你,不能在本地打開,必須啟用伺服器才能打開 而且生成了一個dist目錄 這個目錄就是可以發佈的目錄,只要放到伺服器上去即可 ...
  • 完整效果演示 首先完成這個偽搜索框 src/components/search/index.vue (通用搜索框組件) <template> <div class="mine-search-box-wrapper"> <i class="iconfont icon-search"></i> <div ...
  • 使用背景圖,製作雪碧圖效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> < ...
  • 相容性 相容性如下圖所示 ( "摘自 mdn" ) 解決方法 由於getComputedStyle方法在IE瀏覽器中只相容IE9及其以上,而IE8和它之前的瀏覽器則需要使用currentStyle方法來獲取樣式,所以我們就可以自定義一個getStyle方法來解決相容性的問題 代碼 自定義getSty ...
  • Flex 是 CSS3 推出的一種佈局方式,至今有超過十年時間了 要實現 Flex 佈局很容易,只需要給一個元素的 屬性設置為 就行 咋看之下好像沒什麼變化,那是因為受到影響的其實是其內部的元素,給這個容器內添加幾個元素就可以看到效果 可以看到的是預設情況下應該獨占一行的 `` 元素現在全部擠在了一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...