【问题标题】:Convert canvas coordinate system to OpenGLES 2.0 coordinates将画布坐标系转换为 OpenGLES 2.0 坐标
【发布时间】:2012-06-05 17:04:07
【问题描述】:

我开始使用 Path 对象在画布上绘制六边形网格。我根据六边形的大小计算了特定显示器上有多少个六边形。

我根据画布计算了所有六边形坐标。但是现在,我遇到了严重的性能问题,必须将其移植到 OpenGL。

因为该算法适用于画布,我正在尝试使用 GLU.gluUnProject 将那些“画布”六边形坐标转换为 OpenGL 坐标系。

“for循环”

float near[] = { 0.0f, 0.0f, 0.0f, 0.0f };
            GLU.gluUnProject(b.hexes[ii][jj].points[ii].x,
                    b.hexes[ii][jj].points[ii].y, 0, mg.mModelView, 0,
                    mg.mProjection, 0, viewport, 0, near, 0);
vertices[zz] = (float) ((near[0])/near[3]);
            zz++;
            vertices[zz] = (float) ((near[1])/near[3]);
            zz++;
            vertices[zz] = 0;

由于我缺乏opengl知识,我不知道如何将glViewport、gluPerspective、glTranslatef设置为与画布“相同”的2D世界。

所以我的问题是:

如何设置我的第一个六边形(在画布上,第一个在左上角)在openGL绘图表面世界上相等?

更新

感谢大家有兴趣帮助解决我的问题。但是:

我现在将我的 18 个浮点顶点数组设置如下: [20.0, 0.0, 0.0, 60.0, 0.0, 0.0, 80.0, 34.641018, 0.0, 60.0, 69.282036, 0.0, 20.0, 69.282036, 0.0, 0.0, 34.641018, 0.0] Z 始终为 0。

ByteBuffer vertexByteBuffer = ByteBuffer
                .allocateDirect(vertices.length * 4);
vertexByteBuffer.order(ByteOrder.nativeOrder());
vertexBuffer = vertexByteBuffer.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);

并绘制:

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glColor4f(0.0f, 1.0f, 0.0f, 0.5f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, vertices.length/3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

在绘制之前我设置: onDrawFrame()

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -5.0f);

onSurfaceChanged()

gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, width, height, 0, -1, 1); 
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();

【问题讨论】:

  • gluUnProject 似乎走错了路。如果你只是想直接从画布坐标系移植到 OpenGL,你知道你可以将 opengl 坐标系设置为你想要的任何东西吗?您应该能够毫无问题地在 OpenGL 中使用相同的坐标。您能否举例说明您正在使用并希望复制的画布坐标类型?
  • 好的,六边形由 6 个 x,y 坐标组成,这是左上角的十六进制坐标:"b.hexes[0][0].points[ii].x" 20.0 "b .hexes[0][0].points[ii].y" 0.0 "b.hexes[0][0].points[ii].x" 60.0 "b.hexes[0][0].points[ii ].y" 0.0 "b.hexes[0][0].points[ii].x" 80.0 "b.hexes[0][0].points[ii].y" 34.641018 "b.hexes[0] [0].points[ii].x" 60.0 "b.hexes[0][0].points[ii].y" 69.282036 "b.hexes[0][0].points[ii].x" 20.0 "b.hexes[0][0].points[ii].y" 69.282036 "b.hexes[0][0].points[ii].x" 0.0 "b.hexes[0][0].points [ii].y" 34.641018

标签: android opengl-es android-canvas coordinate-transformation


【解决方案1】:

您无需自己转换顶点坐标。您所要做的就是向 OpenGL 提供正确的投影矩阵。

基本上,这将类似于:

glViewport(0, 0, canvasWidth, canvasHeight);
glMatrixMode(GL_PROJECTION);                     // or some matrix uniform if using shaders
glLoadIdentity();
glOrtho(0, canvasWidth, canvasHeight, 0, -1, 1); // this will allow to pass vertices in 'canvas pixel' coordinates
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

根据您传递顶点的顺序,您可能希望禁用该剔除。

【讨论】:

  • 虽然我同意您的一般建议,但请注意,OP 提到了 OpenGLES 2.0,这些功能都不存在。如果他之前没有使用过不推荐使用的功能,这可能会令人困惑。
  • 我对提到 glTranslatef 的 OP 感到困惑。 OpenGL ES 2 的问题在于,没有任何标准数学库,很难给出合成代码 sn-ps。
  • 使用上面的代码,我只需要修复这一行:gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, vertices.length/3);现在它工作得很好!谢谢你们! rotoglup,我标记了你的答案。
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 2015-03-13
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多