我目前正在开发一个提供两种视图的 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 模型在平行视图上的屏幕尺寸被扭曲?