如何确定我的OpenGL ES程序中屏幕上显示的x和y坐标平面的边界?
我需要在屏幕上填充6个相同的形状,宽度和宽度都相等。高度,但为了做到这一点,我必须确定x和y坐标范围的值(所以我可以正确设置形状的顶点)。换句话说,我需要一种编程方式来找出-x和x,以及-y和y的值。
最简单的方法是什么?我应该操纵/读取投影矩阵还是模型视图矩阵?既不?
我知道onSurfaceChanged()可以访问布局的高度和宽度,但我不确定这些参数是否是查找屏幕坐标边界的必要条件。
下面是代码片段,展示了我如何使用modelView和投影矩阵配置平截头体:
public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
{
// Enable depth testing
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
// Position the eye in front of the origin.
final float eyeX = 0.0f;
final float eyeY = 0.0f;
final float eyeZ = -0.5f;
// We are looking toward the distance
final float lookX = 0.0f;
final float lookY = 0.0f;
final float lookZ = -5.0f;
// Set our up vector. This is where our head would be pointing were we holding the camera.
final float upX = 0.0f;
final float upY = 1.0f;
final float upZ = 0.0f;
// Set the view matrix. This matrix can be said to represent the camera position.
Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
...
}
public void onSurfaceChanged(GL10 glUnused, int width, int height)
{
// Set the OpenGL viewport to the same size as the surface.
GLES20.glViewport(0, 0, width, height);
layoutWidth = width; //test: string graphics
layoutHeight = height; //test: string graphics
// Create a new perspective projection matrix. The height will stay the same
// while the width will vary as per aspect ratio.
final float ratio = (float) width / height;
final float left = -ratio;
final float right = ratio;
final float bottom = -1.0f;
final float top = 1.0f;
final float near = 1.0f;
final float far = 10.0f;
screenSixth = findScreenSixths(width);
Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
}
答案 0 :(得分:1)
你的这个问题似乎有点奇怪。我可以理解你想要操纵矩阵,这样你就可以看到屏幕上的所有物体,但你要问的是如何放置球体使它们在屏幕上。在这种情况下,球体的屏幕投影不会改变,并且没有理由使用与场景其余部分相同的矩阵。您可以简单地从身份开始并添加平截头体以获得正确的投影。之后,边框值(left
,right
...)将位于屏幕的边框,Z
值为near
。因此,将球体置于(left+radius, top+radius, near)
。
如果由于与其他物体的某些交互仍然需要球体的某个特定位置,那么您很可能需要检查球体的广告牌边界方格的屏幕投影。这意味着创建一个正方形,其中心与球体相同,宽度为半径的两倍。然后将这些方形位置与球体矩阵的广告牌版本相乘。可以通过网络找到广告牌,但是除非你对矩阵做一些奇怪的操作,否则它通常只需将矩阵的左上角3x3部分设置为标识即可。