1. 程式人生 > >通過DragControls控件拖拽三維模型

通過DragControls控件拖拽三維模型

can 參數 尺寸 書寫 格式 所有 list 旋轉 功能

通過鼠標選中一個三維模型,顯示一個三維坐標軸,並且可以通過這個坐標軸來移動三維模型。
本質上,使用鼠標拖動三維模型,就是把鼠標的拖動距離,轉化為三維模型的位置或角度變化量,使用three、js的拖拽控件·DragControls.js·就可以很容容易實現。

引入控件

<!-- 拖拽控件-->
<script src="libs/DragControls.js"></script>
<!-- 可視化平移變換控件 -->
<script src="libs/TransformControls.js"></script>

創建控件對象

// 變換控件對象
var transformControls = new THREE.TransformControls(camera,webGLRenderer.domElement);
// 添加到場景中
scene.add(transformControls);

// 拖拽控件對象
var dragControls = new THREE.DragControls(scene.children,camera,webGLRenderer.domElement);
// 設置鼠標事件
dragControls.addEventListener(‘hoveron‘, function (event) {
   // 變換控件對象與選中的對戲那個object綁定
   transformControls.attach(event.object);
   // 設置三維坐標軸的大小,這個坐標軸不會隨著模型的縮放而縮放
   transformControls.setSize(0.4);
});

如圖所示

技術分享圖片
技術分享圖片
模型繪縮放但是,但是三維坐標軸不會縮放

代碼分析

首先,控件對象TransformControls的作用是可視化操作,默認顯示一個三維坐標軸,該控件對象就是一個三維模型。因此需要添加到場景中,scene.add(transformControls)

拖拽控件對象,DragControls主要作用是當通過鼠標事件選中一個三維模型對象,就會顯示該模型對應的一個三維坐標軸。

addEventListener方法的參數‘hoveron‘表示鼠標平移到三維模型事件,當鼠標平移到一個三維模型上的時候,會彈出該模型對應的一個三維坐標軸。

代碼transformControl.attach( event.object )的作用是實現兩個控件對象的綁定,如果拖拽控件對象DragControls不綁定變換控件對象TransformControls, ‘hoveron‘鼠標事件執行的時候,就不會彈出一個三維坐標軸,變換控件對象TransformControls本質上就是一個網格模型對象,執行方法attach()綁定的時候, 本質上就相當於把一個三維模型的position屬性與三維坐標軸的position屬性進行了關聯,只要坐標軸平移,坐標軸對應的三維模型就會平移。

拖拽控件DragControls.js

查看拖拽控件DragControls.js的源代碼你會發現通過構造函數THREE.Raycaster()創建了一個射線發射器對象,這就說明拖拽控件具有選擇對象的作用。 通過源碼可以查看該控件的使用方法,構造函數的參數是什麽,參數的默認值是什麽,該控件對象有哪些方法和屬性。在實際開發的時候, 也可以根據項目的需要參考控件的源碼重新封裝一個拖拽控件。

構造函數格式:THREE.DragControls = function ( _objects, _camera, _domElement )

_objects表示對象組成的數組,比如所有網格模型對象組成一個數組, 比如scene.children表示的三維場景中的所有光源、網格模型、Object3D對象;_camera表示相機對象,_domElement表示顯示三維場景渲染結果的canvas畫布對象。 不同版本的拖拽控件DragControls.js使用的時候可能略有不同,比如_objects和_camera對象的順序是顛倒的,在學習這些知識的時候不用記憶,團隊協作的時候, 不同的工程師寫的同一功能控件在語法結構基本類似,但是語法細節上可能會略有不同,比如剛剛談到的參數順序不同,所以實際開發的時候可以通過文檔說明書寫程序, 如果沒有文檔說明書,控件的源代碼就是最好的說明書,直接控件源代碼及其註釋即可。

變換控件TransformControls.js

技術分享圖片
該控件配合拖拽控件就可以實現可視化操作三維模型,通過拖拽控件選中一個三維模型,然後通過拖拽控件對象的方法attach()可以把選中的三維模型與控件TransformControls綁定, 你可以把控件對象TransformControls理解為一個特殊的三維模型,比如平移狀態,控件對象TransformControls就是一個三維坐標軸,通過拖動坐標軸就可以移動與坐標軸綁定的三維模型。

通過該控件對象方法setMode的值可以實現三維模型的平移、旋轉和縮放對應不同的可視化操作,比如平移是通過三維坐標軸實現,旋轉通過一個三維圓弧線實現。

旋轉、縮放操作

通過控件對象transformControl的方法setMode("rotate")設置旋轉操作,上面的程序中並沒有設置控件對象transformControl方法setMode的參數,但程序默認的是"translate",表示平移。

transformControl.setMode(‘rotate‘)

縮放操作,模式設置方法setMode的參數使用"scale"。

transformControl.setMode(‘scale‘)

setSize()方法
通過控件對象transformControl的方法setSize()可以設置三維坐標軸的幾何尺寸,方法的參數範圍[0.0,1.0]
transformControl.setSize(0.4);//設置三維坐標軸大小

本文摘自:http://www.yanhuangxueyuan.com/Three.js_course/drag.html 郭隆綁技術博客

通過DragControls控件拖拽三維模型