从内部投射时,Raycast不会击中网格

时间:2015-04-09 09:24:30

标签: javascript three.js raycasting

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

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);

一切都适用于测试立方体也放在我的球体内。 我的问题是,你是从内部击中物体还是不击中物体是否重要?因为这是我脑海中唯一的解释。

提前致谢。

2 个答案:

答案 0 :(得分:5)

几年前,

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

答案 1 :(得分:0)

如果从内部击中物体,确实很重要。通常,由于在管道级别上发生的背面剔除,光线将穿过“反转”表面。

在渲染和光线投射中通常会忽略倒置/翻转曲​​面。

但是,在您的情况下,我会继续尝试将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。

让我知道它是否有效!