gpt4 book ai didi

Android 捏/缩放和 glfrustum

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:48:48 25 4
gpt4 key购买 nike

我使用 OpenGL 绘制了几个二维形状现在我想添加捏/缩放。我的观点是透视图(顶 View )。我假设它是 3D,z 轴 = 0。

现在,我应该如何更改 glfrustum 并在我的 Activity 中添加触摸方法,以便我能够捏合/缩放?

gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25);

我觉得应该是这样的

gl.glFrustumf(-ratio, ratio, -1, 1, 1*zoom, 25*zoom);

但是touch方法应该怎么写来改变这个缩放参数来做双指缩放呢?

现在的问题是渲染器,我在末尾添加了缩放方法,但是在缩放方法中它给我错误 gl.glfrustum 而在 onsurfacechanged 上它没有给我同样的错误!我该如何解决?

public class GLrenderer implements Renderer {
public GLqueue tri;
public GLrenderer() {
tri = new GLqueue();


}


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);
}


public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
gl.glDisable(GL10.GL_DITHER);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_COLOR_BUFFER_BIT);

gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0, 0, -5, 0, 0, 0, 0, 2, 0);

//gl.glRotatef(1, 1, 0, 0);
// gl.glRotatef(10, 0, 0, 1);
tri.draw(gl);

}

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);
}

public static void zoom(float d2) {
// TODO Auto-generated method stub
int zoom = (int) (zoom*d2);

gl.glFrustumf(-ratio, ratio, -1, 1, 1*zoom, 25*zoom);

}

}

最佳答案

如果你有一些决定缩放的浮点值,你可以使用这个:

glFrustum(left*zoom, right*zoom, bottom*zoom, top*zoom, near, far);

这是一个例子:

摘自 OnTouchListener

public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
pointers = 1;
return true;
case MotionEvent.ACTION_POINTER_2_DOWN:
pointers = 2;
distance = fingerDist(event);
return true;
case MotionEvent.ACTION_MOVE:
if( pointers == 2 ){
float newDist = fingerDist(event);
float d = distance/newDist;
renderer.zoom(d);
distance = newDist;
}
return true;
default:
return false;
}

}

protected final float fingerDist(MotionEvent event){
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}

来自渲染器:

public final void zoom(float mult){
zoom *= mult;
Matrix.frustumM(
pMatrix, 0,
zoom*left, zoom*right, zoom*bottom, zoom*top,
near, far);
}

请注意,此代码是为 gles 2.0 而不是 1.0 编写的,因此不是调用 Matrix.frustumM(),而是调用 gl.glFrustumf()。您可能必须将此操作发布到您的 gl 线程才能正常工作。

关于Android 捏/缩放和 glfrustum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10449749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com