2012-06-13 1 views
0

마우스 클릭 이벤트로 JSON 객체를 잡으려고합니다. 광선을 사용하여 물체를 식별하지만, 어떤 이유로 물체가 항상 식별되는 것은 아닙니다. 나는 내가 카메라를 움직인다는 사실과 관련이 있다고 생각한다. 왜냐하면 내가 물체 근처를 클릭하면 나는 식별되기 때문이다.ray가 JSON에 도달하지 않습니다.

카메라 이동에 따라 광선을 올바르게 설정하는 방법을 이해할 수 있습니까? 여기

코드입니다 :이 마우스 다운 이벤트 *의 일부가

document.addEventListener("mousemove", onDocumentMouseMove, false); 
    document.addEventListener("mouseup", onDocumentMouseUp, false); 
    document.addEventListener("mouseout", onDocumentMouseOut, false); 
    mouseXOnMouseDown = event.clientX - windowHalfX; 
    targetRotationOnMouseDown = targetRotation; 
    var ray, intersections; 
    _vector.set((event.clientX/window.innerWidth) * 2 - 1, -(event.clientY/window.innerHeight) * 2 + 1, 0); 
    projector.unprojectVector(_vector, camera); 
    ray = new THREE.Ray(camera.position, _vector.subSelf(camera.position).normalize()); 
    intersections = ray.intersectObjects(furniture); 

    if (intersections.length > 0) { 
     selected_block = intersections[0].object; 
     _vector.set(0, 0, 0); 
     selected_block.setAngularFactor(_vector); 
     selected_block.setAngularVelocity(_vector); 
     selected_block.setLinearFactor(_vector); 
     selected_block.setLinearVelocity(_vector); 
     mouse_position.copy(intersections[0].point); 
     block_offset.sub(selected_block.position, mouse_position); 
     intersect_plane.position.y = mouse_position.y; 
    } 

}

이 카메라 이동 *의 일부입니다

입니다

camera.position.x = (Math.cos(timer) * 10); 
camera.position.z = (Math.sin(timer) * 10); 
camera.lookAt(scene.position); 

답변

1

흠, 당신의 문제가 어떻게 될지에 대한 어떤 시연을 보지 않고는 말하기가 어렵습니다. r 프로그램이 실제로 활동 중입니다. 나는 오늘 내가 해왔 던 나의 데모를 볼 것을 제안 할 것이다. 나는 카메라, 컨트롤, 광선을 다룬다. 나는 JSON도 사용하고있다.

처음에는 내 데모를 볼 수 있습니다 : here 당신의 묘사가 비슷한 것과 무슨 일이 일어나는지에 대한 아이디어를 얻으려면. 이해할 수 있으면 내 코드를 적용 할 수 있어야합니다. main.js

나는 또한 내가 spin a cube에 광선 및 마우스 충돌을 사용하여 위치를 유용하게 찾을 수있는 또 다른이 : 소스 코드에 대한 직접 링크를 싶습니다 굳이 이렇게
.
--source 코드 : main.js

마지막으로 내 마우스 이벤트의 내장을 게시거야, 그리고 내가 처음 데모 트랙볼 카메라를 처리하는 방법, 희망이 중 일부는 해결책에 당신을 이끌 것입니다 :

/** Event fired when the mouse button is pressed down */ 
function onDocumentMouseDown(event) { 
    event.preventDefault(); 

    /** Calculate mouse position and project vector through camera and mouse3D */ 
    mouse3D.x = mouse2D.x = (event.clientX/window.innerWidth) * 2 - 1; 
    mouse3D.y = mouse2D.y = -(event.clientY/window.innerHeight) * 2 + 1; 
    mouse3D.z = 0.5; 
    projector.unprojectVector(mouse3D, camera); 

    var ray = new THREE.Ray(camera.position, mouse3D.subSelf(camera.position).normalize()); 

    var intersects = ray.intersectObject(maskMesh); 

    if (intersects.length > 0) { 
     SELECTED = intersects[0].object; 
     var intersects = ray.intersectObject(plane); 
     offset.copy(intersects[0].point).subSelf(plane.position); 
     killControls = true; 
    } 
    else if (controls.enabled == false) 
     controls.enabled = true; 
} 

/** This event handler is only fired after the mouse down event and 
    before the mouse up event and only when the mouse moves */ 
function onDocumentMouseMove(event) { 
    event.preventDefault(); 

    /** Calculate mouse position and project through camera and mouse3D */ 
    mouse3D.x = mouse2D.x = (event.clientX/window.innerWidth) * 2 - 1; 
    mouse3D.y = mouse2D.y = -(event.clientY/window.innerHeight) * 2 + 1; 
    mouse3D.z = 0.5; 
    projector.unprojectVector(mouse3D, camera); 

    var ray = new THREE.Ray(camera.position, mouse3D.subSelf(camera.position).normalize()); 

    if (SELECTED) { 
     var intersects = ray.intersectObject(plane); 
     SELECTED.position.copy(intersects[0].point.subSelf(offset)); 
     killControls = true; 
     return; 
    } 

    var intersects = ray.intersectObject(maskMesh); 

    if (intersects.length > 0) { 
     if (INTERSECTED != intersects[0].object) { 
      INTERSECTED = intersects[0].object; 
      INTERSECTED.currentHex = INTERSECTED.material.color.getHex(); 
      plane.position.copy(INTERSECTED.position); 
     } 
    } 
    else { 
     INTERSECTED = null; 
    } 
} 

/** Removes event listeners when the mouse button is let go */ 
function onDocumentMouseUp(event) { 
    event.preventDefault(); 
    if (INTERSECTED) { 
     plane.position.copy(INTERSECTED.position); 
     SELECTED = null; 
     killControls = false; 
    } 

} 

/** Removes event listeners if the mouse runs off the renderer */ 
function onDocumentMouseOut(event) { 
    event.preventDefault(); 
    if (INTERSECTED) { 
     plane.position.copy(INTERSECTED.position); 
     SELECTED = null; 
    } 
} 

그리고 내가 원하는 내 첫 번째 데모에 표시된 원하는 효과를 얻기 위하여 , 나는 선택적으로 켭니다 killControls 플래그를 사용하기 위해 및 기반 트랙볼 카메라 컨트롤 떨어져 내 애니메이션 루프에 이것을 추가했다 마우스 충돌시 :

if (!killControls) controls.update(delta); 
else controls.enabled = false; 
+0

그것은 작동합니다! 고마워요 !! :) – Vardit

+0

다행히 도울 수있어^_ ^ –