2017-04-15 5 views
0

Ich lerne über 3D-Modelle und libgdx. Ich versuche, mein Modell in 3 Achsen je nach Tastendruck zu drehen. Mein Problem ist, dass ich in einer Achse drehen kann, aber nicht in den anderen beiden.libgdx trouble rotierende 3D-Modell in 2 von 3 Achsen

Video des problematischen Verhaltens ist hier: https://www.youtube.com/watch?v=IIVDB0DCWNk&feature=youtu.be

-Code jruby ist, sollte aber leicht grok sein. Hier ist mein Modell Instanziierung:

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 

Ich bin Umgang mit der Rotation des Modells in meiner inputprocessor jetzt:

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 

ich auch einige Code haben visuelle Führungen entlang der drei Achsen zu drucken. Hier ist das Endergebnis:

enter image description here Allerdings bekomme ich nur die Rotation über eine Achse. Ich werde in Kürze ein Video mit dem aktuellen Verhalten hochladen.

Warum ist der Aufruf von model.transform.rotate durcheinander? Ich glaube, ich verstehe die Matrix4-Geometrie nicht.

EDIT: Nun, ich bin auf jeden Fall die Matrix4 falsch behandelt. Egal, welche Schlüssel ich treffe, nur zwei der 16 Zellen werden modifiziert. Das scheint 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] 

Antwort

0

Heilige schnap es schnell befestigt !! Ich habe tatsächlich die Matrix vermasselt4. Stattdessen brauchte ich eine vec3 mit Grad passieren 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 

Zusammenhang Libgdx Code: https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Matrix4.html