0

我正在渲染几个按层次排序的对象,其中大多数只知道其父对象的相对坐标系:

room()
{
    glPushMatrix();
    glMultMatrix(...);

    glBegin();
    ...
    glEnd();

    box();
    glPopMatrix();
}

box()
{
    glPushMatrix();
    glMultMatrix(...);

    glBegin();
    ...
    glEnd();

    line();
    glPopMatrix();
}

line()
{
    glPushMatrix();
    glMultMatrix(...);

    lineEntitiy();
    //mirror with respect to a global plane
    lineEntity();

    glPopMatrix();
}

lineEntity()
{
    glBegin();
    ...
    glEnd();
}

我现在想在一个已知的全局平面上镜像这些对象之一(linelineEntity这个例子中);我该怎么做?

4

2 回答 2

0

理想情况下,停止使用 OpenGL 的矩阵堆栈。没有认真的程序使用它,大多数都滚动他们自己的矩阵数学并且只使用 glLoadMatrix 加载最终结果,或者在现代 OpenGL 程序中将其加载到矩阵统一中。与流行的看法相反,OpenGL 矩阵函数并非永远不会被 GPU 加速。

通过不绑定到固定函数 OpenGL 的矩阵堆栈,您可以利用变换层次结构的任何步骤并插入其他变换,例如镜像变换。

于 2013-03-15T13:11:15.503 回答
0

如果您不使用旧的/已弃用的 GL 矩阵函数,这可能会更容易,因为您可以更好地控制空间矩阵之间的转换。

不过原理是一样的:

将当前模型变换矩阵与反映有关平面的矩阵预乘。您的平面需要位于适当的空间中,因此如果(如旧 GL 方案中的传统方法)您将视图矩阵和模型矩阵连接在一起,则需要考虑相机变换。

所以你有的是这样的:

Matrix = View * Model

你需要:

Matrix' = View * Reflect * Model

因此,您要么需要将这些转换分开,要么执行以下操作:

Matrix' = (View * Reflect * InverseView) * (View * Model)

后半部分是当前的 ModelView 矩阵,前半部分是您当前视图的常量。中间的InverseView * View部分将取消,从而产生正确的变换。然而,这确实涉及一些有效的冗余数学,包括矩阵求逆,并希望证明为什么执行您自己的矩阵运算并直接产生您需要的变换会更好。

于 2013-03-15T13:11:31.260 回答