【问题标题】:How to mirror object relative to global plane如何相对于全局平面镜像对象
【发布时间】:2013-03-15 12:15:28
【问题描述】:

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

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();
}

我现在想在已知的全局平面上镜像这些对象之一(本例中为line 和lineEntity);我该怎么做?

【问题讨论】:

    标签: opengl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      不过原理是一样的:

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

      所以你所拥有的是这样的:

      Matrix = View * Model
      

      你需要:

      Matrix' = View * Reflect * Model
      

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-07-17
        • 1970-01-01
        • 2016-05-09
        • 2011-04-12
        • 2013-07-06
        • 2015-03-23
        • 2016-02-16
        • 1970-01-01
        • 2022-11-18
        相关资源
        最近更新 更多