Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在平行视图中保持良好的纵横比_C++_Opengl_Glm Math - Fatal编程技术网

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

C++ 如何在平行视图中保持良好的纵横比,c++,opengl,glm-math,C++,Opengl,Glm Math,我目前正在开发一个STL文件查看器,它提供两种类型的视图 透视图(工作正常): 平行视图(光线计算在这一点上有问题,但不是主题): 如您所见,平行视图已变形。以下是计算视图矩阵的方法: float distance = glm::distance(focus,transform.GetPosition())* (ScreenSize.cx/ScreenSize.cy); float distanceY = glm::distance(focus,transform.GetPosition()

我目前正在开发一个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)
  • transform.GetPosition()返回相机的实际位置
  • glm::distance(…)返回两个矢量之间的长度(相机矢量可以缩放或缩小到焦点)
为了避免失真,我的想法是获得OpenGL上下文(存储在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);