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

news2025/1/11 6:04:54
🍺三维数字地球系列相关文章如下🍺:
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.GLSurfaceView
        android:id="@+id/gl_surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <LinearLayout
        android: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">

        <Button
            android:id="@+id/button"
            android:layout_width="84dp"
            android:layout_height="48dp"
            android:layout_marginLeft="2dp"
            android:text="纹理1" />

        <Button
            android:id="@+id/button2"
            android:layout_width="84dp"
            android:layout_height="48dp"
            android:layout_marginLeft="2dp"
            android:text="纹理2" />

        <Button
            android:id="@+id/button3"
            android:layout_width="84dp"
            android:layout_height="48dp"
            android:layout_marginLeft="2dp"
            android:text="纹理3" />

        <Switch
            android: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">

    <FrameLayout
        android: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://www.coloradmin.cn/o/1444567.html

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

相关文章

Vue3中Setup概述和使用(三)

一、引入Setup 1、Person.Vue 与Vue3编写简单的App组件(二) 中的区别是&#xff1a;取消data、methods等方法,而是将数据和方法定义全部放进setup中。 <template><div class"person"><h1>姓名:{{name}}</h1><h1>年龄:{{age}}</h…

天猫数据分析(天猫数据查询分析工具/软件):2023年天猫户外用品市场蓬勃发展,国产品牌具备竞争优势

后疫情时代&#xff0c;大众对于户外活动的热情高涨&#xff0c;参与度迅速提升&#xff0c;在这一消费热情下&#xff0c;我国的户外用品行业呈现出蓬勃的发展态势&#xff0c;市场规模不断扩大。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;2023年度&#xff0c;…

HarmonyOS 状态管理装饰器 Observed与ObjectLink 处理嵌套对象/对象数组 结构双向绑定

本文 我们还是来说 两个 harmonyos 状态管理的装饰器 Observed与ObjectLink 他们是用于 嵌套对象 或者 以对象类型为数组元素 的数据结构 做双向同步的 之前 我们说过的 state和link 都无法捕捉到 这两种数据内部结构的变化 这里 我们模拟一个类数据结构 class Person{name:…

Python 3 中使用 pandas 和 Jupyter Notebook 进行数据分析和可视化

简介 Python 的 pandas 包用于数据操作和分析&#xff0c;旨在让您以直观的方式处理带标签或关联数据。 pandas 包提供了电子表格功能&#xff0c;但由于您正在使用 Python&#xff0c;因此它比传统的图形电子表格程序要快得多且更高效。 在本教程中&#xff0c;我们将介绍如…

Python运算符大全,值得收藏

一、 Python的算术运算 Python的算术运算符与C语言类似&#xff0c;略有不同。包括加()、减(-)、乘(*)、除(/)、取余(%)、按位或(|)、按位与(&)、按位求补(~)、左移位(<<)、右移位(>>)、单目求反(-)、幂运算(**)、整除运算(//)、增强运算、增强矩阵乘法()。 …

【开源】SpringBoot框架开发个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

数据结构第十五天(树的存储/孩子表示法)

目录 前言 概述 接口 源码 测试函数 运行结果 往期精彩内容 前言 最近在知乎上看到的一个问题&#xff0c; 也许&#xff0c;短暂的离别&#xff0c;只为更好的相遇&#xff01; 2024&#xff0c;友友们&#xff0c;龙年快乐&#xff0c;新的一年&#xff0c;祝愿码上…

力扣面试题 17.04. 消失的数字(求和,位运算)

Problem: 面试题 17.04. 消失的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:求和 先求取1-n的数字和,再减去数组中所有元素的和即为缺失数 思路2:位运算 我们利用异或运算的特性:相同位为0,不同位为1;0与仍何数异或后得到仍何数,即我们先另一个变量(初始为0)与…

蓝牙 - BTSnoop File Format

1, Overview [ 概览 ] BTSnoop 文件格式适用于存储 Bluetooth HCI 通讯数据。它与 RFC 1761 中记录的 snoop 格式非常相似。 The BTSnoop file format is suitable for storing Bluetooth HCI traffic. It closely resembles the snoop format, as documented in RFC 1761. 2, …

Linux(Ubuntu) 环境搭建:Nginx

注&#xff1a;服务器默认以root用户登录 NGINX 官方网站地址&#xff1a;https://nginx.org/en/NGINX 官方安装文档地址&#xff1a;https://nginx.org/en/docs/install.html服务器的终端中输入以下指令&#xff1a; # 安装 Nginx apt-get install nginx # 查看版本信息 ngi…

【算法】排序详解(快速排序,堆排序,归并排序,插入排序,希尔排序,选择排序,冒泡排序)

目录 排序的概念&#xff1a; 排序算法的实现&#xff1a; 插入排序&#xff1a; 希尔排序&#xff1a; 选择排序&#xff1a; 堆排序&#xff1a; 冒泡排序&#xff1a; 快速排序&#xff1a; 快速排序的基本框架&#xff1a; 1.Hoare法 2. 挖坑法 3.前后指针法 快…

【数学建模】【2024年】【第40届】【MCM/ICM】【B题 搜寻潜水器】【解题思路】

一、题目 &#xff08;一&#xff09;赛题原文 2024 MCM Problem A: Resource Availability and Sex Ratios Maritime Cruises Mini-Submarines (MCMS), a company based in Greece, builds submersibles capable of carrying humans to the deepest parts of the ocean. A …

基于POSCMS架构开发的素材资源网平台整站全面修复版源码

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买) 资源简介 基于POSCMS架构开发的素材资源网平台整站全面修复版源码一键安装版 系统功能介绍 支持文章、论坛、下载、…

解决 postman测试接口报404 Not Found

JDK版本&#xff1a;jdk17 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 文章目录 问题描述原因分析解决方案 问题描述 当我使用postman测试接口时&#xff0c;报了 404 Not Found 的错误&#xff0c;报错截图如下所示 但我的后端程序中已经定义了该接口&#xff0c;如下所示 …

2024给你一些Android 应用性能优化的建议

2024给你一些Android 应用性能优化的建议 在当今激烈竞争的移动应用市场中&#xff0c;用户对应用性能和体验的要求越来越高。因此&#xff0c;进行 Android 应用性能优化是开发过程中必不可少的一环。下面将详细介绍如何提升应用的性能&#xff0c;以提升用户体验。 1. 优化…

静态时序分析:建立时间分析

静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中&#xff0c;建立时间检查约束了触发器时钟引脚&#xff08;时钟路径&#xff09;和输入数据引脚&#xff08;数据路径&#xff09;之间的时序关系&#x…

EMC学习笔记(二十四)降低EMI的PCB设计指南(四)

降低EMI的PCB设计指南&#xff08;四&#xff09; 1.电路板分区2.信号走线2.1 电容和电感串扰2.2 天线2.3 端接和传输线2.4输入端的阻抗匹配 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.电路板分区 电路板分区与电路板平面规划具有相同的基本含义&#x…

ubuntu22.04 安装部署04:经常死机,鼠标,键盘无响应

相关文章&#xff1a; ubuntu22.04 安装部署01&#xff1a;禁用内核更新 ubuntu22.04安装部署02&#xff1a;禁用显卡更新 ubuntu22.04安装部署03&#xff1a; 设置root密码 一、现象说明 1. 开机一小时后&#xff0c;突然之间网络掉线&#xff0c;鼠标、键盘无反应。 2.…

数据结构|对称矩阵压缩存储的下标公式推导|如何求对称矩阵压缩存储对应的一维数组下标

因为考试的时候可能会给很多情况的变式题&#xff0c;所以要会推导而不是背公式&#xff0c;情况变了&#xff0c;公式就不管用了。 行优先、只存储主对角线下三角区&#xff1a; 矩阵下标 ai,j(i>j)->一维数组下标 B[k] 按照行优先的原则&#xff0c;确定 ai,j 是一维数…

[word] word分割线在哪里设置 #其他#经验分享

word分割线在哪里设置 在工作中有些技巧&#xff0c;可以快速提高工作效率&#xff0c;解决大部分工作&#xff0c;今天给大家分享word分割线在哪里设置的小技能&#xff0c;希望可以帮助到你。 1、快速输入分割线 输入三个【_】按下回车就是一条长直线&#xff0c;同样分别…