opengl - 使用 "spherical frustum"进行 3D 投影

标签 opengl 3d

我目前正在编写从模型空间到剪辑空间的转换,以便在 OpenGL 中使用。据我所知,程序员通常使用传统的矩形截头体来定义模型空间中的裁剪边界。我个人想到了一个像截锥体的形状,除了近平面和远平面是以截锥体(相机)顶点为中心的球体。所以看起来像这样:

Circular sector

黄色区域对应于 OpenGL 的裁剪空间,两个球体(在此横截面图像中描绘为圆圈)对应于 OpenGL 的 z=-1 (内球体)和 z=1 (外球体)。

这是一种更现实的投影建模方式,还是在设计投影矩阵时我应该坚持使用传统的矩形截头体?

最佳答案

不。我不确定你说的完全诚实是什么意思,但无论如何都不是。

  • 你的意思是 View 坐标(通常是视锥体)应该以球体为界?

  • 好吧,在许多(全部?,大多数?)与剪切平面相交的大多边形中,实际上被分解成较小的三角形,否则,外部有一个顶点的单个大多边形将被简单地忽略。这就是剪辑实际涉及的内容。

    还记得当你玩旧游戏并走进物体时,如果你离得太近,它们就会消失吗?如果当多边形的角刚好在 View 之外时,洞的东西就消失了,这不是很糟糕吗?见 this为了澄清。
  • 另一方面,您可能意味着 View 空间应该是
    投影到球体而不是平面上。

  • 屏幕是平坦的,因此 3d 场景中的对象被投影到平坦的表面上,相当于跟踪从对象到相机的光线并找到它与显示器相交的位置。奇怪的“不切实际”的 3d 外观是由于观看者的眼睛 a) 不是点相机和 b) 很少在正确的视场距离处。

    关于opengl - 使用 "spherical frustum"进行 3D 投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20740829/

    相关文章:

    c++ - 在 OPENGL 中计算直方图

    c++ - OpenGL矩形莫名其妙地占据了整个窗口

    c++ - 绑定(bind)在 OpenGL 中创建背景

    3d - 3D 游戏中的大量物体

    c++ - 为什么我在 OpenGL/GLFW C++ 中的 3d 形状缺少面孔

    将射弹模拟转换为 3D 会导致绘图消失?

    opengl - 如何使用 gstreamer crates 从 BufferRef 中提取 GL 纹理 ID?

    c# - 如何使 tekla 控件在 WPF 中工作?

    algorithm - 检测三角形和旋转球体之间的 3D 碰撞

    iphone - 如何使用大气着色器为iOS制作逼真的3D地球