我目前正试图在OpenGL中为一个游戏设置正射投影,但我在正确设置它方面有点挣扎。
目前,我正在使用以下简单函数计算投影:
glm::mat4 projection = glm::ortho(0.0f, width, height, 0.0f, -10000.0f, 10000.0f);
其中宽度和高度由屏幕尺寸给出。
但是这会导致一些问题,即当我改变屏幕大小时,屏幕上的对象会被拉伸或压缩。当屏幕大小变大时,会显示更多的当前场景。
我想要的是,我总是看到相同的东西在屏幕上独立于大小的窗口,但它也不应该扭曲,如果我调整窗口的一些奇怪的高宽比。
我尝试了一些东西,如使用宽高比,但我要么没有看到屏幕上的任何东西或东西甚至更严重的扭曲。
这里也是我的模型和视图矩阵代码,以防我做错了什么:
glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(TransformComponent.position.x+width/2 /*width and height are needed to place the object in the center of the screen*/, TransformComponent.position.y+height/2, TransformComponent.position.z));
model = glm::scale(model, glm::vec3(renderable.GetWidth(), renderable.GetHeight(), 1.0f));
sh.setMat4("model", model);
ViewMatrix
glm::mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3(position,0)) *
glm::rotate(glm::mat4(1.0f), glm::radians(0.0f), glm::vec3(0, 0, 1));
glm::mat4 m_ViewMatrix = glm::inverse(transform);
小屏幕
大屏幕
屏幕变形
另一个扭曲的例子
1条答案
按热度按时间icomxhvb1#
如果您使用分辨率来缩放居中的2D对象,则原始偏移量将以1:1的比例将其居中。
然后使用下面的公式将所有这些都放到矩阵中,然后得到一个居中的相位显示:
如果你不想让对象在更高的分辨率下缩小,我建议你使用默认的高度,比如: