2017-04-15 2 views
0

私は3Dモデルとlibgdxについて学んでいます。キーの押下に応じて3軸でモデルを回転しようとしています。私の問題は、私は1つの軸で回転できるが、他の2つは回転できないということです。libgdxは3軸のうちの2軸で3Dモデルを回転させていません

問題行動のビデオはここにある:https://www.youtube.com/watch?v=IIVDB0DCWNk&feature=youtu.be

コードはJRubyのですが、完全に理解するのは簡単でなければなりません。

def setup_3d_models 
    @modelBatch = ModelBatch.new 
    jsonReader = UBJsonReader.new 
    modelLoader = G3dModelLoader.new(jsonReader) 
    model = modelLoader.loadModel(fh('models3d/space_cruiser_4.g3db')) 
    $cruiser = ModelInstance.new(model) 
end 

私は今の私のinputprocessorでモデルの回転を処理しています:

class InputMuxer < InputAdapter 

    INCREMENT = 15 

    def keyDown(keycode) 
    puts "keyDown: #{keycode}" 
    if $desktop 
     case keycode 
     when Input::Keys::J 
     $cruiser.transform.rotate(1, 0, 0, -INCREMENT); 
     when Input::Keys::K 
     puts 'pressed K' 
     $cruiser.transform.rotate(1, 0, 0, INCREMENT); 
     when Input::Keys::U 
     puts 'pressed U' 
     $cruiser.transform.rotate(1, 0, -INCREMENT, 0); 
     when Input::Keys::I 
     puts 'pressed I' 
     $cruiser.transform.rotate(1, 0, INCREMENT, 0); 
     when Input::Keys::N 
     puts 'pressed N' 
     $cruiser.transform.rotate(1, INCREMENT, 0, 0); 
     when Input::Keys::M 
     puts 'pressed M' 
     $cruiser.transform.rotate(1, -INCREMENT, 0, 0); 
     end 
    end 

私はまた、3軸の視覚的なガイドを印刷するためのいくつかのコードを持ってここに私のモデルのインスタンスです。ここに最終結果があります:

enter image description here しかし、私は1つの軸で回転します。私はすぐに現在の動作でビデオをアップロードします。

model.transform.rotate呼び出しがうまくいかない理由は何ですか?私は行列4の幾何学を誤解していると思う。

編集:よく私は間違ってmatrix4を間違って処理しています。どんなキーを押しても、16のセルのうち2つだけが変更されています。それは馬鹿だ。

def keyDown(keycode) 
    puts "keyDown: #{keycode}" 
    if $desktop 
    print $cruiser.transform 

keyDown: 41 
[1.0|0.0|0.0|0.0] 
[0.0|5.6177378E-6|0.9999998|0.0] 
[0.0|-0.9999998|5.6177378E-6|0.0] 
[0.0|0.0|0.0|1.0] 
pressed M 
keyDown: 39 
[1.0|0.0|0.0|0.0] 
[0.0|5.6177378E-6|0.9999998|0.0] 
[0.0|-0.9999998|5.6177378E-6|0.0] 
[0.0|0.0|0.0|1.0] 
pressed K 
keyDown: 39 
[1.0|0.0|0.0|0.0] 
[0.0|0.25882444|0.9659242|0.0] 
[0.0|-0.9659242|0.25882444|0.0] 
[0.0|0.0|0.0|1.0] 

答えて

0

聖なるschnap迅速にそれを固定!私は実際にマトリックス4をつぶしていた。代わりに、私はMatrix4.rotate度でvec3を渡すために必要な:

when Input::Keys::J 
    $cruiser.transform.rotate(rotation_vec3(:x), -INCREMENT); 
    when Input::Keys::K 
    puts 'pressed K' 
    $cruiser.transform.rotate(rotation_vec3(:x), INCREMENT); 
    when Input::Keys::U 
    puts 'pressed U' 
    $cruiser.transform.rotate(rotation_vec3(:y), -INCREMENT); 
    when Input::Keys::I 
    puts 'pressed I' 
    $cruiser.transform.rotate(rotation_vec3(:y), INCREMENT); 
    when Input::Keys::N 
    puts 'pressed N' 
    $cruiser.transform.rotate(rotation_vec3(:z), INCREMENT); 
    when Input::Keys::M 
    puts 'pressed M' 
    $cruiser.transform.rotate(rotation_vec3(:z), -INCREMENT); 

def rotation_vec3(axis) 
    vs = { 
     :x => [1.0,0.0,0.0], 
     :y => [0.0,1.0,0.0], 
     :z => [0.0,0.0,1.0] 
    } 
    Vector3.new(vs[axis].to_java(:float)) 
    end 

関連libgdxコード: https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Matrix4.html

関連する問題