如何在平行视图中保持良好的长宽比

问题描述

我目前正在使用STL文件查看器,该查看器提供两种视图。

透视图(工作正常):

Perspective view

和平行视图(光照计算对此有问题,但不是主题):

Parallel view

您可以看到平行视图变形了。这是我计算视图矩阵的方式:

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);

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

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

我想避免变形的想法是获取我的OpenGL上下文的实际比例的screenSize(存储在 ScreenSize 中),并乘以它的距离,以便在任何屏幕尺寸下都保持兔子不变。但这不起作用,兔子仍然被拉伸或压碎。

无论平行视图上的屏幕尺寸如何,我如何防止3D模型变形?

解决方法

删除屏幕尺寸位之一?现在,如果您的窗户的高度是宽度的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);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...