如何镜像对象相对于全局平面

时间:2013-03-15 12:15:28

标签: opengl

我正在渲染几个按层次排列的对象,大部分都只知道其父级的相对坐标系:

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);我该怎么做?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果您不使用旧的/不推荐的GL矩阵函数,这可能会更容易,因为您可以更准确地控制矩阵正在转换的空间。

然而原则是一样的:

将当前模型变换矩阵乘以反映所讨论平面的矩阵。你的飞机需要在适当的空间内,所以如果(在旧GL方案中是传统的)你同时连接了视图和模型矩阵,你需要考虑相机变换。

所以你拥有的是:

Matrix = View * Model

你需要:

Matrix' = View * Reflect * Model

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

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

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