【问题标题】:How to draw ortho axes for object in perspective projection using modern OpenGL? [closed]如何使用现代 OpenGL 在透视投影中为对象绘制正交轴? [关闭]
【发布时间】:2023-03-28 18:21:01
【问题描述】:

我有透视投影的 3D 场景。我也可以在场景中选择一个对象。我需要为选定的对象绘制轴。问题是轴不会在透视投影中保存它们的大小。如果物体远离眼睛(相机),轴也会变小。

无论眼睛(相机)的位置如何,如何绘制相同大小的轴?

【问题讨论】:

    标签: opengl projection perspective orthographic


    【解决方案1】:

    有两种方法可以实现:

    仅着色器方法

    看透视投影时,大小随深度的变化是由透视除法(将所有分量除以w)引起的。如果您想防止这种情况发生,您可以将投影顶点的 x 和 y 坐标与 w 坐标相乘,这将抵消透视分割。这有点棘手,因为在所有其他转换之前进行更正,但是沿着这条线的东西应该适用于一般情况:

    vec4 ndc = MVP * vec4(pos, 1);
    float sz = ndc.w;
    
    gl_Position= MVP * vec4(pos.xy * sz, pos.z, 1);
    

    缺点:需要专门的着色​​器

    CPU 方法

    另一种选择是使用正交投影渲染轴,同时计算它必须放置在 CPU 上的位置。

    这可以例如通过使用透视投影来投影目标位置来完成,执行透视分割。生成的 x,y 分量给出了屏幕空间中必须放置轴的位置。

    现在使用这个位置用正交投影来渲染轴,无论轴有多远,它都会保持大小。

    缺点:使用这种方法,深度值可能与场景的透视投影部分不兼容。

    【讨论】:

    • 使用着色器方法后,我的 3D 场景被破坏了。你确定这种方法有效吗?你有一个可行的例子吗?
    • 是的,100% 确定。那是我的着色器之一(除了它周围的样板代码)。不幸的是,由于该应用程序是封闭源代码,因此我无法链接到它。你确定你只用这个着色器渲染轴吗?我不知道这怎么会破坏其余的场景?
    • 不,我尝试将它用于整个 3D 场景,这真是个坏主意:D 我只将这个着色器用于轴,它实际上可以工作,但不适用于轴 Oz。 Oz 轴仍然改变它的大小。我该如何解决?
    • 啊,是的。也将 pos.z 与 sz 相乘
    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 2013-11-26
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2014-07-06
    相关资源
    最近更新 更多