使用 FBXLoader 加载的相交对象——Three.js

Posted

技术标签:

【中文标题】使用 FBXLoader 加载的相交对象——Three.js【英文标题】:Intersecting objects loaded using FBXLoader— Three.js 【发布时间】:2018-06-02 05:12:47 【问题描述】:

我正在使用 FBXLoader 加载一个 fbx 文件。它已成功加载并添加到场景对象中。我想在单击时获取此对象以应用转换控件。除了通过 FBXLoader 加载之外,所有其他对象都是可点击的。

var loader = new THREE.FBXLoader( manager );
            loader.load( 'assets/models/fbx/iphone_ascii.fbx', function( object ) 
                scene.add( object );
            , onProgress, onError );

这是我的路口代码:

onMouseDown(event) 
event.preventDefault();
event.stopPropagation();
event.stopImmediatePropagation();
let rect = this.renderer.domElement.getBoundingClientRect();

this.mouse.x = ((event.clientX - rect.left) / (this.viewportWidth)) * 2 - 1;
this.mouse.y = - ((event.clientY - rect.top) / (this.viewportHeight)) * 2 + 1;
let vector = new THREE.Vector3( this.mouse.x, this.mouse.y, 1 );

vector.unproject(this.camera);

let ray = new THREE.Raycaster( this.camera.position, vector.sub(this.camera.position).normalize() );

let intersects = ray.intersectObjects(this.scene.children);

if (intersects.length > 0) 
  if (this.activeobject !== intersects[0].object) 
    this.activeobject = intersects[0].object;
    this.transformControls.detach(this.activeobject);
    this.transformControls.attach(this.activeobject);
  


this.renderer.render(this.scene, this.camera);  

【问题讨论】:

看看THREE.Raycaster().setFromCamera()方法。 【参考方案1】:

从THREE.Raycaster docs,请注意intersectObjects(objects, recursive) 采用第二个参数。因为像 FBX 这样的模型通常是嵌套对象的集合,所以您需要使用 recursive 选项。

let intersects = ray.intersectObjects(this.scene.children, true);

【讨论】:

感谢您的建议。但我的要求是选择整个群体,而不是儿童群体。 您仍然需要以这种方式检查孩子是否有交叉路口。然后你可以使用child.parent在孩子相交时选择父母而不是孩子。

以上是关于使用 FBXLoader 加载的相交对象——Three.js的主要内容,如果未能解决你的问题,请参考以下文章

THREE.js FBXLoader 将 .png 视为 .psd,并且不加载素材

Three.js 的 FBXLoader CDN/模块

Three.js - 使用 .FBX 模型时出现“未知格式”错误

FBXLoader CDN /用于Three.js的模块

从fbx模型构建骨架

three.js 中的分层纹理