Android 在OpenGL ES中放大/缩小
我想学习如何执行放大和缩小。这是一个旋转的二维三角形的简单示例。您能告诉我如何在这个简单的示例中添加放大和缩小功能吗 我应该使用Android 在OpenGL ES中放大/缩小,android,opengl-es,zooming,Android,Opengl Es,Zooming,我想学习如何执行放大和缩小。这是一个旋转的二维三角形的简单示例。您能告诉我如何在这个简单的示例中添加放大和缩小功能吗 我应该使用gl.glScalef?怎么做 public class GLrenderer implements Renderer { public GLqueue tri; private float angle = 0; public GLrenderer() { tri = new GLqueue(); } @Ove
gl.glScalef
?怎么做
public class GLrenderer implements Renderer {
public GLqueue tri;
private float angle = 0;
public GLrenderer() {
tri = new GLqueue();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) {
// TODO Auto-generated method stub
gl.glDisable(GL10.GL_DITHER);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glClearColor(.0f, .0f, .0f, 0f);
gl.glClearDepthf(1f);
}
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0, 0, -10);
gl.glPushMatrix();
gl.glRotatef(angle, 0, 0, 1);
tri.draw(gl);
gl.glPopMatrix();
angle++;
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
gl.glViewport(0, 0, width, height);
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25);
}
}
这是我的活动类,onTouch
事件被添加到该类中。我应该添加什么,以便在触摸屏幕时变焦工作
GLSurfaceView OurSurface;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
OurSurface = new GLSurfaceView(this);
OurSurface.setRenderer(new GLrenderer());
setContentView(OurSurface);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case (MotionEvent.ACTION_DOWN): // Touch screen pressed
break;
case (MotionEvent.ACTION_UP): // Touch screen touch ended
break;
case (MotionEvent.ACTION_MOVE): // Contact has moved across screen
break;
case (MotionEvent.ACTION_CANCEL): // Touch event cancelled
break;
}
return super.onTouchEvent(event);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
OurSurface.onPause();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
OurSurface.onResume();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}
您可以通过
glScalef
缩放模型或移动相机。由于缩放会影响所有绘制的对象,因此移动摄影机可能是更好的方法。插入
gl.glTranslatef(0,0, 5.0f * Math.sin(Math.PI * ((angle % 360.0f)/180.0f)));
在调用onDrawFrame
中的glLoadIdentity
之后。这应该——没有运行代码——导致对象前后正弦移动
考虑将
angle
的值限制为[0.0f;360.0f]
从技术上讲,实现相机缩放的正确方法是修改透视投影的参数:
float zoom = 1.5;
// ....
gl.glFrustumf(-ratio/zoom, ratio/zoom, -1/zoom, 1/zoom, 1, 25);
或
或
取决于哪一个更适合您的应用程序
如果您希望缩放更改mid应用程序,则还必须移动以下行:
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, zoom, 25);
您可以在活动类的onTouch()方法中计算缩放值,并在中使用它 onDrawFrame()中的glTranslatef()方法 gl.glTranslatef(0,0,-缩放); 就在glLoadIdentity()之后 它会起作用的。。。
如果你卡住了,请告诉我…谢谢,我运行了,但我想用手指执行缩放,而不是像这样。我想稍后在我的应用程序中使用它,它有许多对象,用户应该能够缩放并转到他想要的任何对象。阅读茶叶不是我课程的一部分;)GLSURFACHEVIEW是您需要查看的。请接受我的回答并结束这个问题。那么onTouch方法呢?我应该使用它,以便能够用手指缩放。让您的onTouch方法更改缩放变量,并且在下一次绘图时可以看到更改。我如何更改缩放变量?
gl.glFrustumf(-ratio, ratio, -1, 1, zoom, 25*zoom);
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, zoom, 25);