2017-04-15 68 views
0

我正在學習3D模型和libgdx。我試圖在3個座標軸上旋轉我的模型,具體取決於按鍵。我的問題是,我可以在一個軸上旋轉,但不能在另一個軸上旋轉。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 

我也有一些代碼以沿三個軸的視覺指南。這裏是最終結果:

enter image description here 但是,我只能通過一個軸旋轉。我會盡快上傳一個視頻,以當前的行爲。

爲什麼model.transform.rotate調用會被搞亂?我想我誤解了matrix4幾何。

編輯:好吧,我絕對處理矩陣4不正確。無論我點擊什麼鍵,16個單元格中只有兩個正在修改。這似乎baaaaad。

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。相反,我需要通過與度的VEC 3到Matrix4.rotate:

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