如何解决如何在平行视图中保持良好的长宽比
我目前正在使用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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。