THREE.js - Object Picking 不报告使用 OBJ MTL Loader 加载的对象的父对象名称
THREE.js - Object Picking doesnt report parent object name on object loaded with OBJMTLLoader
我已经使用 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加载的相交对象的名称。它报告纹理的名称 material 或空白。
我在 THREE.js 代码中创建的网格对象可以正常拾取对象。
我已经尝试了 Picking Object3D loaded via OBJMTLLoader 中建议的修复,包括(在交叉点拾取代码中):
var intersects = ray.intersectObjects( scene.children, true );
and(在对象子处理代码中):
child.userData.rootObject = object;
但他们没有修复它。
有人可以建议我需要做什么才能使对象拾取报告为使用 OBJMTLLoader 加载的对象的父对象吗?
啊,愚蠢的我,我只需要查找 selected 相交对象的 rootObject 的名称!
到select当对象A相交时引用的对象B(要报告其名称的对象或其他任何对象):-
var intersected_object_A = intersects[ 0 ].object; //... nearest object
那么如果相交的对象A有一个属性 userData.rootObject
你可以select rootObject作为引用的对象B。
if ( intersected_object.userData.rootObject )
{ var referred_Object_B = intersected_object_A.userData.rootObject }
否则select相交对象A本身。
else
{ var referred_Object_B = intersected_object_A }
alert ("You clicked on:" + referred_Object_B.name );
我已经使用 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加载的相交对象的名称。它报告纹理的名称 material 或空白。
我在 THREE.js 代码中创建的网格对象可以正常拾取对象。
我已经尝试了 Picking Object3D loaded via OBJMTLLoader 中建议的修复,包括(在交叉点拾取代码中):
var intersects = ray.intersectObjects( scene.children, true );
and(在对象子处理代码中):
child.userData.rootObject = object;
但他们没有修复它。
有人可以建议我需要做什么才能使对象拾取报告为使用 OBJMTLLoader 加载的对象的父对象吗?
啊,愚蠢的我,我只需要查找 selected 相交对象的 rootObject 的名称!
到select当对象A相交时引用的对象B(要报告其名称的对象或其他任何对象):-
var intersected_object_A = intersects[ 0 ].object; //... nearest object
那么如果相交的对象A有一个属性 userData.rootObject
你可以select rootObject作为引用的对象B。
if ( intersected_object.userData.rootObject )
{ var referred_Object_B = intersected_object_A.userData.rootObject }
否则select相交对象A本身。
else
{ var referred_Object_B = intersected_object_A }
alert ("You clicked on:" + referred_Object_B.name );