3

显示隐藏:

我一直在使用 Three.js Release 50 并且能够在以下帮助下显示/隐藏对象(在我的应用程序中,它是一个网格子对象):

THREE.SceneUtils.traverseHierarchy(mesh,function(child){
    var z = document.getElementById("cameras").selectedIndex*5 -10;
    if (z === -10){
        child.visible = true;
    } else if (child.position.z !== z){
        child.visible = false;
    } else {

        child.visible = true;
    };
}); 

但是在使用release 54时,据说要使用,object.traverse却发现很难一样。如何使用版本 54 替换上述代码?我在使用 54 版时遇到的错误是:

在此处输入图像描述

采摘:

我找到了一个非常著名且复杂的示例,用于在 Three.js 中进行 Picking,它基于“Ray Picking”及其链接:Three.js Picking Example。基于这个例子,我一直在尝试在我的应用程序中实现拾取。但不知何故,这条线出现了错误。

var raycaster = new THREE.Raycaster( camera.position, vector.subSelf( camera.position                   
).normalize() );

我在自定义javascript 对象[数据结构] 中管理了锥体 [我的几何体] 的父子关系,使得(Layer1 {用于对象内每个层的数组} 有 100 个锥体,并且都是父级,第 2 层有 100 个锥体,它们是 layer1 [multiplicity 1:1]] 上的锥体,第 3 层有锥体,它们是 layer 2 上的锥体的孩子,它们的关系也是 1:1,因此它们也是 layer1 锥体的孙子)。

我使用网格从第一层添加祖锥,并通过该父级访问 layer2 中的子级,并将其添加到相同的网格和通过子级访问的孙子级,并添加到相同的网格中。最后,我将整个 Mesh 添加到场景中。由于“z-depth”变化[对于第一层,z-坐标:5,对于 layer2:0 和 layer 3:-5],layer1 和 layer2 和 layer3 字面上形成三层,如下图所示。

在此处输入图像描述

但是在使用下面的代码时,我看不到我的锥体上有任何采摘。

var vector = new THREE.Vector3( mouse.x, mouse.y, 1 );
            projector.unprojectVector( vector, camera );

            var raycaster = new THREE.Raycaster( camera.position, vector.subSelf( camera.position ).normalize() );

            var intersects = raycaster.intersectObjects( scene.children ); // tried with mesh.children as well, but no change :(

            if ( intersects.length > 0 ) {

                if ( INTERSECTED != intersects[ 0 ].object ) {

                    if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );

                    INTERSECTED = intersects[ 0 ].object;
                    INTERSECTED.currentHex = INTERSECTED.material.emissive.getHex();
                    INTERSECTED.material.emissive.setHex( 0xff0000 );

                }

            } else {

                if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );

                INTERSECTED = null;

            }

我希望我的特定锥体在光线相交时被拾取,同时基于特定锥体是否是祖父母/父母/孩子的特定家族的剩余锥体也被拾取。我为我的自定义数据结构提供了帮助函数,它通过输入祖父母(祖父母 <- 父母)返回父母,并通过输入父母来返回孩子,您可以利用它来帮助我挑选。

我有一个 JSfiddle 链接,它使用 Three.js release 54 和 CombinedCamera.js 作为附加资源,请有人帮我解决这个问题。我非常需要帮助。

这是我的 Jsfiddle 链接:http: //jsfiddle.net/sagh0900/SQyLL/

在实施 Picking 和使用 Three.js 版本 54 之前,我以前的工作Jsfiddle 版本。在这个版本中,我使用了 three.js 的第 50 版,我能够成功地显示/隐藏对象:http://jsfiddle。净/sagh0900/PrVbg/3/

提前感谢您的帮助和支持:)

4

1 回答 1

4

正如 WestLangley 所提到的,每个帖子一个明确的问题将有助于我们更好地回答您。

对于使用 Raycaster 在 Three.js 中挑选的一个不太复杂的示例,我在以下位置发布了一个示例:

http://stemkoski.github.com/Three.js/Mouse-Tooltip.html

它根据从鼠标位置发出的光线改变场景中对象的属性(颜色)。也许这段代码可以适应你的部分困难。

于 2013-03-18T00:46:23.657 回答