【问题标题】:Raycast doesnt hit mesh when casted from the inside从内部投射时,Raycast 不会击中网格
【发布时间】:2015-06-14 14:08:54
【问题描述】:

我已经设置了一个简单的场景,我的相机位于球体几何体中

var mat = new THREE.MeshBasicMaterial({map: THREE.ImageUtils.loadTexture('0.jpg') , overdraw:true,  color: 0xffffff, wireframe: false });
        var sphereGeo = new THREE.SphereGeometry(1000,50,50);
        var sphere = new THREE.Mesh(sphereGeo,mat);
        sphere.scale.x = -1;
        sphere.doubleSided = false;
        scene.add(sphere);

我设置了一个功能,我可以在该球体内环顾四周,我的目的是能够在鼠标向下投射光线,击中球体并获取发生击中的坐标。我正在投射光线,但相交仍然是空的。

var vector = new THREE.Vector3();
      vector.set( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1, 0.5 );
      vector.unproject( camera );

      raycaster.ray.set( camera.position, vector.sub( camera.position ).normalize());

var intersects = raycaster.intersectObjects(scene.children, true);

一切都适用于我的球体中的测试立方体。 我的问题是,是否从内部击中物体是否重要?因为这是我想到的唯一解释。

提前致谢。

【问题讨论】:

    标签: javascript three.js raycasting


    【解决方案1】:

    从内部击中对象确实很重要。通常,由于流水线级别发生的背面剔除,光线会穿过“倒置”表面。

    在渲染和光线投射中通常会忽略反转/翻转的表面。

    但是,在您的情况下,我会继续尝试将 sphere.doubleSided = false; 设置为 sphere.doubleSided = true;。这应该使光线投射返回与您的球体的交点。 [不应该与负比例一起使用]

    也可以进入“脏顶点”模式,手动翻转法线:

    mesh.geometry.dynamic = true
    mesh.geometry.__dirtyVertices = true;
    mesh.geometry.__dirtyNormals = true;
    
    mesh.flipSided = true;
    
    //flip every vertex normal in mesh by multiplying normal by -1
    for(var i = 0; i<mesh.geometry.faces.length; i++) {
        mesh.geometry.faces[i].normal.x = -1*mesh.geometry.faces[i].normal.x;
        mesh.geometry.faces[i].normal.y = -1*mesh.geometry.faces[i].normal.y;
        mesh.geometry.faces[i].normal.z = -1*mesh.geometry.faces[i].normal.z;
    }
    
    mesh.geometry.computeVertexNormals();
    mesh.geometry.computeFaceNormals();
    

    我还建议您将比例设置回 1.0 而不是 -1.0。

    让我知道它是否有效!

    【讨论】:

    • Goop 点,但我之前尝试过并没有帮助,...我真的需要倒转我的球体才能从内部看到纹理。也没有反转球体没有帮助(scale.x = 1)
    • 好的!我想我找到了!您需要使您的对象几何体动态化,进入“脏顶点/法线”模式,并手动翻转法线。我用以下代码更新了我的答案。
    • 刚刚试了一下,还是没有成功,当我将 scale.x 设置回 1 时,我也没有像以前一样看到我的纹理。
    • 此答案引用了 2012 年或更早版本的three.js 版本的代码。我建议您更新到当前版本 - 并在发布之前测试您的解决方案。
    • 可能是这样,但我感觉它不会有帮助,如果我说那个球体或任何其他网格不仅仅是顶点,而是像完整的“球”,我是对的吗?所以这就是为什么它没有击中?
    【解决方案2】:

    sphere.doubleSided 几年前已更改为 sphere.material.side = THREE.DoubleSide

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 2016-02-19
      • 2017-03-29
      相关资源
      最近更新 更多