从内部投射时,Raycast 不会击中网格
Raycast doesnt hit mesh when casted from the inside
我设置了一个简单的场景,其中我的相机位于球体几何体中
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);
一切都适用于我的球体中的测试立方体。
我的问题是,你是否从内部击中物体有关系吗?因为那是我想到的唯一解释。
提前致谢。
如果您从内部撞击物体, 有关系。由于发生在管道级别的背面剔除,通常光线会穿过 "inverted" 表面。
Inverted/flipped 表面通常在渲染和光线投射中都被忽略。
但是,对于您的情况,我会继续尝试将 sphere.doubleSided = false;
设置为 sphere.doubleSided = true;
。这应该使光线投射 return 成为与球体的交点。 [不应使用负比例]
也可以进入"dirty vertices"模式,手动翻转法线:
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。
让我知道它是否有效!
sphere.doubleSided
几年前改为sphere.material.side = THREE.DoubleSide
。
我设置了一个简单的场景,其中我的相机位于球体几何体中
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);
一切都适用于我的球体中的测试立方体。 我的问题是,你是否从内部击中物体有关系吗?因为那是我想到的唯一解释。
提前致谢。
如果您从内部撞击物体, 有关系。由于发生在管道级别的背面剔除,通常光线会穿过 "inverted" 表面。
Inverted/flipped 表面通常在渲染和光线投射中都被忽略。
但是,对于您的情况,我会继续尝试将 sphere.doubleSided = false;
设置为 sphere.doubleSided = true;
。这应该使光线投射 return 成为与球体的交点。 [不应使用负比例]
也可以进入"dirty vertices"模式,手动翻转法线:
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。
让我知道它是否有效!
sphere.doubleSided
几年前改为sphere.material.side = THREE.DoubleSide
。