如何在平行视图中保持良好的纵横比

Posted

技术标签:

【中文标题】如何在平行视图中保持良好的纵横比【英文标题】:How to keep good aspect ratio in parallel view 【发布时间】:2020-08-10 18:21:13 【问题描述】:

我目前正在开发一个提供两种视图的 STL 文件查看器。

透视图(效果很好):

和一个平行视图(光计算在这个上有问题,但不是主题):

如您所见,平行视图已变形。以下是我计算视图矩阵的方法:

float distance = glm::distance(focus,transform.GetPosition())* (ScreenSize.cx/ScreenSize.cy);
float distanceY = glm::distance(focus,transform.GetPosition())* (ScreenSize.cy/ScreenSize.cx);
return glm::ortho(-distance ,distance ,-distanceY ,distanceY, 0.00001f, 10000.0f);

我必须解释一下这段代码:

focus 是我正在查看的模型的中心点 (0 0 0) transform.GetPosition() 返回相机的实际位置 glm::distance(...) 返回两个向量之间的长度(相机向量可以缩放或缩小到焦点)

我避免失真的想法是获取我的 OpenGL 上下文的实际比率的 screenSize(存储在 ScreenSize 中)并将我的距离乘以它,以保持兔子不变,无论屏幕大小是多少.但它不起作用,兔子仍然被拉伸或压碎。

我怎样才能防止我的 3D 模型在平行视图上的屏幕尺寸发生扭曲?

【问题讨论】:

【参考方案1】:

删除屏幕大小位之一?现在,如果您的窗口是宽度的 3/4 高,那么您将高度设置为 3/4 高(到目前为止还不错)您也在设置宽度宽度的 4/3。你需要做一个或另一个,但不能两者都做。

大多数电脑游戏似乎都保持高度相同——因此垂直视距始终为 1(例如)——并调整宽度:

float distance = glm::distance(focus,transform.GetPosition())*(ScreenSize.cx/ScreenSize.cy);
//                                           delete this part vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
float distanceY = glm::distance(focus,transform.GetPosition())*(ScreenSize.cy/ScreenSize.cx);

【讨论】:

以上是关于如何在平行视图中保持良好的纵横比的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 子视图在缩放下不保持正确的边界尺寸

通过保持纵横比和宽度调整 UIImage 的大小

在 Android WebView 中显示谷歌纵横位置徽章时出现问题

如何在保持纵横比的矩形内放置 30 张图像

如何将字典保存到文件中,保持良好的格式?

通过指定新的纵横比来拟合图像