- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 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/
我正在做一个带有相册的页面 View Controller ,由于我一直无法找到一种方法来在不更改图片的情况下平移缩放的图像,所以我希望图像在用户停止捏。 这是我的代码: @objc func p
我使用 OpenGL 绘制了几个二维形状现在我想添加捏/缩放。我的观点是透视图(顶 View )。我假设它是 3D,z 轴 = 0。 现在,我应该如何更改 glfrustum 并在我的 Activit
我可以像这样使用缩放功能: - (void)twoFingerPinch:(UIPinchGestureRecognizer *)recognizer { if([recognizer sta
如果您在跟踪设备位置的同时在 Apple 的 map 应用程序中缩放以放大/缩小,则捏合手势的“平移”组件将被忽略,蓝色位置指示器将固定在屏幕中央。使用普通 MKMapView 时情况并非如此。 假设
在过去的几个小时里,这个问题一直让我发疯。所以我有一个非常简单的 UIScrollView 设置: -UIScrollView -UIImageView 就是这样。 scrollview 和
1.UITapGestureRecognizer 点击/双击手势 复制代码 代码如下: var tapGesture = UITapGestureRecognizer(target:
我是一名优秀的程序员,十分优秀!