Android 3D图形的手势旋转(未完成,求大神指点)

代码如下:

package com.example.d;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;

public class Activity3D extends Activity implements OnGestureListener{

	private float anglex = 0f;
	private float angley = 0f;
	static final float ROTATE_FACTOR = 60;
	GestureDetector detector;
	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		GLSurfaceView glView = new GLSurfaceView(this);
		MyRenderer myRender = new MyRenderer(this);
		glView.setRenderer(myRender);
		setContentView(glView);
		detector = new GestureDetector(this);
	}
	
	public boolean onTouchEvent(MotionEvent me)
	{
		return detector.onTouchEvent(me);
	}
	
	@Override
	public boolean onDown(MotionEvent arg0) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX,
			float velocityY) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void onLongPress(MotionEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean onScroll(MotionEvent event1, MotionEvent event2, float velocityX,
			float velocityY) {
		// TODO Auto-generated method stub
		angley += velocityX * ROTATE_FACTOR /360;
		anglex += velocityY * ROTATE_FACTOR /360;
		return true;
	}

	@Override
	public void onShowPress(MotionEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean onSingleTapUp(MotionEvent arg0) {
		// TODO Auto-generated method stub
		return false;
	}
	
	public class MyRenderer implements Renderer
	{

		private float[] cubeVertices = {
				0.5f, 0.5f, 0.5f,
				0.5f, -0.5f, 0.5f,
				-0.5f, -0.5f, 0.5f,
				-0.5f, 0.5f, 0.5f,
				
				0.5f, 0.5f, -0.5f,
				0.5f,-0.5f, -0.5f,
				-0.5f, -0.5f, -0.5f,
				-0.5f, 0.5f, -0.5f
				
		};
		
		private byte[] cubeFacets = new byte[]{
				0,1,2,
				0,2,3,
				2,3,7,
				2,6,7,
				0,3,7,
				0,4,7,
				4,5,6,
				4,6,7,
				0,1,4,
				1,4,5,
				1,2,6,
				1,5,6
			};
		int[] taperColors = new int[]{
				65535, 0, 0, 0,
				0, 65535, 0, 0,
				0, 0, 65535, 0,
				65535, 65535, 0, 0
			};
		private FloatBuffer cubeVerticesBuffer;
		private ByteBuffer cubeFacetsBuffer;
		private IntBuffer taperColorsBuffer;
		
		public MyRenderer(Context main)
		{
			cubeVerticesBuffer = floatBufferUtil(cubeVertices);
			cubeFacetsBuffer = ByteBuffer.wrap(cubeFacets);
			taperColorsBuffer = intBufferUtil(taperColors);
		}
		private FloatBuffer floatBufferUtil(float[] arr)
		{
			FloatBuffer mBuffer;
			//初始化ByteBuffer,长度为arr数组的长度*4,因为一个int占4个字节
			ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);
			//数组排列用nativeOrder
			qbb.order(ByteOrder.nativeOrder());
			mBuffer = qbb.asFloatBuffer();
			mBuffer.put(arr);
			mBuffer.position(0);
			return mBuffer;
		}
		private IntBuffer intBufferUtil(int[] arr)
		{
			IntBuffer mBuffer;
			//初始化ByteBuffer,长度为arr数组的长度*4,因为一个int占4个字节
			ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);
			//数组排列用nativeOrder
			qbb.order(ByteOrder.nativeOrder());
			mBuffer = qbb.asIntBuffer();
			mBuffer.put(arr);
			mBuffer.position(0);
			return mBuffer;
		}

		@Override
		public void onSurfaceCreated(GL10 gl, EGLConfig config) {
			// TODO Auto-generated method stub
			// 关闭抗抖动
			gl.glDisable(GL10.GL_DITHER);	//可提高性能
			//设置系统对透视进行修正
			gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
			gl.glClearColor(0, 0, 0, 0);	//ClearColor(float red, float green, float blue, float alpha)
			//设置阴影平滑模式
			gl.glShadeModel(GL10.GL_SMOOTH);
			//启用深度测试
			/*
			 * 让OpenGL ES负责跟踪每个物体在Z轴上的深度,
			 * 这样就可以避免后面的无图遮挡前面的物体 
			*/
			gl.glEnable(GL10.GL_DEPTH_TEST);
			//设置深度测试的类型
			gl.glDepthFunc(GL10.GL_LEQUAL);
		}
		
		/*
		 * 初始化3D场景
		 */
		@Override
		public void onSurfaceChanged(GL10 gl, int width, int height) {
			// TODO Auto-generated method stub
			//设置3D视窗的大小及位置(前两参数为视窗位置,后两参数为视窗宽、高)
			gl.glViewport(0, 0, width, height);
			//将当前矩阵模式设为投影矩阵
			gl.glMatrixMode(GL10.GL_PROJECTION);
			//初始化单位矩阵
			gl.glLoadIdentity();
			//计算透视窗的宽度、高度比
			float ratio = (float) width / height;
			//调用此方法设置透视窗的空间大小
			/*
			 * 前两个参数用于设置X轴上的最小和最大坐标值,
			 * 中间两个参数用于设置Y轴上的最小和最大坐标值,
			 * 最后两个参数用于设置Z轴上所能绘制的场景的深
			 * 度的最小和最大值。
			*/
			gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
		}
		
		@Override
		public void onDrawFrame(GL10 gl) {
			// TODO Auto-generated method stub
			//清除屏幕缓存和深度缓存
			gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
			//启用顶点坐标数据
			gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
			gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
			//设置当前矩阵堆栈为模型堆栈
			gl.glMatrixMode(GL10.GL_MODELVIEW);
			
			gl.glLoadIdentity();
			
			gl.glTranslatef(0f, 0.0f, -2.0f);
			/*
			 * 旋转需要判断的哪一面在正面 在调整旋转的方向
			 * 本文未判断
			 */
			gl.glRotatef(angley, 0, -1, 0);
			gl.glRotatef(anglex, 1, 0, 0);
			gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeVerticesBuffer);
			gl.glColorPointer(4, GL10.GL_FIXED, 0, taperColorsBuffer);
			gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, cubeFacetsBuffer.remaining(), GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer);
			gl.glFinish();
			gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
		}
		
	}

}

图形旋转的方向未经过面的判断,上下旋转可能与自己想的不一样,有大神能指点下吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值