像Unity中一样的OpenGL“自由纵横比”

y53ybaqx  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(116)

我在Visual Studio中使用OpenGL和C++制作了自己的简单关卡编辑器,为安卓手机创建游戏。但我偶然发现了一个问题,我在编辑器中放置的一些对象在安卓上不能正确显示,有时甚至不显示。我一直在四处寻找,但没有找到解决方案。所以这里是我的关卡编辑器的正交摄像头和屏幕分辨率:

摄影机对象正交矩阵:

GoldState::aspectRatio = m_AspectRatio = (float)width / (float)height;
    float orthoLeft = 0.0f; //* m_AspectRatio;
    float orthoRight = 100.0f; //* m_AspectRatio;
    float orthoUp = 100.0f;
    float orthoDown = 0.0f;
    m_OrthoMatrix = glm::ortho(orthoLeft, orthoRight, orthoDown, orthoUp);

Android也是一样的(使用ndk)。
宽高比被注解掉了,因为我在做实验,如果不乘以宽高比,整个世界都会被拉伸。
现在说到unity的自由长宽比,我有一种感觉,就像我的正射相机没有乘以长宽比。这到底是什么,当我选择自由长宽比时,我放在unity上的每个对象如何保持1:1,而不是拉伸或其他什么?如果有人能给我解释一下,这真的会帮助我很多。
还有一件事。我已经在android上用opengl做了几款游戏,但我特别制作了背景图像,以准确的宽度和高度,因为我一直在我的正交矩阵中乘以纵横比。但这次我只想提取背景和对象的位置和大小,并让他们保持他们的纵横比,而不拉伸不同的分辨率。
如果有任何其他的通用解决方案,这将是很好的,如果没有,我想我应该使用一些固定的分辨率对水平编辑器和使用相同的分辨率为android?

gpnt7bae

gpnt7bae1#

它应该可以做到这一点:

GoldState::aspectRatio = m_AspectRatio = (float)width / (float)height;
GoldState::orthoSize = m_OrthoSize = ((float)width / (float)height < 16f / 9f ? (float)width / (float)height : 16f / 9f) / (16f / 9f);
float srcAspectRatio = 1f / 1f; //* Original aspect, default: 1.0;
float orthoLeft = 0.0f;
float orthoRight = 100.0f;
float orthoUp = 100.0f;
float orthoDown = 0.0f;
m_OrthoMatrix = glm::ortho(((0.5f*(orthoright - orthoLeft) + ortholeft) * srcAspectRatio) - (0.5f*(orthoright - orthoLeft) * m_AspectRatio * m_OrthoSize), ((0.5f*(orthoright - orthoLeft) + ortholeft) * srcAspectRatio) + (0.5f*(orthoright - orthoLeft) * m_AspectRatio * m_OrthoSize),(0.5f*(orthoDown - orthoUp) + orthoUp) - (0.5f*(orthoDown - orthoUp) * m_OrthoSize),(0.5f*(orthoDown - orthoUp) + orthoUp) + (0.5f*(orthoDown - orthoUp) * m_OrthoSize));

相关问题