2012-09-22 3 views
3

기본적으로 자식 객체의 [x, y, z] 좌표는 부모의 객체 공간을 기준으로 표시되는 반면 그룹 Object3D의 자식 object3D가 있습니다. 개체, 3D 공간 내에서 자식 개체의 위치를 ​​변경하려고합니다. 그래서 저는 먼저 세계 공간에 상대적인 아이 오브젝트의 위치를 ​​얻습니다.Three.JS, 자식 3D 객체의 세계 위치 변경

var wrld_pos = childobject.matrixWorld.multiplyVector3(new THREE.Vector3); 

이것은 월드 공간 내에서 어린이의 위치에 대한 세 요소 벡터를 반환합니다. 이제 나는 내 자신의 위치를 ​​설정하고 싶다. 그래서 세 요소 벡터를 만듭니다. setPosition를위한 기능의 정의를 제공

var new_pos = THREE.Vector3(); 
new_pos.x = 1; 
new_pos.y = 2; 
new_pos.z = 3; 

childobject.matrixWorld.setPosition(new_pos); 

, 그것은 기본적으로는 이와 같이 월드 공간에서 물체의 위치를 ​​변경하는 인수로 전달 벡터의 값을 객체의 월드 행렬의 마지막 세 요소를 설정한다. 그리고 이러한 변경 후에 행렬이 업데이트되는지 확인하기 위해 다음 함수를 호출합니다.

childobject.matrixWorldNeedsUpdate = true; 
childobject.updateMatrixWorld(); 

이제 개체의 새로운 세계 행렬을 검사 할 때 setPosition 함수가 아무것도 수행하지 않은 것으로 나타났습니다.

왜? 실제 코드 예제가 필요한 경우이를 제공합니다. 그러나 위의 내용은 응용 프로그램 도메인과 구문을 정확하게 나타내야합니다. three.js를에서

답변

8

, 그냥 object.position.set(x, y, z), object.rotation.set(...)object.scale.set(...), 당신은 정말 모른다면, 당신은 일을하지 직접 object.matrix 또는 object.matrixWorld와 혼란에 무엇을 호출하는 것이 가장 좋습니다. 무대 뒤에서 무슨 일이 일어나고 무엇

은 이것이다 :

object.matrixAutoUpdate의 디폴트 값은 true입니다.

따라서 object.matrixWorld 함수는 변경하지 않은 object.postion의 현재 값으로 업데이트 중입니다. 그래서, 당신에게 아무 일도 없었던 것처럼 보입니다.

+0

왜 새 위치 값이 저장되지 않는지 설명합니다. 그러나 문제의 물체의 세계 공간 위치를 바꾸는 것이 도움이되지 않습니다. – user1349206

+0

예를 들어 두 개의 그룹 객체가 모두 10 개의 큐브 링이고 하나의 링에서 큐브를 다른 링의 큐브와 교환하려는 경우 원래 큐브의 위치를 ​​다음과 같이 설정하여 쉽게 수행 할 수 있습니다. 불행하게도 큐브의 위치는 부모 개체의 원점에 상대적이며 그 개체에서 이루어진 모든 회전 및 변경에 주관적이므로 로컬 좌표를 다른 링의 좌표로 설정하면 큐브가 무작위로 전송됩니다 위치. – user1349206

+0

부모 회전 행렬을 적용한 후 새 위치가 지정한 위치에서 끝나도록 자식 위치를 설정할 수 있습니까? – WestLangley