问题描述
我目前正在使用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);
我必须解释一下这段代码:
- 焦点是我正在查看的模型的中心点(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);