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

2023-11-14

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


编写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);

            //创建星空
            <
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 使用react-pdf预览pdf

    在使用umi构建的react项目中如何实现预览pdf 如果PDF中包含印章该如何使印章展示出来 1 安装依赖 yarn add react pdf react pdf https github com wojtekmaj react pdf
  • Mapped Statements collection does not contain value for

    Caused by java lang IllegalArgumentException Mapped Statements collection does not contain value for com wt mss dao daoi
  • React+Ant.Design 从零开始搭建个人博客实战教程01 —— 起步

    简介 刚入手一个服务器 打算搭个个站 平时工作都是用vue 为了扩展自己的实战能力 来从头开始实战用用react吧 结合ant design一起开发 然后后台nodejs来写 编写我的第一个教程文章 从头到尾记录整个过程 因为是实战项目 部
  • ad中封装绿色解决办法

    1是在工具 检查规则中 把一些项取消检查
  • 推荐一个将MD格式的文档轻松转换到微信公众号的工具

    因为微信公众号自带的编辑器不是特别友好 这也是一个痛点 之前也有使用过google插件 但不是特别灵活 现在推荐的这款工具可以很好的支持将MD格式的文档直接进行渲染 还是非常好用的 话不多说 先给出工具地址 https md openwri
  • 花生壳 Linux arm

    安装和使用Linux花生壳服务 一 安装说明 以CentOS 5为例 1 安装必要的开发包 root localhost yum install gcc gcc c autoconf automake 2 下载phddns 2 0 2 16
  • MongoDB图形化工具下载和使用

    文章目录 MongoDB图形化工具 1 下载地址 2 打开MongoDB服务 3 Compass界面 3 1 连接Mongo 3 2 创建数据库 3 3 创建集合 3 4 删除集合 3 5 增 3 6 改 3 7 删 3 8 查 3 9 导
  • TRPO算法详解

    答主最近学到TRPO 这算法确实很难理解 现在记录答主现在的一点想法 留存记录 先放参考文献 方便大家学习 Reference 1 Sutton R S Barto A G Reinforcement learning An introdu
  • 数组指针数组的定义及使用(about array of pointer of array)

    数组指针数组 array pointer array 该怎么定义和使用呢 如下 定义 define MsgCnt 3 define MsgLen 8 typedef char MsgArray MsgCnt MsgLen typedef c
  • J2EE之XML建模

    目录 一 什么叫XML建模 二 XML建模 1 根据XML配置文件元素节点创建元素节点实体类 2 利用dom4j xpath技术实现XML建模 一 什么叫XML建模 将XML配置文件中的元素 属性 文本信息转换成对象的过程叫做XML建模 二
  • 实验四,静态成员与友元

    一 实验目的和要求 了解成员函数的特性 掌握静态成员 友元等概念 二 实验内容 1 调试下列程序 写出输出结果 并分析输出结果 sy4 1 cpp include
  • python 大乐透号码生成器

    选号规则 前区1 35的范围随机产生不重复的5个号码 后区在1 12范围内随机生成2个不重复的2个号码 如下 from random import sample def number front sample str i for i in
  • 一、PWM 输出控制电机

    PWM 输出控制电机 电机系列 一 PWM 输出控制电机 1 相关 IO 介绍 2 编写 PWM 输出库函数 PWM h PWM c 3 控制函数 control h control c 4 main函数 电机系列 一 PWM 输出控制电机
  • 关闭jvm的方式

    1 System exit status 不管status为何值都会退出程序 System exit 0 是正常退出程序 而System exit 1 或者说非0表示非正常退出程序 2 System exit 0 和dispose Syst
  • MySQL踩坑笔记(1)

    mysql gt set password for 用户名 localhost password 新密码 这个是错的 mysql gt alter user 用户名 登录主机 identified by 密码 自定义 这个是对的 mysql
  • Linux全网超详细RHLinux安装PHP8.2.9 (2023年8月最新版)

    目录 进入PHP官方网站 1 下载安装包 2 解压安装包文件 3 安装php文件 安装提示sqlite3 4 安装过程中出现错误修复 5 查看一下php版本 6 启动php服务 进入PHP官方网站 PHP网址 https www php n
  • keras卷积神经网络入门-笑脸检测

    keras卷积神经网络入门 笑脸检测 Keras简介 1 库函数导入 2 查看数据集 3 构建模型 4 训练模型 5 预测自己的图片 Keras简介 Keras以其强大的封装结构 让我们不必过多的考虑神经网络间的计算 极大简化了tensor
  • Java面试题——为 什 么 说 Synchronized 是 一 个 悲 观 锁 ?乐 观 锁 的 实 现 原 理又 是 什 么 ? 什 么 是 CAS, 它 有 什 么 特 性 ?

    a Synchronized 显 然 是 一 个 悲 观 锁 因 为 它 的 并 发 策 略 是 悲 观 的 不 管 是 否 会 产 生 竞 争 任 何 的 数 据操作 都 必 须 要 加 锁 用 户 态 核 心 态 转换 维 护 锁 计
  • 【延期公告】2022年第四届大数据、物联网与计算国际会议(ICBICC 2022)

    2022年第四届大数据 物联网与计算国际会议 ICBICC 2022 重要信息 会议网址 www icbicc org 会议时间 2022年12月2 4日 召开地点 四川成都 截稿时间 2022年11月1日 录用通知 投稿后2周内 收录检索
  • MySQL单表多字段去重

    MySQL单表多字段去重 1 编写查重语句 SELECT a 字段1 a 字段2 FROM 表名 as a GROUP BY a 字段1 a 字段2 HAVING Count gt 1 这样即可得到多字段重复数据 2 更新表 去重 做这一步

随机推荐