如何用domevent.js选择一个组(object3d)?

时间:2013-10-14 14:25:38

标签: three.js dom-events

我的场景中的object3d选择存在问题。

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

我添加了THREE.Object3D补丁,但似乎无效。

我有一个mesh或object3d对象列表。

当我尝试捕获对象单击时,如果对象是网格,则一切正常,但如果它是一个组则不然。

每个对象都添加了objects.push(object); // mesh或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适用于直接在场景中的网格,但如果我单击一个组中的网格,因为该组仅在对象列表中,则不会触发click事件。

我不知道如何让我的object3d可点击。

如果有人有想法,我们将不胜感激。

由于

2 个答案:

答案 0 :(得分:1)

由于两个原因,domevents.js的代码不适用于群组:

  1. 要检测有或没有后代的交集,需要在intersectObjects函数上将第二个参数传递为true:

    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;
    }
    

答案 1 :(得分: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;
}

这是因为单击的对象不是对象列表中的对象,所以我们必须找到列表中的父对象,并使用此代码。

请注意,我只针对我的情况对其进行了测试并仅在某些情况下对其进行了测试,因此请谨慎使用。

再见