2017-09-07 1 views
0

2 개의 단위 벡터 (나는 'Ox'및 'Oy'라고 불렀습니다), 1 개의 삽입 점 및 근처에있는 좌표계가 ' Oz '벡터는 항상 {0 0 1} 인 것처럼 보입니다. 예를 들어three.js : 2 x 3x Rotations 또는 Matrix에 대한 방향 벡터

(후 2 회전)

Ox:{x: 0.956304755963036, y: -0.292371704722735, z: 0} 
Oy:{x: -0.250611464938861, y: -0.819713166317425, z: 0.51503807491006} 
move:{x: 889.08282028218, y: -845.071708420642, z: -396.787982804802} 

문제이다 어떻게 three.js를 내의이 시스템 my_mesh를 정렬?

정말이 프로젝트 방법을 알아낼 수는 없지만, this answer 덕분에 나는이 온 :

솔루션에 접근하는 것 같다
if('Ox' in align && 'Oy' in align){ 
    var mx = new THREE.Matrix4().lookAt(align.Ox , new THREE.Vector3(0,0,0), new THREE.Vector3(0,1,0)); 
    var my = new THREE.Matrix4().lookAt(align.Oy , new THREE.Vector3(0,0,0), new THREE.Vector3(1,0,0)); 
    mx.multiply(my); 
    var qt = new THREE.Quaternion().setFromRotationMatrix(mx); 

    my_mesh.matrix.makeRotationFromQuaternion(qt); 
} 
// move 
mesh.matrix.setPosition(align.move); 
mesh.matrixAutoUpdate = false; 

?


편집 웨스트의 대답 후

, 나는 내가 벡터가 직교하지 않기 때문에이 '시스템을 좌표'라고하지 말았어야 것을 알고 있습니다. 다음은

는 회전 후 일부 레코드 ('Z30'는 오즈 약 30 ° 회전)입니다 .. 오즈 항상 {x: 0, y: 0, z: 1}

// base 
Ox: {x: 1, y: 0, z: 0} 
Oy: {x: 0, y: 1, z: 0} 
move: {x: 6.42995404746696, y: -500, z: -268.028464077285} 

// base x45 
Ox: {x: 1, y: 0, z: 0} 
Oy: {x: 0, y: -0.707106781186548, z: 0.707106781186547} 
move: {x: 6.42995404746696, y: -73.2233047033605, z: -444.805159373921} 

// base y60 
Ox: {x: 0.500000000000001, y: 0, z: 0.866025403784438} 
Oy: {x: 0, y: 1, z: 0} 
move: {x: 6.42995404746766, y: -500, z: -268.028464077285} 

// base z30 
Ox: {x: 0.866025403784439, y: 0.5, z: 0} 
Oy: {x: 0.5, y: -0.866025403784439, z: 0} 
move: {x: -118.570045952533, y: -33.4936490538881, z: -268.028464077284} 

// base z30 x45 
Ox: {x: 0.866025403784439, y: 0.353553390593274, z: -0.353553390593273} 
Oy: {x: 0.5, y: -0.612372435695795, z: 0.612372435695794} 
move: {x: -118.570045952533, y: -96.9068910760492, z: -421.1215730} 

// base z30 x45 y60 
Ox: {x: 0.739198919740117, y: 0.353553390593274, z: 0.573223304703363} 
Oy: {x: 0.28033008588991, y: 0.612372435695795, z: -0.739198919740117} 
move: {x: -63.6525674250102, y: -403.093108923947, z: -83.228734142255} 
+0

'ox','oy' 및'oz'는 상호 직교하지 않습니다. 이 경우 순수 회전을 설명하지 않습니다. 어쩌면'오즈'는 당신이 생각하는 그런 것이 아니겠습니까? – WestLangley

+0

아니 그들은 othogonal 아니,이 코딩에 대한 편집을 추가했습니다. – jeum

답변

0

당신은에 정렬 할 객체의 방향을 설정할로 설정 불리는 무엇 직각 단위 길이 벡터 3 개로 지정된 회전 된 좌표계 ​​ox, oyoz. 당신이 oz를 모르는 경우

, 당신이 그것을 계산할 수 :

var oz = new THREE.Vector3(); // create once and reuse 

oz.crossVectors(ox, oy).normalize(); 

을 그리고, 직접 mesh.matrix을 설정하려는 것으로 보인다 때문에 이렇게 : R three.js를

mesh.matrix.makeBasis(ox, oy, oz).setPosition(new_position); 

mesh.matrixAutoUpdate = false; // prevent matrix from being overwritten 

.87