Javascript 如何检测特定的3d模型collision three.js

Javascript 如何检测特定的3d模型collision three.js,javascript,3d,three.js,collision,Javascript,3d,Three.js,Collision,我正在尝试用跳跃运动制作可点击的3d对象。我有两个3D模型,铁人头盔和雷神之锤。如果选择了这两个对象中的一个,则将更改颜色。因为铁人是绿色的,铁锤是白色的。但是当我选择锤子时,它会变成绿色而不是白色。我使用立方体作为指针来选择对象。你能帮忙吗 以下是插入三维模型的代码: var colladaMeshlist = []; model = new THREE.Object3D() var object; var skin; var objectScale = 1.5; rotX=0, rotY=

我正在尝试用跳跃运动制作可点击的3d对象。我有两个3D模型,铁人头盔和雷神之锤。如果选择了这两个对象中的一个,则将更改颜色。因为铁人是绿色的,铁锤是白色的。但是当我选择锤子时,它会变成绿色而不是白色。我使用立方体作为指针来选择对象。你能帮忙吗

以下是插入三维模型的代码:

var colladaMeshlist = []; 
model = new THREE.Object3D()
var object;
var skin;
var objectScale = 1.5;
rotX=0, rotY=0, rotZ=0;
var loader = new THREE.ColladaLoader();
loader.options.convertUpAxis = true;
loader.load( 'models/IronMan.dae', function (collada) {
    object = collada.scene;

    object.scale.x = object.scale.y = object.scale.z = objectScale;

    object.position.x= 20;
    object.position.y= -40;
    object.position.z= 0;

    object.rotation.x= rotX;
    object.rotation.y= rotY;
    object.rotation.z= rotZ;

    object.name="IronMan";      
    colladaMeshlist.push(object);
    model.add(object);

});
scene.add(model);

model2 = new THREE.Object3D()
var object2;
var skin2;
var objectScale2 = 1;
posX=0, posY=-40, posZ=0;
rotX=0, rotY=0, rotZ=0;
var loader = new THREE.ColladaLoader();
loader.options.convertUpAxis = true;
loader.load( 'models/Hammer.dae', function (collada) {
    object2 = collada.scene;

    object2.scale.x = object2.scale.y = object2.scale.z = objectScale2;

    object2.position.x= -20;
    object2.position.y= -20;
    object2.position.z= posZ;

    object2.rotation.x= rotX;
    object2.rotation.y= rotY;
    object2.rotation.z= rotZ;
    object2.name="Hammer";  
    colladaMeshlist.push(object2);
    model2.add(object2);
});
scene.add(model2);
这是用于选择对象的代码:

      var originPoint = cube.position.clone();
      for(var vertexIndex = 0; vertexIndex < cube.geometry.vertices.length; vertexIndex++)
       {
           var localVertex = cube.geometry.vertices[vertexIndex].clone();
           var globalVertex = localVertex.applyMatrix4( cube.matrix );
           var directionVector = globalVertex.sub( cube.position );
           var ray = new THREE.Raycaster( originPoint, directionVector.clone().normalize() );
           var collisionResults = ray.intersectObjects(colladaMeshlist, true);

           if(collisionResults.length > 0 && collisionResults[0].distance < directionVector.length())  
          {
             collisionResults[0].object.material.color.setHex(0x4CAF50);
          } 
          else if (collisionResults.length > 0 && collisionResults[1].distance < directionVector.length())
          {
             collisionResults[1].object.material.color.setHex(0xffffff);
          }
  }
var originPoint=cube.position.clone();
对于(变量vertexIndex=0;vertexIndex0&&collisionResults[0]。距离0&&collisionResults[1]。距离
您的代码没有条件决定所选对象的颜色为白色或绿色。我只知道第一个物体必须是绿色的,如果它在立方体内部,这适用于你的锤子+头盔。另外,
else if
对我来说似乎很奇怪:你写过:如果第一个对象在立方体中(…),如果第二个对象在立方体中?第一个对象怎么可能不与多维数据集相交,而第二个是(
intersectObjects
返回一个按距离排序的数组)?除非我在前面的注释中遗漏了什么,否则您可以这样做:1。仅保留第一个
如果
块;2.只需检查此块中对象的名称:
if(collisionResult[0].object.name==='IronMan')
>绿色。白色的锤子也是一样。我用过你的解决方案,但还是不起作用。在模型中,我有'code'对象。name==“IronMan”。使用colladaMeshlist[0].name,我得到了对象名,但它仍然不起作用。在您拥有的模型中=未==。我找到了解决方案