【问题标题】:Three.js raycasting does not work on DIV which is not full screenThree.js 光线投射在非全屏的 DIV 上不起作用
【发布时间】:2021-12-26 09:52:31
【问题描述】:

我编写了一个显示 3D 骨骼的简单网页,并使用 Three.js 光线投射在其上绘制点和线,效果非常好。 result of using raycast on full screen web page

但是当我将它移植到另一个具有多个窗口的网页时,该过程不起作用。

我按照 fiddle http://jsfiddle.net/cn7ecoaa/ 的说明进行操作,但仍然失败。

这是 CSS:

.column2  {
    float: right;
    width: 80%;
    position: static;
}

#w3-container {
    width: 1522px;
    height: 1001px;
    position: static;
}

我加载了模型并检查了它,它肯定包含网格和缓冲几何: result of console.log after loading the 3D model

这里是加载器代码:

gltfLoader.load (   
                    inputModel,
                
                    function(gltf)
                    {
                        scene.add(gltf.scene);
                        model = gltf.scene;
                        mesh = gltf.scene.children[0];

                        mesh.name = "tibia_glTF_01";
                        
                        model.traverse
                        ( function ( child ) 
                            {
                                
                                if ( child.isMesh && child.geometry.isBufferGeometry) 
                                { 
                                    const material = new THREE.MeshPhongMaterial(  {color:0x3c3c3c, emissive: 0x000000 } );
                                    child.material = material;
                                    const bg = child.geometry;
                                    console.log("Do not change geometry.");
                                    
                                }
                            }  
                        );

                        getItem();  // Refresh the item list to be displayed

                        objects.push( mesh );
                        
                    });

这里是处理 onmousedown 事件的代码:

函数 onMouseDown( 事件 ) {

    if ( !DRAWLINE ) return;

    var raycaster = new THREE.Raycaster();

    event.preventDefault();

    mouse.x = (( event.clientX - renderer.domElement.offsetLeft) / renderer.domElement.clientWidth ) * 2 - 1;
    mouse.y = - (( event.clientY - renderer.domElement.offsetTop) / renderer.domElement.clientHeight ) * 2 + 1;

    console.log("mouse.x", mouse.x, "mouse.y", mouse.y);

    console.log("Objects", objects);

    raycaster.setFromCamera(mouse, camera);

    var intersects = raycaster.intersectObjects( objects );

    if ( intersects.length > 0 ) {

        alert("HIT!");

        dot.visible = true;

        // Copy the intersection points to be used in functions addPoint()
        mouse.copy( intersects[0].point );

        intersects.length = 0; // reset the variable
    
        addPoint();

    } else {

        console.log( "<<NO Intersection!!>>" );

    }

}

无论我使用什么组合来满足偏移,光线投射的结果仍然是“>”。

任何有关如何解决此问题的想法将不胜感激! 感谢您的帮助!

【问题讨论】:

    标签: three.js raycasting


    【解决方案1】:

    尝试像这样计算你的鼠标坐标:

    const rect = renderer.domElement.getBoundingClientRect();
    mouse.x = ( ( event.clientX - rect.left ) / ( rect. right - rect.left ) ) * 2 - 1;
    mouse.y = - ( ( event.clientY - rect.top ) / ( rect.bottom - rect.top) ) * 2 + 1;
    

    【讨论】:

    • 感谢您的及时回复 Mugen87。我知道这是一个老问题,人们已经问了很多次,但令我惊讶的是,我无法弄清楚问题出在哪里,也无法使用您的建议解决它。我想知道 3D 模型是否与几何或缓冲几何有关?虽然我都试过了。总之非常感谢!林戈
    • 网页的布局是基于 Three.js demo 的“多视口”:threejs.org/examples/webgl_multiple_views.html 是不是和这个有关系导致raycasting失败?
    • 嗯,这很难说。最好用一个活生生的例子(比如小提琴)来演示这个问题。
    • 我明白了,这样做很有意义。但是由于源代码如此庞大和纠结,我认为制作一个小提琴演示并不容易。让我先试着清理一下。谢谢。
    • 也许您可以使用webgl_multiple_views 中的代码进行现场演示。意思是修改它以使问题发生。如果您设法以这种方式隔离问题,则应该更容易调查并可能修复它。
    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    相关资源
    最近更新 更多