three.js - 使用鼠标位置选择 3D 空间中的对象 (THREE.js R99)
问题描述
我使用了 THREE.js CSS Render 并用 6 个 CSS3DObjects 创建了一个 3D 立方体。我一直在关注这个(代码)示例来添加光线跟踪,以便我可以确定鼠标在代码的哪一侧。
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);
}
}
但是,即使鼠标悬停在立方体上,相交对象仍为空
更新
所以我尝试在场景中添加一个网格。虽然渲染器不会渲染它,但光线追踪器似乎正在拾取它。这是否意味着 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 )
解决方案
您不需要带有CSS3DObjects
. CSS3DRenderer 只是转换您的 DOM 元素,因此它们仍可用于接收文档中的常规 JavaScript 事件。考虑到这一点,您可以简单地为每个面添加一个事件侦听器:
domElement.addEventListener("mouseover", function(evt){
console.log("Mouse is over " + evt.target);
});
光线追踪更适合仅存在于 WebGL 层中的Mesh
对象。您所遵循的示例在Mesh
.
推荐阅读
- hibernate - 如何使用 JPQL 查询减少查询执行时间
- regex - 正则表达式不排除python案例
- haskell - 调用 newtype 构造函数
- android-studio - 我可以在 Android Studio IDE 中输入 Git 命令吗?
- python - 如何从该模型中获取对象?
- excel - 运行宏后 Excel 不会关闭
- javascript - 当子组件被销毁时,Digest Already In Progress
- c# - Automapper - 将一种类型映射到另一种类型时出现问题
- python - 如何设置端点以使用 Django REST Swagger 发布
- apache-spark - 如何在每次迭代后获得 Apache Spark ML 训练分数