首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libgdx故障在3轴中的2轴旋转三维模型

libgdx故障在3轴中的2轴旋转三维模型
EN

Stack Overflow用户
提问于 2017-04-15 15:25:09
回答 1查看 80关注 0票数 0

我正在学习3d模型和libgdx。我试图旋转我的模型在三个轴取决于一个按键。我的问题是,我可以在一个轴上旋转,而不能在另外两个轴上旋转。

有问题行为的视频如下:https://www.youtube.com/watch?v=IIVDB0DCWNk&feature=youtu.be

代码是jruby,但是应该很容易理解。下面是我的模型实例化:

代码语言:javascript
复制
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

目前,我正在处理输入处理器中模型的旋转:

代码语言:javascript
复制
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

我还有一些代码可以沿着这三个轴打印视觉指南。以下是最终结果:

然而,我只得到一个轴的旋转。我很快就会上传一个带有当前行为的视频。

为什么model.transform.rotate调用被搞砸了?我想我误解了matrix4几何。

编辑:嗯,我肯定是不正确地处理matrix4。不管我按了什么键,16个细胞中只有两个被修改了。那好像是baaaaad

代码语言:javascript
复制
def keyDown(keycode)
  puts "keyDown: #{keycode}"
  if $desktop
    print $cruiser.transform
代码语言:javascript
复制
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]
EN

回答 1

Stack Overflow用户

发布于 2017-04-15 16:02:41

天呐,快修好了!!我确实是在搞砸matrix4。相反,我需要通过一个与Matrix4成度的vec3:

代码语言:javascript
复制
  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);
代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43427827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档