2017-09-07 8 views
0

J'ai un système de coordonnées codé par 2 vecteurs unitaires (j'ai appelé 'Ox' et 'Oy'), 1 point d'insertion et, près, est un ' Oz 'vector qui semble toujours être {0 0 1}.three.js: 2 x vecteurs directions à 3 x rotations ou matrice

Par exemple (après 2 tours):

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} 

La question est: comment aligner my_mesh à ce système dans Three.js?

Je ne peux pas vraiment comprendre comment il se projette, mais Merci à this answer Je suis venu à ceci:

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; 

qui semble approcher la solution?


EDIT

Après la réponse de l'Ouest, je me rends compte que je ne devrais pas avoir appelé ce « système de coordonnées » puisque les vecteurs ne sont pas orthogonaux.

est Ci-dessous quelques dossiers après la rotation (moyens « Z30 » tournent 30 ° autour de Oz) .. Ce que j'ai appelé Oz est toujours à {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

Il ne ressort pas de votre description que 'ox',' oy' et 'oz' sont orthogonaux entre eux. Si tel est le cas, vous ne décrivez pas une rotation pure. Peut-être que «oz» n'est pas ce que vous pensez que c'est? – WestLangley

+0

Non, ils ne sont pas orthogonaux, a ajouté un EDIT sur ce codage. – jeum

Répondre

0

Vous souhaitez définir l'orientation d'un objet à l'aligner sur une système de coordonnées pivoté spécifié par trois vecteurs de longueur unitaire orthogonaux ox, oy et oz.

Si vous ne connaissez pas oz, vous pouvez le calculer:

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

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

Alors, puisque vous semblez vouloir mettre mesh.matrix directement, faites ceci:

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

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

Three.js r .87