我使用了THREE.js CSS渲染器,并用6个CSS3DObjects创建了一个3D立方体。我一直在遵循这个(code)示例来添加光线追踪,以便可以弄清楚鼠标位于代码的哪一侧。
function onDocumentMouseMove( event ) {
event.preventDefault();
let mouse3D = new THREE.Vector2(
( event.clientX / window.innerWidth ) * 2 - 1,
-( event.clientY / window.innerHeight ) * 2 + 1);
let raycaster = new THREE.Raycaster();
raycaster.setFromCamera( mouse3D, camera );
let intersects = raycaster.intersectObjects( scene.children, true );
if ( intersects.length > 0 ) {
console.log(intersects);
}
}
但是,即使鼠标悬停在立方体上,相交的对象也保持空白
更新
所以我试图在场景中添加一个网格。尽管渲染器不会渲染它,但raytracer似乎正在拾取它。这是否意味着CSS对象没有大小?
var geometry = new THREE.BoxGeometry( 500, 500, 10 );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cubeeee = new THREE.Mesh( geometry, material );
scene.add( cubeeee )
答案 0 :(得分:2)
您不需要带有CSS3DObjects
的光线投射器。 CSS3DRenderer只是转换您的DOM元素,因此它们仍可用于接收文档中的常规JavaScript事件。考虑到这一点,您可以简单地向每个面孔添加事件监听器:
domElement.addEventListener("mouseover", function(evt){
console.log("Mouse is over " + evt.target);
});
射线跟踪更适合Mesh
objects,后者仅存在于WebGL层中。您遵循的示例在Mesh
上使用光线投射。