【小沐学GIS】基于Android绘制三维数字地球Earth(OpenGL)

🍺三维数字地球系列相关文章如下🍺:
1【小沐学GIS】基于C++绘制三维数字地球Earth(OpenGL、glfw、glut)第一期
2【小沐学GIS】基于C++绘制三维数字地球Earth(OpenGL、glfw、glut)第二期
3【小沐学GIS】基于C++绘制太阳系SolarSystem(OpenGL、glfw、glut)
4【小沐学GIS】基于OpenSceneGraph(OSG)绘制三维数字地球Earth
5【小沐学GIS】基于C#绘制三维数字地球Earth(OpenGL)
6【小沐学GIS】基于Python绘制三维数字地球Earth(OpenGL)
7【小沐学GIS】基于Android绘制三维数字地球Earth(OpenGL)
8【小沐学GIS】基于WebGL绘制三维数字地球Earth(OpenGL)

文章目录

  • 1、简介
    • 1.1 Android
    • 1.2 OpenGL
      • 1.2.1 OpenGL绘图函数
      • 1.2.2 OpenGL顶点数据解析
      • 1.2.3 OpenGL顶点组装方式
    • 1.3 球体可视化
  • 12、测试代码
    • 12.1 OpenGL / android(3d)
    • 12.2 OpenGL / WorldWind / android(3d)
  • 结语

1、简介

1.1 Android

Android是一个开源的,基于Linux的移动设备操作系统,主要使用于移动设备,如智能手机和平板电脑。Android是由谷歌及其他公司带领的开放手机联盟开发的。
在这里插入图片描述

下载Andorid Studio开发环境:
https://developer.android.google.cn/studio?hl=zh-cn
在这里插入图片描述

1.2 OpenGL

OpenGL(Open Graphics Library)是一个跨平台、跨语言的图形编程接口(API)。它被广泛用于实现2D和3D图形渲染,并且是许多应用程序、游戏和网页浏览器的核心组件。
https://www.opengl.org/
在这里插入图片描述

1.2.1 OpenGL绘图函数

OpenGL提供的画图函数可以分为两大类:non-indexed draw和indexed draw。下面列举出了几个最常用的画图函数。

//1.基本方法:non-indexed draw
void glDrawArrays( GLenum mode, GLint first, GLsizei count);
//mutidraw + non-indexed draw
void glMultiDrawArrays( GLenum mode, GLint *first, GLsizei *count, GLsizei primcount);
//instance + non-indexed draw
void glDrawArraysInstanced( GLenum mode, GLint first,GLsizei count, GLsizei instancecount);
//indirect + non-indexed draw
void glDrawArraysIndirect(GLenum mode, const void *indirect);//2.基本方法:indexed draw
void glDrawElements(GLenum mode, GLsizei count, GLenum type, void * indices);
//mutidraw + indexed draw
void glMultiDrawElements( GLenum mode, GLsizei *count, GLenum type, void **indices, GLsizei primcount);
//instance + indexed draw
void glDrawElementsInstanced( GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
//indirect + indexed draw
void glDrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);

glDrawArrays()和glDrawElements()是最基础的2个画图函数,每调用1次画图函数,CPU和GPU会进行一次数据通信,我们把这个过程叫做drawcall。

1.2.2 OpenGL顶点数据解析

VBO内顶点数据的解析方式,存放在VAO中,在填写顶点数据解析方式之前,需要绑定VAO。数据解析函数:

void glVertexAttribPointer(GLuint index, //分组编号GLint size, //单个顶点包含的数组元素数量GLenum type,//数组元素数据类型GLboolean normalized, //是否单位化GLsizei stride, //步长const void *offset);//首地址
void glEnableVertexAttribArray(GLuint index);//启用编号为index的分组

在这里插入图片描述

1.2.3 OpenGL顶点组装方式

有4类顶点组装(assembly)方式:point,line,triangle,patch。

GLenumoutput primtiveused in shaders
GL_POINTSpointsgeometry; fragment
GL_LINESlinesgeometry; fragment
GL_LINE_STRIPlinesgeometry; fragment
GL_LINE_LOOPlinesgeometry; fragment
GL_LINES_ADJACENCYlines_adjacencygeometry
GL_LINE_STRIP_ADJACENCYlines_adjacencygeometry
GL_TRIANGLEStrianglesgeometry; fragment
GL_TRIANGLE_STRIPtrianglesgeometry; fragment
GL_TRIANGLE_FANtrianglesgeometry; fragment
GL_TRIANGLES_ADJACENCYtriangles_adjacencygeometry
GL_TRIANGLE_STRIP_ADJACENCYtriangles_adjacencygeometry
GL_PATCHESpatchestessellation control

在这里插入图片描述

1.3 球体可视化

一个半圆绕直径所在直线旋转一周所成的空间几何体叫做球体,简称球,半圆的半径即是球的半径。球体是有且只有一个连续曲面的立体图形,这个连续曲面叫球面。
通过球面参数方程,可以将球面的参数表示为三个变量:半径r、极角θ和纬度φ。下面是一些实现步骤:

  1. 定义坐标系:首先需要选择一个参考点(如北极)作为原点,并确定x轴正方向指向该点的北方向。然后将y轴和z轴分别垂直于x轴和x轴,使它们与x轴的夹角分别为90°和270°。最后,将x, y 和 z 轴定义为一个三维坐标系。
  2. 将球面参数方程转换为球面坐标:假设球的半径为 r,则其球心坐标为 (0, 0, r),即 x = r * cos(θ) * sin(φ), y = -r * tan(θ)*cos(φ), z = r * sin( θ ) 。将这些点代入球面坐标中,可以得到一个球面上任意一点的坐标。
    在这里插入图片描述

12、测试代码

12.1 OpenGL / android(3d)

在这里插入图片描述

  • 界面布局文件(activity_main.xml)如下
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><android.opengl.GLSurfaceViewandroid:id="@+id/gl_surface_view"android:layout_width="match_parent"android:layout_height="match_parent" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="48dp"android:layout_marginBottom="64dp"android:gravity="center"android:orientation="horizontal"android:paddingLeft="16dp"android:paddingRight="16dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/gl_surface_view"><Buttonandroid:id="@+id/button"android:layout_width="84dp"android:layout_height="48dp"android:layout_marginLeft="2dp"android:text="纹理1" /><Buttonandroid:id="@+id/button2"android:layout_width="84dp"android:layout_height="48dp"android:layout_marginLeft="2dp"android:text="纹理2" /><Buttonandroid:id="@+id/button3"android:layout_width="84dp"android:layout_height="48dp"android:layout_marginLeft="2dp"android:text="纹理3" /><Switchandroid:id="@+id/switch1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="传感器控制" /></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>

12.2 OpenGL / WorldWind / android(3d)

World Wind(简称WW,中文民间直译为世界风),是NASA发布的一个开放源代码(Open Source)的地理科普软件(由NASA Research开发,由NASA Learning Technologies来发展),它是一个可视化地球仪,将NASA、USGS以及其它WMS服务商提供的图像通过一个三维的地球模型展现,近期还包含了火星和月球的展现。

  • gov.nasa.worldwind 顶级包
  • gov.nasa.worldwind.awt 用于awt的组件
  • gov.nasa.worldwind.formats.gpx GPS轨道格式
  • gov.nasa.worldwind.formats.nmea GPS轨道格式
  • gov.nasa.worldwind.geom 几何与数学类
  • gov.nasa.worldwind.globes 地球、火星等星球的实现
  • gov.nasa.worldwind.layers 图层
  • gov.nasa.worldwind.layers.Earth 专用于地球的图层
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 界面布局文件(activity_main.xml)如下
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><FrameLayoutandroid:id="@+id/globe"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentLeft="true"android:layout_alignParentRight="true"android:layout_alignParentTop="true"></FrameLayout></androidx.constraintlayout.widget.ConstraintLayout>

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2778838.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

2003-2021年地级市实际利用外资数据/地级市实际利用FDI数据

2003-2021年地级市实际利用外商直接投资数据/地级市FDI数据 1、时间&#xff1a;2003-2021年 2、来源&#xff1a;城市年鉴、统计公报、省统计年鉴&#xff0c;已尽最大程度进行填补 3、指标&#xff1a;省份代码、城市代码、省份、城市、年份、当年实际使用外资金额&#x…

每日一个shell脚本之自动化采集监控指标+登录欢迎

每日一个shell脚本之自动化采集监控指标登录欢迎 效果图参上 源码奉上 #!/usr/bin/bashclear#空闲内存Frfree -h | awk NR2{print $4}#已用内存Usfree -h | awk NR2{print $3}#系统存储空间Us_systemdf -Th | grep /dev/ | tail -1 | awk {print $4}Us_freedf -Th | grep /de…

ubuntu彻底卸载cuda 重新安装cuda

sudo apt-get --purge remove "*cublas*" "*cufft*" "*curand*" \"*cusolver*" "*cusparse*" "*npp*" "*nvjpeg*" "cuda*" "nsight*" cuda10以上 cd /usr/local/cuda-xx.x/bin/ s…

【数据结构和算法】--- 基于c语言排序算法的实现(2)

目录 一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare法1.2.2 挖坑法1.2.3 前后指针法 1.3 快速排序优化1.3.1 三数取中法选key1.3.2 递归到小的子区间使用插入排序 1.4 快排非递归版 二、归并排序2.1 归并排序2.1.1 递归版2.1.2 非递归版 一、交换排序 基本思想&#xff1a…

KVM和JVM的虚拟化技术有何区别?

随着虚拟化技术的不断发展&#xff0c;KVM和JVM已成为两种主流的虚拟化技术。尽管它们都提供了虚拟化的解决方案&#xff0c;但它们在实现方式、功能和性能方面存在一些重要的差异。本文将深入探讨KVM和JVM的虚拟化技术之间的区别。 KVM&#xff08;Kernel-based Virtual Mac…

通胀向下,价格向上

号外&#xff1a;教链内参2.10《内参&#xff1a;BTC真的存在春节模式吗&#xff1f;》 9号&#xff0c;美国劳工统计局BLS对1月份发布的2023年12月份通胀月环比数据进行了修订&#xff0c;下修了0.1%&#xff0c;从0.3%下调为0.2%。更骚气的是&#xff0c;还把前值也就是11月的…

无性能损失!让SAM加速近50倍!EfficientViT-SAM来了!

今天给大家分享一个加速视觉分割大模型的工作&#xff1a;EfficientViT-SAM。这是一种新的加速SAM系列。保留了SAM的轻量级提示编码器和mask解码器&#xff0c;同时用EfficientViT替换了沉重的图像编码器。对于训练&#xff0c;首先从SAM-ViT-H图像编码器到EfficientViT的知识蒸…

Nginx实战:3-日志按天分割

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、方式1&#xff1a;定时任务执行分割脚本 1.分割日志脚本 2.添加定时任务 二、方式2&#xff1a;logrotate配置分割 1.logrotate简单介绍 2.新增切割ngi…

Debezium发布历史120

原文地址&#xff1a; https://debezium.io/blog/2022/04/07/read-only-incremental-snapshots/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Read-only Incremental Snapshots for MySQL April 7, 2022 by K…

第68讲表单验证实现

表单验证实现 Form 组件允许你验证用户的输入是否符合规范&#xff0c;来帮助你找到和纠正错误。 Form 组件提供了表单验证的功能&#xff0c;只需为 rules 属性传入约定的验证规则&#xff0c;并将 form-Item 的 prop 属性设置为需要验证的特殊键值即可。 const rulesref({u…

Vulnhub靶机:hacksudo-search

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;hacksudo-search&#xff08;10.0.2.50&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.co…

软考 系统分析师系列知识点之信息系统战略规划方法(5)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之信息系统战略规划方法&#xff08;4&#xff09; 所属章节&#xff1a; 第7章. 企业信息化战略与实施 第4节. 信息系统战略规划方法 7.4.3 战略集合转化法 战略目标集合转化法&#xff08;Strategy Set Transformation&a…

ESP8266-01S模块连接服务器(ONENET)

ESP8266-01S模块连接服务器&#xff08;ONENET&#xff09; 固件烧录通过http协议连接onenet云平台 固件烧录 一般在esp8266到手之后会进行测试&#xff0c;以确保能用&#xff0c;该模块出厂时默认自带出厂固件的&#xff0c;但如果进行了开发即下载了自己写的程序&#xff0…

一句话总结Docker与K8S的关系

一句话总结&#xff1a;Docker只是容器的一种&#xff0c;它面向的是单体&#xff0c;K8S可以管理多种容器&#xff0c;它面向的是集群&#xff0c;Docker可以作为一种容器方案被K8S管理。下文继续具体介绍。 1、容器的核心概念 介绍这几个核心概念&#xff1a;OCI、CR、Runc、…

spark sql上线前的调试工作实现

背景 每个公司应该都有大数据的平台的吧&#xff0c;平台的作用就是可以在上面执行各种spark sql以及定时任务&#xff0c;不过一般来说&#xff0c;由于这些spark sql的上线不经过测试&#xff0c;所以可能会影响到生产的数据&#xff0c;这种情况下大数据平台提供一个上线前…

跟着pink老师前端入门教程-day23

苏宁网首页案例制作 设置视口标签以及引入初始化样式 <meta name"viewport" content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0"> <link rel"stylesheet" href"css/normaliz…

动态规划01 三步问题[C++]

​​​​​​ 图源&#xff1a;文心一言 上机题目练习整理&#xff0c;本篇作为动态规划的代码&#xff0c;因为做题入门很少找到带图的讲解&#xff08;难道是因为太简单&#xff0c;所以没有人嘛&#xff09;&#xff0c;所以干脆自己写一份&#xff0c;供小伙伴们参考~&am…

Blazor SSR/WASM IDS/OIDC 单点登录授权实例5 - Winform 端授权

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor SSR/WASM IDS/OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor SSR/WASM IDS/OIDC 单点登录授权实例2-登录信息组件wasmBlazor SSR/WASM IDS/OIDC 单点登录授权实例3-服务端…

js基础(1)

操作数组 数组.push() 将一个或多个元素添加到数组末尾&#xff0c;返回数组新长度 数组.unshift() 将一个或多个元素添加到数组末尾&#xff0c;返回数组新长度 数组.pop() 删除最后一个元素&#xff0c;返回该元素的值 更灵活的删除方法&#xff0c;删除指定元素 数组.spli…

01-Spring实现重试和降级机制

主要用于在模块调用中&#xff0c;出现失败、异常情况下&#xff0c;仍需要进行重复调用。并且在最终调用失败时&#xff0c;可以采用降级措施&#xff0c;返回一般结果。 1、重试机制 我们采用spring 提供的retry 插件&#xff0c;其原理采用aop机制&#xff0c;所以需要额外…