当窗口调整大小 3D 对象时,Java OpenGL 不保持大小

标签 java opengl matrix jogl perspective

我试图做到这一点,以便当窗口展开时,其中的对象保持大小。

我在顶部绘制的 2D 正交(图片中的白色图标)可以很好地调整大小,保持大小和位置,而首先绘制的 3D 则不保持大小或位置。

这是我的透视矩阵函数:

public static FloatMatrix getPerspectiveMatrix(
    Double fov, float w, float h, float near, float far
){
    float asp = w/h;
    float fov_cos = (float) Math.cos( fov / 2.0d );
    float fov_sin = (float) Math.sin( fov / 2.0d );
    float fov_cot = fov_cos/fov_sin;
    float a_0  = fov_cot/asp;
    float a_3  = (far + near)/(near-far);
    float a_43 = (2.0f * far * near)/(near-far);
    float[] an = {
            a_0,  0.0f,    0.0f, 0.0f,
            0.0f, fov_cot, 0.0f, 0.0f,
            0.0f, 0.0f,    a_3,  -1.0f,
            0.0f, 0.0f,    a_43, 0.0f,
    };
    return new FloatMatrix( an, 4, 4 );

}

这就是我在渲染函数中获取矩阵的方法:

FloatMatrix proj = FloatMatrix.getPerspectiveMatrix(
    Math.PI / 2.0d, this.width, this.height, 0.1f, 200.0f
);

正交矩阵:

public static FloatMatrix getOrtographicMatrix(
    float left, float right, float bottom, float top, float near, float far
){
    float a_0 = 2.0f / (right - left);
    float a_22 = 2/(top - bottom);
    float a_33 = -2/(far - near);
    float tx = -(right + left)/(right - left);
    float ty = -(top + bottom)/(top - bottom);
    float tz = -(far + near)/(far - near);
    float[] an = {
        a_0,  0.0f, 0.0f, 0.0f,
        0.0f, a_22, 0.0f, 0.0f,
        0.0f, 0.0f, a_33, 0.0f, 
        tx,   ty,   tz,   1.0f
    };
    return new FloatMatrix( an, 4, 4 );

}

如何在渲染器中获取 Ortho:

FloatMatrix.getOrtographicMatrix(
-this.width/30.0f, this.width/30.0f, -this.height/30.0f, this.height/30.0f, 1.0f, 1.1f
);

图片示例:

较小的 512x512

Smaller 512x512

全屏(1080)

Full Screen (1080)

最佳答案

我已经找到了这个问题的答案。 它与 fov(视野)有关

h0 = original height of the window
h1 = new height of the window
fov0 = original field of view
fov1 = new field of view

fov1 = atan( tan( fov0 / 2.0 ) * h1 / h0 ) * 2.0;

Source

当调整 GLCanvas 大小时,您可以放置​​由 GLEventListener 调用的 reshape() 函数。

关于当窗口调整大小 3D 对象时,Java OpenGL 不保持大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22214310/

相关文章:

java - 如何获取 Multipart 文件的真实扩展类型

c - OpenGL 中的位图渲染方法?

macos - MAC : missing: ZLIB_INCLUDE_DIR && OPENGL_INCLUDE_DIR

r - 根据组成员资格创建矩阵

c - 从文本文件读取后矩阵的元素未正确存储

Java正则表达式查找以SDPCDR_开头的字符串

java - VPS 和基础架构即服务 IaaS,有什么区别?

matrix - 在 Rust 中创建向量的向量

java - Java 中是否有保留的包名称?

java - JOGL FBObject 多重采样