Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js 在threejs中选择一个对象?_Three.js - Fatal编程技术网

Three.js 在threejs中选择一个对象?

Three.js 在threejs中选择一个对象?,three.js,Three.js,我认为问题可能是因为它是一个加载的对象,而不是“创建”的几何体,但我希望能够选择一个对象并显示它已被选中,如示例所示 我在中加载多个对象,并跟踪每个对象的索引(因此加载的第一个对象的objIndex=0,等等),我知道当我从控制台“按下鼠标”时,代码可以识别。但是,它表示intersects.length=0,因此跳过函数的其余部分 我也不确定什么“intersects.length”实际上是指长度 所以我想我的问题是: 什么是“相交长度”取长度 为什么我的对象的“intersects.leng

我认为问题可能是因为它是一个加载的对象,而不是“创建”的几何体,但我希望能够选择一个对象并显示它已被选中,如示例所示

我在中加载多个对象,并跟踪每个对象的索引(因此加载的第一个对象的objIndex=0,等等),我知道当我从控制台“按下鼠标”时,代码可以识别。但是,它表示intersects.length=0,因此跳过函数的其余部分

我也不确定什么“intersects.length”实际上是指长度

所以我想我的问题是:

  • 什么是“相交长度”取长度

  • 为什么我的对象的“intersects.length”为0

  • 我可以做些什么来识别这些对象

  • 以下是相关代码:

    function onDocumentMouseDown(event) {
        event.preventDefault();
            // default action of event will not be triggered
    
        var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5).unproject(camera);
            // used to pass 3D positions and directions
    
        var raycaster = new THREE.Raycaster(camera.position,
                        vector.sub(camera.position).normalize());
    
        var intersects = raycaster.intersectObjects(objects);
    
        console.log('Mouse is down.');
        console.log(intersects.length);
    
        if (intersects.length > 0) {
            controls.enabled = false;
            SELECTED = intersects[0].object;
    
            var intersects = raycaster.intersectObjects(plane);
            offset.copy(intersects[0].point).sub(plane.position);
    
            container.style.cursor = 'move';
    
            console.log('Clicked object: ' + object.name);
        }
    }
    

    如果你需要看更多,请告诉我!谢谢。:)

    回答您的问题:

    下面是一篇有关raycast的有趣文章,有助于澄清raycast:

    所以光线投射基本上就是投射一条假想的光线。当你“按下鼠标”时,你的程序将在场景中投射一个直线阵列。现在回答你的问题:

    对于问题1(1)和问题2(2):现在,当您投射光线时,它可能与对象相交,也可能不相交。例如,如果在空白处单击,光线将捕捉不到对象。但是,顾名思义,光线投射会投射一条光线,并且它也可能会沿途击中多个对象。例如,如果一个对象和另一个对象位于第一个对象的正后方,则将光线投射到第一个对象中也会与第二个对象相交。光线投射将“捕捉”两个对象,并将两个对象放入数组“相交”。因此,命令

    if (intersects.length > 0)
    
    声明如果光线投射“捕捉”对象,请执行以下操作。此外,它不断调用intersects[0]来引用intersects数组中的第一个对象。在本例中,光线投射捕捉的最前面的对象。您可以通过创建数百个对象来测试我的答案,并声明对于相交数组中的每个成员,您可以将颜色更改为红色(例如)。您将看到,如果光线投射捕捉到多个对象,所有对象都将变成该颜色。希望是前两个问题


    第三个问题我不知道你在问什么。你能进一步澄清吗?识别对象的一种方法是将它们放入场景中,并在场景中放置光线投射。但是,我不太确定您想要什么样的答案。

    您使用的是哪个版本的There.js?应该是最新的版本。