gpt4 book ai didi

java - OpenGL 矩阵乘法导致奇数浮点行为

转载 作者:行者123 更新时间:2023-12-02 07:16:40 26 4
gpt4 key购买 nike

我有一个用 LWJGL 为 java 编写的基本 OpenGL 程序。在阅读了为什么使用俯仰、偏航和滚动变量是一个坏主意之后,我才开始研究旋转矩阵。然而,由于矩阵更难以使用,我正在编写一个函数,它接受偏航、俯仰和滚动并将它们转换为旋转矩阵,然后将其与模型 View 矩阵相乘。我的代码如下:

public static void loadRotationalMatrix(double pitch, double yaw, double roll)
{
FloatBuffer Ry = ByteBuffer.allocateDirect(16 * Double.SIZE).asFloatBuffer();
FloatBuffer Rx = ByteBuffer.allocateDirect(16 * Double.SIZE).asFloatBuffer();
FloatBuffer Rz = ByteBuffer.allocateDirect(16 * Double.SIZE).asFloatBuffer();

Rx.put(new float[]
{
1, 0, 0, 0,
0, (float) cos(pitch), (float) sin(pitch), 0,
0, (float) -sin(pitch), (float) cos(pitch), 0,
0, 0, 0, 1
});
Ry.put(new float[]
{
(float) cos(yaw), 0, (float) -sin(yaw), 0,
0, 1, 0, 0,
(float) sin(yaw), 0, (float) cos(yaw), 0,
0, 0, 0, 1
});
Rz.put(new float[]
{
(float) cos(roll), (float) sin(roll), 0, 0,
(float) -sin(roll), (float) cos(roll), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
});

GL11.glMultMatrix(Rx);
GL11.glMultMatrix(Ry);
GL11.glMultMatrix(Rz);
}

首先,我将 0, 0, 0 传递给此函数,我预计这不会对渲染的场景产生任何影响。然而,我正在绘制的简单正方形在函数调用后消失了。为了进行调试,我使用 glGetFloat 访问模型 View 矩阵并查看发生了什么。

这就是事情变得奇怪的地方(至少对我来说):在调用我的函数之前,检索到的存储模型 View 矩阵的 FloatBuffer 是

4.6006E-41, 0.0, 0.0, 0.0, 0.0, 4.6006E-41, 0.0, 0.0, 0.0, 0.0, 4.6006E-41, 0.0, 0.0, 0.0, 0.0, 4.6006E-41, 

或者,更具可读性,

4.6006E-41, 0.0, 0.0, 0.0, 
0.0, 4.6006E-41, 0.0, 0.0,
0.0, 0.0, 4.6006E-41, 0.0,
0.0, 0.0, 0.0, 4.6006E-41,

一切都正常渲染。

在我调用之后,矩阵变为

0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0,

我的测试方 block 消失了。

发生了什么事?我的矩阵创建不正确吗?关于 glMultMatrix 有什么我不明白的地方吗?我需要启用或禁用某些功能吗?为什么普通矩阵中有那些奇怪的 float ?它不是应该是单位矩阵(带有 1)吗?

编辑:

如果使用 BufferUtils.createFloatBuffer(16 * Float.SIZE); 代替 ByteBuffer.allocateDirect(16 * Float.SIZE).asFloatBuffer();,则提到的字节排序问题消失了,4.6006E-41 变成了预期的 1.0。然而,矩阵仍然从恒等变换为纯零。

最佳答案

(这实际上是一个扩展评论,带有代码)

这里肯定存在字节顺序问题。我运行了以下命令:

public class Test {
public static void main(String[] args) {
float f = (float)4.6006E-41;
System.out.println(Integer.toHexString(Float.floatToIntBits(f)));
}
}

并得到输出 803f

Float 1.0 是大尾数 0x3f800000。

关于java - OpenGL 矩阵乘法导致奇数浮点行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14864299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com