2017-04-15 71 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