【问题标题】:Render a 3D model with the same size regardless of camera position无论相机位置如何,都以相同大小渲染 3D 模型
【发布时间】:2015-11-15 13:13:33
【问题描述】:

我有一个特定的模型作为查看器中的控件。用户可以单击它的不同部分以在查看器中对另一个模型执行转换(例如 Unity 或 Blender 等应用程序中的控件/句柄)。

无论相机放大/缩小多少,我们都希望控件的大小保持不变。我已经尝试根据物体和相机之间的距离来缩放它的大小,但它并不完全正确。有没有标准的方法来完成这样的事情?

控件是使用固定管道渲染的,但我们有其他组件使用可编程管道。

【问题讨论】:

  • 我不太确定这里的问题是什么。我假设您知道透视投影和正交投影之间的区别?听起来你只需要后者。

标签: opengl camera scale immediate-mode


【解决方案1】:

简单的答案是“使用可编程管道”,因为它并不难编写

if(normalObject) {
    gl_Position = projection * view * model * vertex;
} else {
    gl_Position = specialMVPMatrix * vertex;
}

而您将花费更多的代码来尝试使其在固定功能管道中工作并花费更多的 CPU 周期来渲染它。

【讨论】:

  • 我不明白为什么这与固定功能与可编程管道有关。在这两种情况下,只使用不同的矩阵进行渲染,使着色器中的条件变得毫无意义。可以直接更改矩阵,而不是更改normalObject
  • 有一百万种编程方法。我的代码只是一个例子。重要的是,如果他们坚持使用 FFP,那么调整控件的呈现方式就会变得更加麻烦。
  • 好吧,我不是在反对着色器(我也不是反对这个的人)。但在这种特殊情况下,我没有看到着色器与固定管道的任何相关差异。这只是用于渲染的矩阵。
【解决方案2】:

使用固定管道,最简单的方法是在渲染控件时不应用任何转换:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();

// draw controls

glPopMatrix();

glMatrixMode(GL_MODELVIEW);
glPopMatrix();

glPushMatrix()/glPopMatrix() 调用将确保在此代码片段的末尾恢复先前的矩阵。

完全不进行任何变换,映射到窗口的坐标范围在两个坐标方向上都是 [-1.0 .. 1.0]。如果您需要其他任何东西,可以在开始绘制控件之前应用必要的转换。

【讨论】:

    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多