2014-11-07 3 views
1

я загружаю .obj файл:threejs raycast нажмите обнаружение не работает на загруженном 3dObject

var loader = new THREE.OBJMTLLoader(); 
loader.load("../obj/machine.obj", '../obj/machine.mtl', this.loadObject); 

И попытаться обнаружить щелчок на нем:

click: function(event){ 
     this.mouse.x = (event.clientX/window.innerWidth) * 2 - 1; 
     this.mouse.y = - (event.clientY/window.innerHeight) * 2 + 1; 
     var vector = new THREE.Vector3(this.mouse.x, this.mouse.y, 1).unproject(this.camera); 
     this.raycaster.set(this.camera.position, vector.sub(this.camera.position).normalize()); 

     console.log(this.scene.children); 
     var intersects = this.raycaster.intersectObjects(this.scene.children); 

     if (intersects.length > 0) { 

      console.log("hitting something"); 

     } 
    }, 

Это прекрасно работает на сетках, но не на загруженное 3DObject в то время как она видна в this.scene.childeren:

[THREE.Mesh, THREE.Line, THREE.PointLight, --> THREE.Object3D <-- ]0: THREE.Mesh__webglActive: true__webglInit: true_listeners: Object_modelViewMatrix: THREE.Matrix4_normalMatrix: THREE.Matrix3castShadow: falsechildren: Array[0]eulerOrder: (...)frustumCulled: truegeometry: THREE.IcosahedronGeometryid: 4material: THREE.MeshBasicMaterialmatrix: THREE.Matrix4matrixAutoUpdate: truematrixWorld: THREE.Matrix4matrixWorldNeedsUpdate: falsename: ""parent: THREE.Sceneposition: THREE.Vector3quaternion: THREE.QuaternionreceiveShadow: falserenderDepth: nullrotation: THREE.EulerrotationAutoUpdate: truescale: THREE.Vector3type: "Mesh"up: THREE.Vector3useQuaternion: (...)userData: Objectuuid: "46D85379-A9CE-4221-A599-39D13EE4CB34"visible: true__proto__: Object1: THREE.Line2: THREE.PointLight3: THREE.Object3D 

Так что-то подсказывает мне, что нужно что-то еще для нагрузки ed 3dObjects. Но я понятия не имею, что это может быть. Моя идея состоит в том, что raycast ищет вершины для пересечения, и не имеет значения, является ли это кубической сеткой или сеткой 3dObject. У кого-нибудь есть идея?

ответ

4

Вам необходимо пройти рекурсивный флаг как так

var intersects = raycaster.intersectObjects(objects, true); 

three.js R.69

+3

Спасибо, я мог бы поцеловать тебя, если ты где здесь. – hobs