gpt4 book ai didi

c++ - 如何在平行 View 中保持良好的纵横比

转载 作者:行者123 更新时间:2023-12-02 09:59:30 25 4
gpt4 key购买 nike

我目前正在开发一个提供两种 View 的 STL 文件查看器。
透视图(效果很好):
Perspective view
和一个平行 View (光计算在这个上有问题,但它不是主题):
Parallel view
如您所见,平行 View 已变形。这是我计算 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)
  • 变换.GetPosition() 返回相机的实际位置
  • glm::距离(...) 返回两个 vector 之间的长度(相机 vector 可以缩放或缩小到焦点)

  • 我避免失真的想法是获取我的 OpenGL 上下文(存储在 ScreenSize 中)的实际比率的 screenSize 并将我的距离乘以它,以使兔子保持不变,无论屏幕大小是多少。但它不起作用,兔子仍然被拉伸(stretch)或压碎。
    我怎么能防止我的 3D 模型在平行 View 上的屏幕尺寸被扭曲?

    最佳答案

    删除屏幕大小位之一?现在,如果您的 window 是宽度的 3/4 高,那么您将高度设置为 3/4 高(到目前为止还不错),但您也将宽度设置为宽度的 4/3。你需要做一个或另一个,但不能两者都做。
    大多数电脑游戏似乎保持高度相同 - 因此垂直 View 距离始终为 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);

    关于c++ - 如何在平行 View 中保持良好的纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63345892/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com