2013-10-14 43 views
0

我在我的場景中遇到了object3d選擇的問題。如何用domevent.js選擇一個組(object3d)?

我使用three.js r61和domevent.js庫。

我已經添加了THREE.Object3D修補程序,但似乎不起作用。

我有一個mesh或object3d對象的列表。

當我嘗試捕獲一個對象點擊時,如果對象是一個網格物體,但如果它是一個組,則所有工作正常。

每個對象都添加objects.push(object); //網或object3d

下面是代碼:

// Objects selection 
THREE.Object3D._threexDomEvent.camera(camera); 
THREE.Object3D._threexDomEvent.domElement(renderer.domElement); 
for (object in objects) 
{ 
    // Bind depends on object type 
    var bindControl = objects[object]; 
    console.log('bind ' + bindControl.name); 
    bindControl.on('click', function(object3d) { 
     console.log('ok'); 
     seletedObject = object3d.target; 
     console.log('selected : ' + object3d.target.name); 
    }); 
    ... 
} 

所以domevent工作正常的網是直接在現場,但如果我點擊一個網格就是一組,作爲該組只在對象列表中,點擊事件不會被觸發。

我不知道如何讓我的object3d可點擊。

如果有人有一個想法,它將不勝感激。

感謝

+0

對不起,編輯模式似乎沒有工作,大家好,就開始消失了。 –

回答

0

所以我找到了解決辦法不知道這是否是最好的一個,但它的作品至少有一組2目。

這裏是我修改在ThreeX.domevent.js的代碼(在THREEx.DomEvent.prototype._onEvent)

var objectCtx = this._objectCtxGet(object3d); 
var objectParent = object3d.parent; 
while (typeof(objectCtx) == 'undefined' && objectParent) 
{ 
    objectCtx = this._objectCtxGet(objectParent); 
    objectParent = objectParent.parent; 
} 

這是東陽點擊的對象不是一個是在對象列表,所以我們必須找到列表中的父代,並使用此代碼。

請注意,我只對我的情況進行了測試,並且僅在某些情況下對其進行了測試,因此請認真對待它。

再見

1

domevents.js的代碼不與工作的原因有兩個羣體:

  1. 帶或不帶後裔檢測路口你需要傳遞的第二個參數爲真在intersectObjects功能:

    var intersects = this._raycaster.intersectObjects(boundObjs, true); 
    
  2. 該事件被連接到母體元素(object3d或THREE.Group對象),當相交離子被檢測到,它返回具有最近交點的後代物體。因此,_bound函數將獲取子元素的上下文而不是父元素。你必須改變_objectCtxGet函數的行爲:

    THREEx.DomEvents.prototype._objectCtxGet  = function(object3d){ 
        if(typeof object3d._3xDomEvent == 'undefined' && typeof object3d.parent != 'undefined') 
        { 
         return object3d.parent._3xDomEvent; 
        } 
    
        return object3d._3xDomEvent; 
    }