我正在尝试使用opengles,并在屏幕上移动了一些简单的方块:
//inside my renderScreen() method, called from onDrawFrame()
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
if (gameObjects != null) {
// iterate and draw objects
for (GameObject obj : gameObjects) {
if (obj != null) {
gl.glLoadIdentity();
gl.glTranslatef(obj.posX, obj.posY, 0.0f);
obj.doDraw(gl);
}
很简单,将对象绘制到屏幕上(仍在工作)。现在我想通过基于触摸输入平移投影矩阵来拖动屏幕。我在前面的代码上面添加了这段代码(在绘制对象之前)
//change projection matrix
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glTranslatef(-cameraX, -cameraY, 0.0f); //cameraX and cameraY set in updateGame()
updateGame只是从MyPanel.getDiffX()获取那些,其中DiffX就是你的手指移动了多少:
// Inside MyPanel Class
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
startingX = event.getX();
startingY = event.getY();
MyRenderer.addObject(new GameSquare(event.getX(), v
.getHeight() - event.getY())); // Y is inverted!
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
diffX = (event.getX() - startingX) / 100;
//diffY = (event.getX() - startingY) / 1000;
Log.d("diffX" ,Float.toString(diffX));
}
return true;
}
现在,如果我使用代码翻译投影矩阵,我就不会再看到屏幕上的任何对象(只是glClear颜色)。有谁知道发生了什么?我使用的矩阵错了吗?
答案 0 :(得分:1)
将cameraX和cameraY设置为0会发生什么?通过更改投影矩阵,您确定不会覆盖之前设置的某些值吗?
除此之外,您应该通过-cameraX和-cameraY进行翻译。想一想,如果你想让你的相机处于位置(10,10),那么在(10,10)处的任何东西都应该在相机转换后位于原点,逻辑平移将是(-10,-10) 。你不是在翻译世界上的相机,而是在镜头周围翻译世界。
编辑:让我建议一种替代方法,它不会改变投影矩阵。
//inside my renderScreen() method, called from onDrawFrame()
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glTranslate(-cameraX, -cameraY, 0); //Apply the camera here
if (gameObjects != null){
// iterate and draw objects
for (GameObject obj : gameObjects) {
if (obj != null) {
gl.glPushMatrix(); //Note this line here, we 'push' a matrix onto the top
gl.glTranslatef(obj.posX, obj.posY, 0.0f);
obj.doDraw(gl);
gl.glPopMatrix(); //Here we remove our modified matrix to get the original one
}
}
答案 1 :(得分:0)
我总是知道你应该使用投影矩阵作为透视,而不是相机(比较OpenGL FAQ)。所以我会用[{3}}设置投影(透视)一次,不再改变它。在您的绘图程序中,您可以在每次抽奖前设置相机(翻译),或使用GLU和glPushMatrix来保护并恢复相机。