0

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

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

我添加了 THREE.Object3D 补丁,但似乎不起作用。

我有一个网格或 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 可点击。

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

谢谢

4

2 回答 2

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;
    }
    
于 2016-05-16T13:22:53.927 回答
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;
}

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

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

再见

于 2013-10-15T15:04:18.123 回答