我有一个特定的模型作为查看器中的控件。用户可以单击它的不同部分以在查看器中对另一个模型执行转换(如 Unity 或 Blender 等应用程序中的控件/句柄)。
无论相机如何放大/缩小,我们都希望控件保持相同的大小。我已经尝试根据物体和相机之间的距离来缩放它的大小,但它并不完全正确。有没有完成这样的事情的标准方法?
控件是使用固定管道渲染的,但我们还有其他组件使用可编程管道。
我有一个特定的模型作为查看器中的控件。用户可以单击它的不同部分以在查看器中对另一个模型执行转换(如 Unity 或 Blender 等应用程序中的控件/句柄)。
无论相机如何放大/缩小,我们都希望控件保持相同的大小。我已经尝试根据物体和相机之间的距离来缩放它的大小,但它并不完全正确。有没有完成这样的事情的标准方法?
控件是使用固定管道渲染的,但我们还有其他组件使用可编程管道。
使用固定管道,最简单的方法是在渲染控件时不应用任何转换:
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
// draw controls
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glPushMatrix()
/调用将glPopMatrix()
确保在此代码片段的末尾恢复先前的矩阵。
完全没有变换,映射到窗口的坐标范围在两个坐标方向上都是 [-1.0 .. 1.0]。如果您需要其他任何东西,您可以在开始绘制控件之前应用必要的转换。
简单的答案是“使用可编程管道”,因为编写起来并不难
if(normalObject) {
gl_Position = projection * view * model * vertex;
} else {
gl_Position = specialMVPMatrix * vertex;
}
而您将花费更多的代码来尝试使其在固定功能管道中工作,并且需要更多的 CPU 周期来渲染它。