android - 将 Canvas 坐标系转换为 OpenGLES 2.0 坐标

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

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

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

因为该算法适用于 Canvas ,所以我尝试使用 GLU.gluUnProject 将这些“ Canvas ”六边形坐标转换为 OpenGL 坐标系。

“循环”

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 设置为与 Canvas “相同”的 2D 世界。

所以我的问题是:

如何将我的第一个六边形(在 Canvas 上,第一个在左上角)这三个东西设置为在 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();

最佳答案

您无需自行变换顶点坐标。您所要做的就是向 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();

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

关于android - 将 Canvas 坐标系转换为 OpenGLES 2.0 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10889618/

相关文章:

android - 使用 Picasso 和自定义 Transform 对象加载大图像

android - 如何使用 Canvas 制作位图可点击?

android - 如何获取当前 Canvas ?

android - layout_anchor 和 layout_anchorGravity 没有按预期工作

安卓 L : LinkageError crashes application

android - 如何获得正确的幻灯片以在android中单击按钮

java - 使用 Android 操作栏上的按钮调用方法

iphone - 1帧内使用opengl es在ipad上最多可以绘制多少个三角形?

iphone - iPhone 上的 OpenGLES 新手指南

ios - 为什么这个 OpenGL ES 2.0 着色器不能与我在 iOS 上的 VBO 一起使用?