2017-04-15 4 views
0

3D 모델과 libgdx에 대해 배우고 있습니다. 키 누르기에 따라 3 축으로 모델을 회전하려고합니다. 내 문제는 하나의 축에서 회전 할 수 있지만 다른 두 축에서는 회전 할 수 없다는 것입니다. 문제가있는 행동의libgdx 문제가 3 축 중 2 축에서 3D 모델 회전.

비디오는 여기에 있습니다 : https://www.youtube.com/watch?v=IIVDB0DCWNk&feature=youtu.be

코드 JRuby를하지만, grok 수 쉬워야한다.

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 기하학을 오해하고 있다고 생각합니다.

편집 : 글쎄 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를 실제로 망쳤다.

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

대신 나는 Matrix4.rotate 할 수도있는 VEC3를 전달하는 데 필요