2013-02-26 3 views
0

내가 맞다면 Object3D은 한쪽에 속성 집합이 (position, scale, rotation) [*]이고 다른 쪽이 matrix입니다.이 정보는 나중에 동일한 정보를 포함하고 있습니다. 다른 정보는 Object3D.updateMatrix()에 있으며 실제로는 하나입니다. 렌더러 계산에 의해 내부적으로 사용된다. 대신, 세트 (position, scale, rotation)은 프로그래머가 보통 조작하는 것입니다 (번역, 회전 ...).Three.js에서 Object3D.updateMatrix()의 반전?

때때로, 그러나, 하나 대신 matrixAutoUpdate=false을 설정하고 약 (position, scale, rotation)를 잊어의 추가, 직접 matrix 조작하고, 하나는, 즉 동기화 특성을 유지 Object3D.updateMatrix()가 무엇을 할 수 있지만 다른 방향으로 싶어한다. 일부 구현/효율적/권장 절차를 수행 할 수 있습니까?

[*]주의 사항 : 1) useQuaternion=true 경우에서, quaternionrotation 내가이 그림에서 up을 역할이 무엇 확실하지 않다) eulerOrder 3에 의해 보완됩니다) 대신 rotation 이 사용됩니다, 나는 그것이없는 것 같아요 여기서 중요합니다.

답변

1

루틴

Matrix4.decompose(position, quaternion, scale) // revision 57dev 

매트릭스에서 position, quaternionscale 벡터를 계산합니다.

(r.56에서 인수 이름은 불행하게도 잘못된 이름되었고,이 r.57dev에서 수정되었습니다.)

대신 rotation 벡터를 원한다면, 당신은 것입니다 방금 계산에서 계산해야 quaternion과 같이 :

rotation.setEulerFromQuaternion(quaternion, eulerOrder); 

up 벡터는 질문에 관련이 없습니다.

+0

감사합니다. 쿼터니언 대안이 선호되는 것은 이상하다. dev 브랜치를 보면,'Object3D.applyMatrix()'가 이것을 사용해야한다고 말하겠습니까? 나는 또한 그 방법 (그리고 행렬을 조작하는 다른 유사한 방법)이 (어떤 플래그, 메소드 인수 또는 객체 자체를 통해) sync를 _ 옵션으로해야한다고 제안 할 것이다. 나는이 종류 (devel) 제안을하는 장소가 정확히 어느 것이 아닌지 궁금합니다. – leonbloy

+0

'Object3D.applyMatrix()'는 dev57에서 쿼터니온을 지원합니다. 그리고, 아니, 귀하의 제안은 잘못된 가정에 근거하기 때문에 적절하지 않습니다. 'matrixAutoUpdate = false'는 객체가 정적 일 때 사용됩니다 - CPU주기를 저장합니다. 'position','rotation' 또는'scale'을 업데이트하는 대신 사용자가 행렬을 업데이트 할 수 있도록하기위한 것이 아닙니다. – WestLangley

1

3D 개체에서 applyMatrix(matrix) 메서드를 호출 할 수 있습니다. 해당 기능을 보려면 here을 참조하십시오.

다음 중 하나를

1) 당신이 그것을 단위 행렬을 공급하거나

2) 함수가 무엇을 복사 할 수 있습니다 :

this.scale.getScaleFromMatrix(this.matrix); 
var mat = new THREE.Matrix4().extractRotation(this.matrix); 
this.rotation.setEulerFromRotationMatrix(mat, this.eulerOrder); 
this.position.getPositionFromMatrix(this.matrix); 

나는 사원 수는 얼마나 확실하지 않다 당신이 위의 작업을 수행하는 경우 useQuaternion 플래그가 true로 설정된 상황을 알 수 없습니다. 그러나 기본적으로 Object3D 객체에서는 false입니다. 내가 gymbal 잠금을 피하기 위해 특정 회전을 계산할 때만 쿼터니언을 사용한다는 느낌이 들었습니다.

은 내가 lookAt() 방법에서 가져온 다음 코드는 사원 수를 업데이트 것이라고 생각 :

this.quaternion.copy(this.matrix.decompose()[ 1 ]);