【问题标题】:THREE.js - Object Picking doesnt report parent object name on object loaded with OBJMTLLoaderTHREE.js - 对象拾取不报告使用 OBJ MTL 加载器加载的对象的父对象名称
【发布时间】:2015-12-28 04:44:52
【问题描述】:

我已经使用 OBJMTLLoader 加载了一个带有 MTL 文件纹理的 OBJ 文件。 我从http://threejs.org/examples/webgl_loader_obj_mtl.html复制了这个例子。

主要对象(穿着西装、头发、手和鞋子的男人)显示正常,纹理正确(例如眼睛、嘴巴、领带、纽扣)。

加载的对象是一个包含 10 个子对象的 THREE.Group,每个子对象是一个 THREE.Object3D,其中还有 3、5 或 7 个子 THREE.Mesh 对象。

这里是加载OBJ和MTL的js代码...

//=============================================== =====

function SOW_F_Load_OBJMTL_Model ( givenFilespec, mtlFilespec, givenName, givenScene, givenHexColorStr, posX, posY, posZ,  rotX, rotY, rotZ, scaleX, scaleY, scaleZ )
    {

          THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() );

          var ObjMtl_loader = new THREE.OBJMTLLoader();

          ObjMtl_loader.load( givenFilespec, mtlFilespec, SOW_F_make_LoadedOBJ_Handler ( givenName, givenScene, givenHexColorStr, posX, posY, posZ,  rotX, rotY, rotZ, scaleX, scaleY, scaleZ ) );
        }

    } 



//=============================================

function SOW_F_make_LoadedOBJMTL_Handler( givenName, givenScene, givenHexColorStr, posX, posY, posZ, rotX, rotY, rotZ, scaleX, scaleY, scaleZ )
{

    return function ( object )
    {
        object.position.set( posX, posY, posZ );
        object.rotation.set( rotX, rotY, rotZ );
        object.name = givenName; 
        object.scale.set( scaleX, scaleY, scaleZ );
        givenScene.add( object );

        object.traverse (  function ( child )
                {
                    if ( child instanceof THREE.Mesh ) 
                    {
                        child.userData.rootObject = object;                         
                        //... following are for when material doesn't load
                        child.geometry.computeFaceNormals(); 
                        child.geometry.computeVertexNormals();   
                        child.geometry.normalsNeedUpdate = true; 
                    }
                }
             )  

        object.updateMatrix(); //... without this the next command is not effective.
        xxx = SOW_F_grob_Add_to_Target_Set( object );
    };

}

我的问题是对象拾取不报告用 OBJMTLLoader 加载的相交对象的名称。它要么报告纹理材质的名称,要么报告空白。

对象拾取适用于我在 THREE.js 代码中创建的网格对象。

我已经尝试了Picking Object3D loaded via OBJMTLLoader 中建议的修复方法,包括(在交叉路口选择代码中):

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

and(在对象子处理代码中):

child.userData.rootObject = object; 

但他们不修复它。

请有人建议我需要做些什么来使对象拾取报告使用 OBJMTLLoader 加载的对象的父对象?

【问题讨论】:

  • 您能否发表评论并编辑为实际答案?我非常乐意投票。
  • @Paul-Jan。按要求完成:)。

标签: javascript three.js .obj


【解决方案1】:

啊,我傻了,我只需要查找所选相交对象的根对象的名称!

在与对象A相交时选择引用的对象B(要报告其名称的对象或其他):-

var intersected_object_A = intersects[ 0 ].object; //... nearest object

那么如果相交对象A有一个属性userData.rootObject就可以选择rootObject作为引用对象B。

if ( intersected_object.userData.rootObject )
    { var referred_Object_B = intersected_object_A.userData.rootObject }

否则选择相交对象A本身。

else
    { var referred_Object_B = intersected_object_A }

alert ("You clicked on:" + referred_Object_B.name );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-17
    • 2015-03-16
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2021-05-03
    • 2018-06-02
    相关资源
    最近更新 更多