SuperMap Hi-Fi 3D SDK for Unity基础开发教程
作者:kele
一、背景
众所周知,游戏引擎(Unity)功能强大,可以做出很多炫酷的游戏和动画效果,这部分功能的实现往往不仅仅是靠可视化界面就能够实现的,还需要代码开发。SuperMap Hi-Fi SDKS for Unity游戏引擎插件能够实现地理数据与游戏引擎相结合,碰撞出更绚烂的火花,目前SuperMap Hi-Fi SDKS for Unity插件集成了许多可视化界面操作功能,但是在正式的开发环境中,往往不太能满足客户对于功能入口、界面UI的个性化需求,所以这部分功能的实现需要用到代码开发。
二、开发准备
2.1 开发软件下载
产品 | 推荐版本 | 介绍 | 下载地址 |
---|---|---|---|
Unity Hub | 3.3.1 - c2(最新版即可) | 使用 Unity Hub 可以更方便地创建、打开、管理和更新 Unity 项目1、 项目管理:Unity Hub 支持创建、打开和管理Unity项目2、 引擎管理:Unity Hub 能够同时安装和管理多个Unity引擎版本3、 社区资源:Unity Hub 提供了一个集中的位置,让用户可以轻松访问 Unity 社区资源 | https://unity.cn/releases |
Unity | 2019.4.39 f1c1 | 游戏引擎软件,可通过官网下载或者通过Unity Hub 下载(如果需要打包到 WebGL ,必须使用2019版本) | https://unity.cn/releases |
Visual Studio | 2019 | 开发工具,用于 Unity 二次开发 | https://visualstudio.microsoft.com/zh-hans/downloads |
SuperMap Hi-Fi 3D SDK for Unity | 11.1.1 | 超图游戏引擎(Unity)插件,可通过SuperMap官网下载 | http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx |
2.2 开发接口介绍
所有开发接口位于插件包文件夹下 SuperMap Hi-Fi 3D SDK for Unity 接口参考文档.xlsx 内。
常用接口类介绍:
名称 | 描述 |
---|---|
SuperMapSDK SuperMap SDK | 命名空间,包含数据加载、三维分析等功能 |
RealspaceView | 接口主类,控制整个场景 |
Scene | 三维场景类。三维数据会依据地理空间参考信息,填加到三维场景中 |
CameraState | 相机状态类 |
Layer3D | 三维图层类。该类提供了三维图层显示控制等便于三维地图管理的一系列属性 |
Layer3DS3MFile | 缓存图层类 |
Style3D | 图层风格类 |
三、开发步骤
3.1 创建canvas
在项目根节点上右键:GameObjects-UI-Canvas,创建Canvas用于放置UI元素
3.2 创建导航栏
在Canvas节点上右键:UI-Image,创建image对象,之后调整大小以及位置,使其位于Canvas顶部
将准备好的图片拖拽至工程目录下,选择图片后在右边属性面板中,将 Texture Type 选择为 Speite(2D and UI),然后通过鼠标鼠标将处理好的图片拖拽到 image 下 Source Image 中,导航栏就制作完成了;接下来通过同样的方法添加 Text 和 Button 用来展示项目名称与功能入口
3.3 创建脚本
在 Asset 下创建文件夹,并在文件夹内创建 C# Script,命名为 location
双击 C# 脚本,默认用 Visual Studio 打开编辑(如果没有安装,请参考2.1进行安装)。先编写飞行定位页面,编写好后点击保存,之后返回Unity
3.4 关联设置
回到Unity界面在左侧的层级视图(Hierarchy)面板中找到GameObjeect,点击右侧And Component,添加 location 的Script,将cs和自己创建的项目相关联,具体操作如下图所示:
3.5 运行结果
四、功能开发示例
4.1 添加图层
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SuperMapSDK;public class location : MonoBehaviour
{public void addLayer(){CameraState state = new CameraState(104.05099856483271,30.651860100062148, 5000, 0, 0, 0);SupermapGIS.Instance.Realspace.SceneControl.Scene.Fly(state, 4000);//添加s3m图层,不添加到队列最前面SupermapGIS.Instance.Realspace.SceneControl.Scene.Layers.Add("E:/sampledata/SampleData/Cache/Building/Building.scp", //缓存文件地址Layer3DType.S3M, //图层类型false, //是否添加到最前面"Building" //图层名称); //添加影像图层 SupermapGIS.Instance.Realspace.SceneControl.Scene.Layers.Add("E:/sampledata/SampleData/Cache/BeijingTerrain@BeijingTerrain/BeijingTerrain@BeijingTerrain/BeijingTerrain@BeijingTerrain.sci3d", Layer3DType.Map, false, "Beijingimg"); //添加地形图层 SupermapGIS.Instance.Realspace.SceneControl.Scene.TerrainLayers.Add("E:/sampledata/SampleData/Cache/BeijingTerrain@BeijingTerrain/BeijingTerrain@BeijingTerrain_Terrain/BeijingTerrain@BeijingTerrain_Terrain.sct", false); //添加在线S3M服务SupermapGIS.Instance.Realspace.SceneControl.Scene.Layers.Add("http://localhost:8090/iserver/services/3D-local3DCache-Ground/rest/realspace",Layer3DType.S3M, "Ground",false);}
}
4.2 飞行定位到指定图层
Realspace = new RealspaceView();
Scene scene = SupermapGIS.Instance.Realspace.SceneControl.Scene;//获取场景
//获取图层管理器里所有图层
List<LayerInfo> layerInfos = SupermapGIS.Instance.Layers.LayerInfos;
for (int i = 0; i < layerInfos.Count; i++)
{//遍历获取图层管理器里每个图层Layer3D layer3D = layerInfos[i].Layer as Layer3D;if (layer3D.Type == Layer3DType.S3M){//获取S3M缓存图层 if (layer3D.Name.Contains("Water")){//Vector3 pos = new Vector3(); var bounds = layer3D.Bounds;pos = new Vector3((float)bounds.Center.x,(float)bounds.Center.y, 2000);CameraState state = new CameraState(pos.x, pos.y, pos.z, 0, 0, 0); SupermapGIS.Instance.Realspace.SceneControl.Scene.Fly(state, 4000);}; }
}
4.3 飞行定位到指定坐标位置
CameraState state = new CameraState(114, 39, 4000, 0, 0, 0);
SupermapGIS.Instance.Realspace.SceneControl.Scene.Fly(state, 4000);
4.4 点击模型获取属性
Realspace = new RealspaceView();
Scene scene = SupermapGIS.Instance.Realspace.SceneControl.Scene;//获取场景
//获取图层管理器里所有图层
List<LayerInfo> layerInfos = SupermapGIS.Instance.Layers.LayerInfos;
for (int i = 0; i < layerInfos.Count; i++)
{//遍历获取图层管理器里每个图层Layer3D layer3D = layerInfos[i].Layer as Layer3D;if (layer3D.Type == Layer3DType.S3M){//获取S3M缓存图层 if (layer3D.Name.Contains("Building")){Selection3D selection = layer3D.Selection;int id = selection.LastSelectID;Layer3DS3MFile layer3DS3MFile = layerInfos[i].Layer as Layer3DS3MFile;//获取S3M缓存图层var selectID = layer3DS3MFile.GetAllFieldValue(id);foreach (var element in selectID) //element的类型与mList声明时一样{Debug.Log(element); //输出属性};}}
}
4.5 修改图层风格
if (s3mLayer != null && s3mLayer.Type == Layer3DType.S3M && s3mLayer.Name.Contains("矢量面")){//设置初始风格Style3D style = s3mLayer.Style;style.FillColor = new Color(1, 0.4f, 0, 0.5f); //矢量面黄色填充style.LineColor = new Color(1.0f, 0.0f, 0.0f, 1.0f);//矢量面绿框style.AltitudeMode = AltitudeMode.ClampToGround; //矢量面贴地s3mLayer.Style = style;//设置选中风格Style3D selectstyle = s3mLayer.SelectStyle;selectstyle.FillColor = new Color(0.0f, 0.0f, 1.0f, 0.5f); //矢量面选中时红色填充selectstyle.AltitudeMode = AltitudeMode.ClampToGround;s3mLayer.SelectStyle = selectstyle;s3mLayer.UpdateData();
}else if (s3mLayer != null && s3mLayer.Type == Layer3DType.S3M && s3mLayer.Name.Contains("倾斜")){s3mLayer.ClampVector = true; //矢量面贴倾斜、模型图层s3mLayer.MinVisibleAltitude = 2000; //设置图层最小可见距离s3mLayer.MaxVisibleAltitude = 50000; //设置图层最大可见距离
}
相关文章:

SuperMap Hi-Fi 3D SDK for Unity基础开发教程
作者:kele 一、背景 众所周知,游戏引擎(Unity)功能强大,可以做出很多炫酷的游戏和动画效果,这部分功能的实现往往不仅仅是靠可视化界面就能够实现的,还需要代码开发。SuperMap Hi-Fi SDKS for …...

Upload-lab(pass1~2)
Pass-1-js检查 这里检验 因为是前端js校验,所以只用绕过js前端校验 用burp抓包修改文件类型 写一个简易版本的php Pass-2-只验证Content-type 仅仅判断content-type类型 因此上传shell.php抓包修改content-type为图片类型:image/jpeg、image/png、image/gif...

Linux:查询当前进程或线程的资源使用情况
目录 一、/proc/[PID]/下的各个文件1、proc简介2、/proc/[PID]/详解 二、通过Linux API获取当前进程或线程的资源使用情况1、getrusage2、sysinfo3、times 在工作中,我们排除app出现的一些性能/资源问题时,通常要先知道当前app的资源使用情况,…...

unityc用vs2017介绍
21版unity能用17vs,只要在unity的Edit/Preferences/ExternalTools里面改既可。...

单元测试实战
文章目录 为什么要做单元测试?单元测试的几个核心要点是:单元测试目标单元测试框架JUnitTestNG 单元测试工具: 为什么要做单元测试? 测试代码:通过编写和运行单元测试,开发者能够快速验证代码的各个部分是否…...

WebService
调试工具:Postman、SoapUI Soap WebService :.net WCF 、Java CFX WebService三要素: SOAP(Simple Object Access Protocol):用来描述传递信息的格式, 可以和现存的许多因特网协议和格式结合使用&#x…...

Nestjs使用log4j打印日志
众所周知,nest是自带日志的。但是好像没有log4j香,所以咱们来用log4j吧~ 我只演示最简单的用法,用具体怎么样用大家可以自己进行封装。就像前端封装自己的请求一样。 一、安装 yarn add log4js stacktrace-js 二、使用 主要就三个文件&a…...

Selenium - 自动化测试框架
Selenium 介绍 Selenium 是目前用的最广泛的 Web UI 自动化测试框架,核心功能就是可以在多个浏览器上进行自动化测试,支持多种编程语言,目前已经被 google,百度,腾讯等公司广泛使用。 开发步骤 1、配置 google 驱动…...

RFID技术在汽车制造:提高生产效率、优化物流管理和增强安全性
RFID技术在汽车制造:提高生产效率、优化物流管理和增强安全性 随着科技的进步,物联网技术已经深入到各个领域,尤其在制造业中,RFID技术以其独特的优势,如高精度追踪、实时数据收集和自动化操作,正在改变传统的生产方式…...

git异常
1.异常现象 换机新安装 Git 后,拉代码时出现问题: Unable to negotiate with 10.18.18.18 port 29418: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 fatal: Could not read from rem…...

【C语言学习疑难杂症】第12期:如何从汇编角度深入理解y = (*--p)++这行代码(易懂版)
对于如下代码,思考一下输出结果是什么? int a[] = {5, 8, 7, 6, 2, 7, 3}; int y, *p = &a[1]; y = (*--p)++; printf("%d ",y); printf("%d",a[0]); 这个代码看似简单,但是在“y = (*--p)++;”这行代码里,编译器做了很多工作。 我们在vs2022的…...

5G阅信应用场景有哪些?
5G阅信的应用场景非常广泛,以下是一些常见的应用场景: 1.工业自动化:5G阅信可以连接各种工业设备和传感器,实现设备之间的实时通信和控制,提高生产效率和自动化水平。 2.物联网和智能家居:5G阅信可以连接各…...

使用OpenSSL生成自签名SSL/TLS证书和私钥
使用OpenSSL生成自签名SSL/TLS证书和私钥 前提: 系统安装了OpenSSL; 系统:windows、linux都可; 1 生成私钥 创建一个名为 server.key 的私钥文件,并使用 RSA 算法生成一个 2048 位的密钥。 openssl genrsa -out s…...

pycharm2023.2激活和新建项目,python3.12安装永久换源
pycharm安装 安装版本选择链接 激活参考链接 python安装 Windows下载指定python链接 选择相应版本的64位即可。 安装可以自己选择安装位置,记得勾选,add path即可。其余下一步默认即可。 windows临时换源 pip install 模块包名字 -i https://pypi.…...

FPGA分频电路设计(2)
实验要求: 采用 4 个开关以二进制形式设定分频系数(1-10),实现对已知信号的分频。 类似实验我之前做过一次,但那次的方法实在是太笨了: 利用VHDL实现一定系数范围内的信号分频电路 需要重做以便将来应对更…...

【三】【C语言\动态规划】珠宝的最高价值、下降路径最小和、最小路径和,三道题目深度解析
动态规划 动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利…...

爬虫工作量由小到大的思维转变---<第二十八章 Scrapy中间件说明书>
爬虫工作量由小到大的思维转变---<第二十六章 Scrapy通一通中间件的问题>-CSDN博客 前言: (书接上面链接)自定义中间件玩不明白? 好吧,写个翻译的文档点笔记,让中间件更通俗一点!!! 正文: 全局图: 爬虫中间件--->翻译笔记: from scrapy import s…...

从Maven初级到高级
一.Maven简介 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。 一个 Maven 工程有约定的目录结构,约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环,就拿自动编译来说,Maven 必须 能…...

orangepi--开发板配置网络SSH登录
常用指令: ifconfig-------------------------------------查看网络地址 sudo passwd orangepi-------------------------改密码 nmcli dev wifi-------------------------------查看wifi nmcli dev wifi connect xx password xx--------连接网络 ip addr show wla…...

简单通讯录管理系统第4关:简单通讯录管理系统之修改通讯录用户信息
任务描述 本关任务:实现修改通讯录用户电话号码的功能。 编程要求 仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中实现通讯录管理系统中修改用户信息的功能,具体要求如下: 在 PhoneManage.java 类定义一个 changeP…...

macOS编译ckb-next
macOS x86 成功,下一步,测试:m1、m2、m3 。 1、Homebrew # 三选一 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" # /bin/bash -c "$(curl -fsSL https://raw.gith…...

漏刻有时数据可视化Echarts组件开发(46)散点图颜色判断
series组件 series: [{name: Top 5,type: scatter,coordinateSystem: bmap,data: convertData(data.sort(function (a, b) {return b.value - a.value;}).slice(0, 6)),symbolSize: 20,encode: {value: 2},showEffectOn: render,rippleEffect: {brushType: stroke},label: {fo…...

智能优化算法应用:基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.驾驶训练算法4.实验参数设定5.算法结果6.…...

【论文阅读】MCANet: Medical Image Segmentation with Multi-Scale Cross-Axis Attention
文章目录 摘要创新点总结实现效果总结 摘要 链接:https://arxiv.org/abs/2312.08866 医学图像分割是医学图像处理和计算机视觉领域的关键挑战之一。由于病变区域或器官的大小和形状各异,有效地捕捉多尺度信息和建立像素间的长距离依赖性至关重要。本文提…...

机器视觉实战应用:手势、人脸、动作以及手势鼠标构建(一)
CV实战应用手势、人脸、动作以及手势鼠标构建(一)总起 核心思想 手势识别是一种常见的计算机视觉应用,它可以通过摄像头或者预先录制的视频图像来追踪和识别人类手势。手势识别的应用非常广泛,例如在游戏、虚拟现实、人机交互等…...

python作业题百度网盘,python作业答案怎么查
大家好,小编来为大家解答以下问题,python作业题百度网盘,python作业答案怎么查,今天让我们一起来看看吧! 1 以下代码的输出结果为: alist [1, 2, 3, 4] print(alist.reverse()) print(alist) A.[4, 3, 2, …...

centos7.9中离线安装nginx开启ssl,arm架构
一、首先需要去国内相关镜像库下载相关依赖rpm: http://mirrors.bfsu.edu.cn/centos-altarch/7.9.2009/os/aarch64/ http://mirror.nju.edu.cn/centos-altarch/7.9.2009/os/aarch64/ http://mirrors.tuna.tsinghua.edu.cn/centos-altarch/7.9.2009/os/aarch64/ htt…...

LENOVO联想笔记本小新Pro 14 IRH8 2023款(83AL)电脑原装出厂Win11系统恢复预装OEM系统
链接:https://pan.baidu.com/s/1M1iSFahokiIHF3CppNpL4w?pwdzr8y 提取码:zr8y 联想原厂系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等自带的预装软件程序 所需要工具:16G或以上的U盘 文件格式:ISO 文件…...

blender使用faceit绑定自己的表情动作
blender使用faceit绑定自己的表情控制模型 faceit是个神器,来记录一下如何让表情动起来保持相对位置头部分离,方便后续绑定faceitfaceit的注册rig生成地标Animate可以修正表情烘培之前记得保存使用Faceit的整个流程 faceit是个神器,来记录一下…...

有关List的线程安全、高效读取:不变模式下的CopyOnWriteArrayList类、数据共享通道:BlockingQueue
有关List的线程安全 队列、链表之类的数据结构也是极常用的,几乎所有的应用程序都会与之相关。在java中, ArrayList和Vector都使用数组作为其内部实现。两者最大的不同在与Vector是线程安全的。 而ArrayList不是。此外LinkedList使用链表的数据结构实现…...