我正在学习3d模型和libgdx。我正在尝试根据按键在3轴上旋转我的模型。我的问题是,我能够在一个轴上旋转,而不是在另外两个轴上旋转。
有问题的行为的视频在这里: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
我现在在输入处理器中处理模型的旋转:
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。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 :(得分:0)
Holy schnap快速修复!!我确实在搞乱矩阵4。相反,我需要将带有度数的vec3传递给Matrix4.rotate:
button {
outline: 0;
}
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);
相关的libgdx代码: https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Matrix4.html