0 0

android opengl 点击正方形的一个面给出相应事件0

用OpenGL做的可旋转的正方形,有6个面,现在想做点击其中一个面,让我知道点的是谁,如何做呢?
public class MyRender implements Renderer {
	public static float step = 15;
    boolean key;
    boolean light = true;
    
    public static float xrot, yrot;    //x,y轴旋转
    public static float xspeed, yspeed;//旋转的速度
    private int one = 0x10000;
    private int[] textures = new int[1];
    /**
     * @param context
     *            顶点及纹理
     */
    // verticesBuffer
    private IntBuffer verticesBuffer;
    // texcoordBuffer
    private IntBuffer texcoordBuffer;
    // 顶点数组vertices
    private int[] vertices;
    // 纹理数组texcoord
    private int[] texcoord;

    // 构造方法
    public MyRender() {
        // 在构造方法中初始化
        initData();
        initBuffer();
    }

    // 初始化各类值
    public void initData() {
        vertices = new int[] { -one, -one, one, one, -one, one, -one, one, one,
                one, one, one, one, -one, one, one, -one, -one, one, one, one,
                one, one, -one, one, -one, -one, -one, -one, -one, one, one,
                -one, -one, one, -one, -one, -one, -one, -one, -one, one, -one,
                one, -one, -one, one, one, -one, one, -one, one, one, -one,
                -one, one, one, one, one, one, -one, -one, -one, -one, -one,
                one, one, -one, -one, one, -one, one };

        texcoord = new int[] { 0, 0, one, 0, 0, one, one, one };
    }

    public void initBuffer() {
        // verticesbyteBuffer
        ByteBuffer verticesbyteBuffer = ByteBuffer
                .allocateDirect(vertices.length * 4);
        verticesbyteBuffer.order(ByteOrder.nativeOrder());
        verticesBuffer = verticesbyteBuffer.asIntBuffer();
        verticesBuffer.put(vertices);
        verticesBuffer.position(0);

        // texcoordBuffer
        ByteBuffer texcoordbyteBuffer = ByteBuffer
                .allocateDirect(texcoord.length * 4 * 6);
        texcoordbyteBuffer.order(ByteOrder.nativeOrder());
        texcoordBuffer = texcoordbyteBuffer.asIntBuffer();
        for (int i = 0; i < 6; i++) {
            texcoordBuffer.put(texcoord);
        }
        texcoordBuffer.position(0);
    }

    @Override
    public void onDrawFrame(GL10 gl) {

        // 清除深度缓存和颜色
        gl.glClear(GL10.GL_DEPTH_BUFFER_BIT | GL10.GL_COLOR_BUFFER_BIT);
        // 重置观察模型
        gl.glLoadIdentity();
        // 启用vertex及texcoord
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

        // 向左移动1.5f并向里移动6.0f
        gl.glTranslatef(0.0f, 0.0f, -6.0f);
        
        //设置旋转
        gl.glRotatef(MainActivity5.anglex, 0, 1, 0);
        gl.glRotatef(MainActivity5.angley, 1, 0, 0);
        
        // 指定顶点映射
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, verticesBuffer);
        // 指定纹理映射(每次都写错,烦)
        gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, texcoordBuffer);

        for (int i = 0; i < 6; i++) {
        	switch(i){
	        	case 0:
	        		GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, BitGL.bitmapA, 0);
	        		break;
	        	case 1:
	        		GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, BitGL.bitmapB, 0);
	        		break;
	        	case 2:
	        		GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, BitGL.bitmapC, 0);
	        		break;
	        	case 3:
	        		GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, BitGL.bitmapD, 0);
	        		break;
	        	case 4:
	        		GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, BitGL.bitmapE, 0);
	        		break;
	        	case 5:
	        		GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, BitGL.bitmapF, 0);
	        		break;
        	}
        	gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 4, 4);
        }

        // 取消顶点及纹理映射
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        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, 10);
        // 设置观察模型
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // 告诉系统对透视进行修正
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        // 设置背景色为绿色
        gl.glClearColor(0, 1, 0, 0);
        // 启用阴影平滑
        gl.glShadeModel(GL10.GL_SMOOTH);

        // 设置深度缓存
        gl.glClearDepthf(one);
        // 启用深度测试
        gl.glEnable(GL10.GL_DEPTH_TEST);
        // 所做深度测试的类型
        gl.glDepthFunc(GL10.GL_LEQUAL);

        // 启用纹理
        gl.glEnable(GL10.GL_TEXTURE_2D); // 不启用没有效果的
        // 创建纹理
        gl.glGenTextures(1, textures, 0);
        // 绑定纹理
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
        // 生成纹理
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, BitGL.bitmapA, 0);
        
        // 线性滤波  
        gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR);  
        gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);
    }
}


public class MainActivity5  extends Activity implements OnGestureListener {
	// 定义旋转角度  
    public static float anglex = 0f;  
    public static float angley = 0f;  
    static final float ROTATE_FACTOR = 60;  
    // 定义手势检测器实例  
    GestureDetector detector;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        // 载入图片
        BitGL.init(this.getResources());
        // 创建一个GLSurfaceView,用于显示OpenGL绘制的图形  
        GLSurfaceView glView = new GLSurfaceView(this);  
        // 创建GLSurfaceView的内容绘制器  
        MyRender myRender = new MyRender();  
        // 为GLSurfaceView设置绘制器  
        glView.setRenderer(myRender);  
        setContentView(glView);  
        // 创建手势检测器  
        detector = new GestureDetector(this);  
    }  
    @Override  
    public boolean onTouchEvent(MotionEvent me)  
    {  
        // 将该Activity上的触碰事件交给GestureDetector处理  
    	anglex = me.getX();
    	angley = me.getY();
    	return true;
    }  
  
    @Override  
    public boolean onFling(MotionEvent event1, MotionEvent event2,  
        float velocityX, float velocityY)  
    {  
        return true;  
    }  
  
    @Override  
    public boolean onDown(MotionEvent arg0)  
    {  
        return false;  
    }  
  
    @Override  
    public void onLongPress(MotionEvent event)  
    {  
    }  
  
    @Override  
    public boolean onScroll(MotionEvent event1, MotionEvent event2,  
        float distanceX, float distanceY)  
    {  
        return false;  
    }  
  
    @Override  
    public void onShowPress(MotionEvent event)  
    {  
    }  
  
    @Override  
    public boolean onSingleTapUp(MotionEvent event)  
    {  
        return false;  
    }
}
2014年10月15日 15:22
目前还没有答案

相关推荐

    android openGL ES 2.0画等边三角形,正方形

    android openGL ES 2.0画等边三角形,正方形

    安卓ndk实现opengl绘制正方形纹理

    在Android开发中,Native Development Kit (NDK) 是一个允许开发者使用C和C++编写代码的工具集,它能够提供更高的性能和更低级的硬件访问权限。本话题将深入探讨如何利用NDK和OpenGL ES在Android平台上实现正方形...

    android OpenGL 3D骰子

    在Android平台上,OpenGL ES(OpenGL for Embedded Systems)被广泛使用,它是OpenGL的一个精简版,专门针对移动设备和嵌入式系统设计。在这个"android OpenGL 3D骰子"项目中,我们将探讨如何利用OpenGL ES在Android...

    android OpenGL绘制立体图形

    android OpenGL技术绘制一个旋转的3d立方体

    opengl 正方形和三角形

    在`lesson02`这个文件夹中,可能包含了一个简单的示例程序,演示了如何在OpenGL环境中绘制正方形和三角形。这个程序可能包括了初始化OpenGL上下文、设置视口和投影、定义顶点数据、绘制图形以及处理窗口事件的代码。...

    Android点击屏幕坐标对应OpenGL ES坐标

    本文将深入探讨如何将Android屏幕坐标转换为OpenGL ES坐标,并在点击屏幕特定位置时生成一个绘制的三角形。 首先,了解屏幕坐标系统和OpenGL ES坐标系统的差异至关重要。Android屏幕坐标系统以左上角为原点,X轴向...

    Android OpenGL的一个简单的例子.zip

    这个"Android OpenGL的一个简单的例子.zip"文件包含了一个基本的Android OpenGL应用实例,帮助开发者了解如何在Android设备上使用OpenGL ES。 首先,我们需要了解OpenGL ES的基本概念。OpenGL ES是OpenGL的精简版,...

    【OpenGL ES】绘制正方形

    本篇文章将深入探讨如何使用OpenGL ES 绘制一个基本的正方形。 首先,我们需要理解OpenGL ES的工作原理。它是一个状态机,通过设置各种状态(如颜色、纹理、深度测试等)来控制渲染过程。然后,我们通过调用`...

    Android OpenGL 游戏引擎

    一个基于OpenGL的Android游戏引擎通常包含以下几个核心组件: 1. **场景管理器**:负责组织游戏中的不同场景,如主菜单、游戏关卡等。 2. **时间管理**:处理游戏的帧率控制和定时事件。 3. **资源管理**:加载和...

    Android OpenGl ES绘制圆点与优化圆点锯齿

    为了在屏幕上绘制一个圆点,我们可以将其视为一个正方形,其边长等于我们希望圆点的直径。例如,如果我们想要一个10像素直径的圆点,我们可以创建一个10x10的方形,然后在中心位置绘制它。 但是,由于屏幕像素的...

    Android OpenGL ES 绘制立方体 球体 圆柱 等几何形状

    Android OpenGL ES 提供了一个接口,让开发者能够利用硬件加速的图形处理能力,来绘制出立方体、球体、圆柱等几何形状。在这个场景中,我们看到描述中提到了几个关键的元素:几何形状类和renderer类。 1. **几何...

    android OPenGL基础范例一

    在“android OpenGL基础范例一”中,我们看到的是一个入门级别的示例,主要目标是展示如何使用OpenGL ES来创建和显示基本的几何图形,以及如何将文本与图形结合起来。这个例子中,开发者通常会通过以下步骤来实现: ...

    Android OpenGL ES 简明开发教程

    对于初次接触OpenGL ES的Android开发者,构建一个简单的OpenGL ES应用通常遵循以下步骤: 1. **创建GLSurfaceView实例**:在布局XML文件中定义或通过代码动态创建`GLSurfaceView`。 2. **设置Renderer**:通过`...

    opengl旋转正方形

    opengl 旋转 正方形 很不错的

    Android OpenGL入门示例:绘制三角形和正方形

    首先,要使用OpenGL ES,你需要在Android项目中添加相应的依赖。通常,这可以通过在build.gradle文件中引入`implementation 'androidx.opengles:opengl-es-utils:1.0.0'`来完成。确保你的项目支持JNI(Java Native ...

    Android OpenGL的入门资料PDF

    OpenGL(Open Graphics Library)是一个跨语言、跨平台的应用程序编程接口(API),用于渲染2D和3D矢量图形。它是由众多显卡厂商在1992年开发的一个标准,用于软件访问硬件加速的图形管线。OpenGL的API和开发流程是...

    Android OpenGL ES 2.0学习书籍.rar

    在Android上使用OpenGL ES 2.0,首先需要理解Android SDK中的GLSurfaceView类,它是为OpenGL ES渲染提供一个专用的SurfaceView,确保渲染在独立的线程中进行,避免阻塞UI主线程。开发者还需要创建一个GLSurfaceView....

    android opengl 贝塞尔曲线

    一个在android opengl 上实现的 贝塞尔曲线

    android opengl原理分析

    在Android平台上,OpenGL ES(OpenGL for Embedded Systems)被广泛使用,这是OpenGL的一个子集,专门针对移动设备等嵌入式系统优化。 #### Android与OpenGL的关系 Android系统为开发者提供了一个OpenGL ES的API库...

    androidOpenGL实现3d动画

    这是用androidOpenGL 实现的3D 动画 导入工程即可运行。

Global site tag (gtag.js) - Google Analytics