如何只关注图表的正 Y 轴部分?
How to only focus on the positive Y-axis portion of graph?
我是 OpenGL 的新手,最近根据 Android 开发者网站上的指南成功绘制了我的第一个形状。现在我试图只关注我的 OpenGL 2D 渲染图的上半部分。所以你们都知道,屏幕中间的右边是 (0,0)。但是现在我希望原点位于屏幕底部的中间,同时保持 y 轴 0.5f 值位于屏幕中间,1f 位于屏幕顶部。本质上,负 y 轴部分不在视图中。
这些是我方块的坐标:
float squareCoords[] = {
// x , y , z
-0.5f, 0.5f , 0.0f //top left
-0.5f, 0f , 0.0f //bottom left
0.5f, 0f , 0.0f //bottom right
0.5f, 0.5f , 0.0f //top right
};
This is how I want the square to look on the screen
我试过使用相机聚焦视图,但它使渲染器中的视图变大(最大 y 值和 x 值增加,对象变小)class:
Matrix.setLookAtM(viewMatrix,0,0,0.5f,3,0f,0.5f,0f,0f,1.0f,0.0f)
和GLES20.glViewport有关系吗?我从在线研究中能想到的最好的方法是函数 ortho2d() 但似乎 Android Studio 不支持它。任何帮助 appreciated.Thanks!
经过反复试验找到了解决方案
在渲染器中 class onSurfaceChanged(GL10 unused, int width ,int height){
//编辑Matrix.frustumM方法,参数bottom的值应该设置为0
Matrix.frustumM(projectionMatrix,0,left,right,bottom,top,near,far)
}
应该帮助那些想要将原点位置也更改为任何其他位置的人,只需更改左、右、上、下值即可。
或参考这个计算器:Set origin to top-left corner of screen in OpenGL ES 2
其他可能的解决方案。
您可以使用Matrix.orthoM
Matrix.orthoM(
projectionMatrix, 0,
left, right,
bottom, top,
near, far
);
与viewMatrix
相乘,设置Matrix.setLookAtM
得到View-Projection矩阵:
Matrix.multiplyMM(
vpMatrix, 0,
projectionMatrix, 0, viewMatrix, 0
);
然后在着色器中使用 vpMatrix
void main() {
gl_Position = u_VpMatrix * a_Position;
}
...
int uVpMatrix = glGetUniformLocation(program, "u_VpMatrix");
...
glUniformMatrix4fv(uVpMatrix, 1, false, vpMatrix, 0);
我是 OpenGL 的新手,最近根据 Android 开发者网站上的指南成功绘制了我的第一个形状。现在我试图只关注我的 OpenGL 2D 渲染图的上半部分。所以你们都知道,屏幕中间的右边是 (0,0)。但是现在我希望原点位于屏幕底部的中间,同时保持 y 轴 0.5f 值位于屏幕中间,1f 位于屏幕顶部。本质上,负 y 轴部分不在视图中。
这些是我方块的坐标:
float squareCoords[] = {
// x , y , z
-0.5f, 0.5f , 0.0f //top left
-0.5f, 0f , 0.0f //bottom left
0.5f, 0f , 0.0f //bottom right
0.5f, 0.5f , 0.0f //top right
};
This is how I want the square to look on the screen
我试过使用相机聚焦视图,但它使渲染器中的视图变大(最大 y 值和 x 值增加,对象变小)class:
Matrix.setLookAtM(viewMatrix,0,0,0.5f,3,0f,0.5f,0f,0f,1.0f,0.0f)
和GLES20.glViewport有关系吗?我从在线研究中能想到的最好的方法是函数 ortho2d() 但似乎 Android Studio 不支持它。任何帮助 appreciated.Thanks!
经过反复试验找到了解决方案
在渲染器中 class onSurfaceChanged(GL10 unused, int width ,int height){ //编辑Matrix.frustumM方法,参数bottom的值应该设置为0
Matrix.frustumM(projectionMatrix,0,left,right,bottom,top,near,far)
}
应该帮助那些想要将原点位置也更改为任何其他位置的人,只需更改左、右、上、下值即可。
或参考这个计算器:Set origin to top-left corner of screen in OpenGL ES 2 其他可能的解决方案。
您可以使用Matrix.orthoM
Matrix.orthoM(
projectionMatrix, 0,
left, right,
bottom, top,
near, far
);
与viewMatrix
相乘,设置Matrix.setLookAtM
得到View-Projection矩阵:
Matrix.multiplyMM(
vpMatrix, 0,
projectionMatrix, 0, viewMatrix, 0
);
然后在着色器中使用 vpMatrix
void main() {
gl_Position = u_VpMatrix * a_Position;
}
...
int uVpMatrix = glGetUniformLocation(program, "u_VpMatrix");
...
glUniformMatrix4fv(uVpMatrix, 1, false, vpMatrix, 0);