android 使用OPENGL ES实现地月模型(3D)-纹理映射基础

该博客展示了如何使用OpenGL ES在Android上创建地月3D模型,包括设置主动渲染场景、绘制地球和月球、控制它们的旋转以及应用纹理贴图。详细讲解了Dad.java中的构造器和changing方法,以及moonCH.java和Celestial.java的相关实现。
摘要由CSDN通过智能技术生成

效果图:。。。。。。。。。



编写Dad.java 在构造器中设置场景渲染器为主动渲染,并声明地球与月球的引用

*在绘制changing方法中绘制地球、月球、浩瀚星空
*通过线程控制地球、月亮的转动
*创建纹理贴图


package com.scout.eeeeeee;

/**
 * Created by liuguodong on 2017/10/28.
 */


import java.io.IOException;
import java.io.InputStream;

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




import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLSurfaceView;
import android.opengl.GLUtils;
import android.view.MotionEvent;

public class dad extends GLSurfaceView{

    private final float TOUCH_SCALE_FACTOR = 180.0f/320;//角度缩放比例
    private SceneRenderer mRenderer;//场景渲染器
    private float mPreviousY;//上次的触控位置Y坐标
    private float mPreviousX;//上次的触控位置Y坐标

    public int earthTextureId;//纹理名称ID
    public int moonTextureId;//纹理名称ID

    public dad(Context context) {
        super(context);
        mRenderer = new SceneRenderer();   //创建场景渲染器
        setRenderer(mRenderer);             //设置渲染器
        setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式为主动渲染
    }

    //触摸事件回调方法
    @Override public boolean onTouchEvent(MotionEvent e) {
        float y = e.getY();
        float x = e.getX();
        switch (e.getAction()) {
            case MotionEvent.ACTION_MOVE:
                float dy = y - mPreviousY;//计算触控笔Y位移
                float dx = x - mPreviousX;//计算触控笔Y位移
                mRenderer.earth.mAngleX += dy * TOUCH_SCALE_FACTOR;//设置沿x轴旋转角度
                mRenderer.earth.mAngleZ += dx * TOUCH_SCALE_FACTOR;//设置沿z轴旋转角度
                requestRender();//重绘画面
        }
        mPreviousY = y;//记录触控笔位置
        mPreviousX = x;//记录触控笔位置
        return true;
    }

    private class SceneRenderer implements GLSurfaceView.Renderer
    {
        Ball earth;
        Ball moon;
        Celestial celestialSmall;//小星星星空半球
        Celestial celestialBig;//大星星星空半球

        public void onDrawFrame(GL10 gl) {
            //清除颜色缓存
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
            //设置当前矩阵为模式矩阵
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            //设置当前矩阵为单位矩阵
            gl.glLoadIdentity();

            gl.glTranslatef(0, 0f, -3.6f);

            gl.glEnable(GL10.GL_LIGHTING);//允许光照
            gl.glPushMatrix();//保护变换矩阵现场
            gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 3.5f);
            earth.drawSelf(gl);//绘制地球
            gl.glTranslatef(0, 0f, 1.5f);
            gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 1.0f);
            moon.drawSelf(gl);//绘制月球
            gl.glPopMatrix();//恢复变换矩阵现场
            gl.glDisable(GL10.GL_LIGHTING);//不允许光照

            //绘制星空
            gl.glPushMatrix();//保护变换矩阵现场
            gl.glTranslatef(0, -8.0f, 0.0f);
            celestialSmall.drawSelf(gl);
            celestialBig.drawSelf(gl);
            gl.glPopMatrix();//恢复变换矩阵现场

        }

        public void onSurfaceChanged(GL10 gl, int width, int height) {
            //设置视窗大小及位置
            gl.glViewport(0, 0, width, height);
            //设置当前矩阵为投影矩阵
            gl.glMatrixMode(GL10.GL_PROJECTION);
            //设置当前矩阵为单位矩阵
            gl.glLoadIdentity();
            //计算透视投影的比例
            float ratio = (float) width / height;
            //调用此方法计算产生透视投影矩阵
            gl.glFrustumf(-ratio*0.5f, ratio*0.5f, -0.5f, 0.5f, 1, 100);
        }

        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            //关闭抗抖动
            gl.glDisable(GL10.GL_DITHER);
            //设置特定Hint项目的模式,这里为设置为使用快速模式
            gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
            //设置屏幕背景色黑色RGBA
            gl.glClearColor(0,0,0,0);
            //设置着色模型为平滑着色
            gl.glShadeModel(GL10.GL_SMOOTH);
            //启用深度测试
            gl.glEnable(GL10.GL_DEPTH_TEST);
            //设置为打开背面剪裁
            gl.glEnable(GL10.GL_CULL_FACE);

            gl.glEnable(GL10.GL_LIGHTING);//允许光照
            initSunLight(gl);//初始化太阳光源
            initMaterial(gl);//初始化材质

            //初始化纹理
            earthTextureId=initTexture(gl,R.drawable.di);
            moonTextureId=initTexture(gl,R.drawable.yue);

            earth=new Ball(6,earthTextureId);
            moon=new Ball(2,moonTextureId);

            //创建星空
            <
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值