2017-09-07 14 views
0

2つの単位ベクトル(私は 'Ox'と 'Oy'と呼ばれています)、1つの挿入ポイント、常に{0 0 1}と思われるOz 'ベクトルを生成する。例えばthree.js:2 x 3回転ベクトルまたはマトリックスへの方向ベクトル

(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; 

?西の答えの後


EDIT

、私はベクトルが直交していないので、私はこの「座標システム」と呼ばれていてはならないことを実現します。以下は

は、回転後にいくつかのレコード(「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ではない、このコーディングについてのEDITを加えました。 – jeum

答えて

0

あなたがに整列するオブジェクトの方向を設定したいに設定されていると呼ばれる何直交する3つの単位長ベクトルで指定される回転座標系ox,oy、およびoz。あなたが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