【问题标题】:Floatbuffer to Matrix4f Wrong Order LWJGLFloatbuffer 到 Matrix4f 错误的顺序 LWJGL
【发布时间】:2015-04-10 11:53:30
【问题描述】:

我在一个文本文件中有以下矩阵,该矩阵带入一个浮点缓冲区,然后将其存储到 LWJGL 中的 Matrix4f 类中。这是文本文件中的矩阵

1.0, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, -1.0, 0.0, 0.0,
0.0, 0.0, 0.03641997277736664, 1.0

当我像这样将浮点缓冲区添加到矩阵时

   System.out.println("------------");
   for(float x : nums){
       System.out.println(x);
   }
   System.out.println("------------");
   Matrix4f matrix4f = new Matrix4f();
   FloatBuffer buffer = BufferUtils.createFloatBuffer(nums.length);
   buffer.put(nums);
   buffer.flip();
   matrix4f.load(buffer);

其中 nums 是浮点值数组。当我打印出 Matrix4f 类时,它显示了

   1.0 0.0 0.0 0.0
   0.0 0.0 -1.0 0.0
   0.0 1.0 0.0 0.036419973
   0.0 0.0 0.0 1.0

但是如果我在 Matrix4f 类中使用转置函数,它会回到

1.0, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, -1.0, 0.0, 0.0,
0.0, 0.0, 0.03641997277736664, 1.0

为什么当我创建 Matrix4f 时 LWJGL 会更改值的顺序 I? 文本文件以列主矩阵顺序保存矩阵,这正是我在 OpenGL 中所需要的。 LWJGL 将矩阵更改为什么格式?有区别吗,我应该用转置功能改回来吗?

【问题讨论】:

  • 您确定您的num 数组按列主要顺序保存浮点数吗?因为根据文档,Matrix4f.load 方法将按列主要顺序加载数组。
  • @Nitram 是的,因为如果您看到我用于调试的 println,它会打印出pastebin.com/rNC5rRD1(这是正确的顺序)。翻转功能会不会弄乱顺序?
  • 打印输出显示您的列表主要是行而不是列主要。 Column Major 表示该列是外循环。因此,您在切换到下一列之前获取一列中的所有行。
  • 嗯,是的。您的列表是行专业的,Matrix4fload 函数需要列专业。编辑:嘿,删除评论是卑鄙的! :P
  • @Nitram 好的,现在我明白为什么矩阵的顺序不同了,那么我应该按原样加载它还是使用转置函数?应该使用哪个,这样我就可以使用这个变换矩阵来乘以一个顶点进行变换。有没有办法以正确的顺序将它从浮点数加载到矩阵而不使用转置函数来修复它?抱歉,公共 Wifi...!

标签: java opengl matrix lwjgl


【解决方案1】:

好的,答案如下:

Matrix4f 类的 load 函数要求浮点值是主要列。

所以如果你的矩阵是这样的:

11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44

列的主要顺序是:11 21 31 41 12 22 ...

读取文件的更自然的顺序是行主要的。 cmets 表明你确实做到了。

我的建议是,你就这样吧。将文件作为主要列加载比转置矩阵更经济。

【讨论】:

  • 完美,很抱歉造成混乱,看来我只是需要了解订单之间的区别。
  • 优秀!我一直在努力解决完全相同的问题,并且一直盯着它,直到我找到了这篇文章。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多