【问题标题】:How to use GLKMatrixStack?如何使用 GLKMatrixStack?
【发布时间】:2012-04-07 10:38:59
【问题描述】:

我正在编写一个在屏幕上绘制许多立方体的 iOS 游戏,但我在定位立方体时遇到了问题。

我有一个绘制立方体的函数draw_voxel

void draw_voxel(Point location, Color color, GLKMatrixStackRef stack) {
  GLKMatrixStackPush(stack);
  GLKMatrixStackTranslate(stack, location.x, location.y, location.z);

  std::array<Color, 36> triangle_colors;
  triangle_colors.fill(color);

  glEnableVertexAttribArray(GLKVertexAttribPosition);
  glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, static_cast<const GLvoid*>(triangle_vertices.data()));
  glEnableVertexAttribArray(GLKVertexAttribColor);
  glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 0, static_cast<const GLvoid*>(triangle_colors.data()));
  glDrawArrays(GL_TRIANGLES, 0, 36);
  glDisableVertexAttribArray(GLKVertexAttribPosition);
  glDisableVertexAttribArray(GLKVertexAttribColor);

  GLKMatrixStackPop(stack);
}

我将GLKMatrixStackRef 传递给它,将当前矩阵推到顶部并使用GLKMatrixStackTranslate 转换顶部矩阵。但是,所有立方体仍然在 (0, 0, 0) 处绘制。

我这样称呼draw_voxel

[self.effect prepareToDraw];

GLKMatrixStackRef stack = GLKMatrixStackCreate(nullptr);
draw_voxel(Point(-1.0f, 0.0f, 0.0f), Color(1.0f, 0.0f, 0.0f, 1.0f), stack);
draw_voxel(Point(+0.0f, 0.0f, 0.0f), Color(0.0f, 1.0f, 0.0f, 1.0f), stack);
draw_voxel(Point(+1.0f, 0.0f, 0.0f), Color(0.0f, 0.0f, 1.0f, 1.0f), stack);
CFRelease(stack);

我在互联网上找不到任何关于 GLKit 矩阵堆栈的有用信息,我真的被困住了。如何“应用”顶部矩阵以平移立方体?

【问题讨论】:

    标签: objective-c opengl-es objective-c++ glkit


    【解决方案1】:

    虽然我还没有完全掌握如何使用 GLKMatrixStack,但查看您的代码,我认为问题在于您没有将堆栈的顶部矩​​阵传递给着色器,或者,用 GLKit 的话来说,您没有正确配置效果。 也许,在某些时候你应该做这样的事情:

    self.effect.transform.modelviewMatrix = GLKMatrixStackGetMatrix4(stack);
    

    希望有帮助,我也被困在那个堆栈上:)

    【讨论】:

    • 然后发送-prepareToDraw,然后在弹出堆栈后做同样的事情,对吧?我只需要将效果作为参数传递给draw_voxel
    • 实际上,我不确定您要达到什么目的。您在每次渲染过程中创建一个新堆栈,然后使用它来计算单个平移并弹出顶部矩阵。据我了解,矩阵堆栈在分层动画系统中很有用。或许您可以通过GLKMatrix4MakeTranslate 调用获得所需的GLKMatrix4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    相关资源
    最近更新 更多