【发布时间】:2023-03-28 18:21:01
【问题描述】:
我有透视投影的 3D 场景。我也可以在场景中选择一个对象。我需要为选定的对象绘制轴。问题是轴不会在透视投影中保存它们的大小。如果物体远离眼睛(相机),轴也会变小。
无论眼睛(相机)的位置如何,如何绘制相同大小的轴?
【问题讨论】:
标签: opengl projection perspective orthographic
我有透视投影的 3D 场景。我也可以在场景中选择一个对象。我需要为选定的对象绘制轴。问题是轴不会在透视投影中保存它们的大小。如果物体远离眼睛(相机),轴也会变小。
无论眼睛(相机)的位置如何,如何绘制相同大小的轴?
【问题讨论】:
标签: opengl projection perspective orthographic
有两种方法可以实现:
仅着色器方法
看透视投影时,大小随深度的变化是由透视除法(将所有分量除以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 分量给出了屏幕空间中必须放置轴的位置。
现在使用这个位置用正交投影来渲染轴,无论轴有多远,它都会保持大小。
缺点:使用这种方法,深度值可能与场景的透视投影部分不兼容。
【讨论】: