软件实现三维地图引擎的研究

说说基于BS架构的三维地图引擎如arcgis以及三维引擎cesium等在数字孪生三维可视化项目中踩过的那些坑 不知从何年何月BS架构的系统在PC端领域占据了大半壁江山,众多的软件公司为了迎合客户,在项目中纷纷采用BS架构,也因此导致培养了一大批相应的程序员技术人才。 然而,在移动端、手机领域,却又出现另一番景象,CS架构的桌面APP则是出于绝对的统治地位,app一定要占据用户桌面。 为此涌现了大批手机app开发程序员。要知道,app软件有原生开发和混合开发,大多数app是 基于混合开发的,比如安卓app开发,app程序本身需要原生技术进行开发,如java或者c++,内容页则是基... 阅读详情

 

写在前面:

这篇东西,本来写下来是想去投出版社的。结果打听下来,这还要一笔不大不小的花费,除了审稿费,还有版面费,少的几百,多的上千。艾,写的也不咋地,先放在这里好了。等哪天手头宽裕了再说吧(顺便说一下现在的出版社可真是向钱看啊)。

 

1,    引言:

当前在许多导航类产品中地图引擎的使用已经很多见了,特别是随着近些年硬件技术的发展,加上许多三维的图形绘图软硬件库的支持,使得三维地图引擎的使用也变得比较常见了。可以说一款好的三维地图引擎对于整个产品来说是显得相当重要的。

针对于应用层的地图图形软件开发使用的比较普遍的三维图形库有OpenGL、Direct3D等。这些图形库都是针对于三维图形绘制特别优化的,包括对一些关键算法和特定绘图硬件设备的支持。它们提供了一些灵活的接口调用而将具体的实现方式完全的封装了起来。这样为开发人员在使用时提供了相当的便利。但也使得开发人员不清楚图形库的具体实现方式,只专注于应用的实现。

本文的目的是想通过介绍纯软件方式实现的三维地图引擎,使得人们了解三维地图引擎的基本结构和流程,内部的实现方式,从而能够更好的掌握三维地图引擎开发的原理和本质。

 

2,    三维引擎简介:

     通常按用途划分三维引擎基本上可以分为:太空引擎、地形引擎、FPS室内引擎、光线投射和体素引擎、混合引擎。

2.1、太空引擎:

       该引擎在三维引擎中不是那么复杂。在大多数情况下,三维太空游戏是基于物体的,这意味着所有的实体都是物体,在渲染之前,有很多物体已经从流水线中剔除;然后在渲染期间,使用简单的画家算法或Z缓存对组成每个物体的多边形进行排序,然后将光照、动画等通过常规方式处理。

2.2、地形引擎:

       比太空引擎复杂点的是地形引擎。当然,地形引擎中需要处理的不光是地形,还有处于地形中的物体,包括复杂的动画和地形跟踪算法。然而,地形引擎的主要问题是,如何表示世界数据库,它可是非常庞大的。

       例如,假设要创建一个大小为100000*100000单位的多边形网格世界,其中每个多边形的大小为200*200单位。这意味着该多边形网格包含大约250000((100000/200)*(100000/200))个多边形。

2.3、FPS室内引擎:

       FPS的全称是第一人称射击,这种引擎比较棘手。首先、玩家大部分时间都在室内,这就要求清晰的细节和近距离;其次,FPS世界在日益增大,多边形数据库也将随之增大,这意味着不能简单的将整个世界传递给三维流水线,而必须使用空间划分技术将世界区分,以最大限度的减少需要考虑的多边形。

2.4、光线投射和体素引擎:

       原则来说,多边形的引擎基本上都是基于光线投射和体素的。光线投射是一种被用于很多三维FPS游戏中的技术,这些游戏是基于向前光线跟踪的,即从玩家的视点投射一条光线,穿过视平面,直到遇到物体。这种技术可以非常快的生成三维场景。

2.5、混合引擎:

       该种引擎被设计成可以同时模拟太空、陆地和FPS。它的意义在于,很多时候你可能想创建一个有多种环境的世界,这样你不得不使用多个不同类型的引擎,以便根据要完成的任务使用合适的引擎,而不是使用一个引擎来完成所有的任务。

 

3,    三维地图引擎的基本构架:

3.1、三维坐标系的问题:

在我们了解三维地图引擎构架之前,先了解一下三维坐标系的问题。在三维的世界中有着很多不同的坐标系,每种坐标系表达的意义都是不同的,而他们之间又有着一些特定的转换关系。主要的坐标类型有以下几种:

A,模型坐标(局部坐标)

B,世界坐标

C,相机坐标

D,透视坐标

E,屏幕坐标

模型坐标,也称局部坐标。是表示在创建物体时物体本身所处的坐标系坐标。

世界坐标表示的是虚拟空间中的实际位置,物体将在虚拟空间中移动和被变换。

当我们的实现处于某一个位置观察物体时,则需要定义相机坐标系,同时将世界坐标转成相机坐标。

将三维空间中的坐标通过透视变换映射到平面坐标系上的坐标称之为透视坐标。这种坐标的变换称为透视变换。

将通过投影变换得到的一系列的点根据屏幕的尺寸和相关参数显示在屏幕上,这便是屏幕坐标。

以上各个坐标系之间存在着相互转换的关系,正常情况下绘制一个三维物体需要经过模型坐标,到世界坐标,到相机坐标,到透视坐标,到屏幕坐标的变换。

图1 包含光照处理的坐标转换流水线

 

3.2、渲染三维世界:

       了解了以上的一些坐标概念,我们便可以进一步去了解一下三维渲染的世界,可以从线框的绘制模式转变为填充的绘制模式。三维渲染主要包括以下三部分:

              光照模型

              纹理映射技术

              三维裁剪技术

       3.2.1、光照模型:

所谓光照模型,是根据光学物理的有关定律计算画面上景物表面各点投影到观察者眼中的光亮度和色彩组成的公式。

一个好的光照模型应该满足以下要求:

(1)能产生较好的立体视觉效果;

(2)在理论上具有一定的合理性或严密性;

三维可视化引擎技术研究 Three.js是一款WebGL开源框架,利用简单直观的方式封装了3D图形编程中常用的对象,但是没有提供一些基础建模软件的插件,比如3dsmax的模型导出插件,只提供一些读3ds格式、fbx格式的场景,更多要配合更多扩展库完成。综合对比上述各类三维引擎框架后,这里采用Cesium.js作为开源三维引擎框架,Cesium.js通过HTML5网页标准和WebGL技术规范实现动态的三维场景显示和渲染,无需安装插件即可创建具有最佳性能、精度、视觉质量和易用性的世界级三维地球影像和地图,并具有丰富的开源社区内容。 阅读详情

相关推荐

使用 OpenTK 三维引擎开发三维点云图像

使用 OpenTK 三维引擎开发三维点云图像是一个具有挑战性但又充满乐趣和价值的过程。从理解三维点云图像的基础概念,到掌握 OpenTK 的功能和图形渲染管线,再到实际的项目开发中的数据加载、渲染设置、优化与增强等步骤,每个环节都需要开发者投入精力去学习和实践。

candy的博客 1762

2025最新OSM中国矢量数据保姆级下载指南(附百度网盘链接)

本文提供2025年OSM中国矢量数据的保姆级下载与使用指南。详细介绍了通过Geofabrik镜像站、QGIS插件及第三方平台获取数据的多种途径,重点解析了Shapefile格式数据的结构、WGS84坐标系特性,并指导进行格式转换与基础GIS应用,帮助用户高效合规地获取并利用这份开放地理数据资源。

weixin_29228781的博客 874

Tiff、jpg图片怎么样添加地理坐标信息

Tiff、jpg图片怎么样添加地理坐标信息 一般,外业调查只有地图资料,如专题图、或者地形图,如何把这些地图资料的扫描地图带上坐标信息,从而内业实现信息化处理?以上问题,可以解决,但根据不同情况有不同的处理方法。     第一种,上面有经纬度外框,图片是矩形,但是没有地理信息。 通过图框的两个角的坐标确定范围,分别是左上(140°E,30°N);右下(150°W,30°N) 解决方

树木_xzw的博客 2万+

UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount()【已解决】

UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount()【已解决】

围炉夜敲的博客 1万+

AutoSar标准官网下载

AutoSar文档下载和文档命名格式。。。

m0_56208280的博客 3518

【图像超分】论文复现:CVPR 2024 | 轻量化超分 | 窗口注意力改进 | CAMixerSR的Pytorch源码复现,跑通源码,获得指标和超分结果,计算复杂度,架构梳理拆解,逐行注释!

本文介绍了超分辨率重建方法CAMixerSR的代码实现与运行指南。文章亮点包括:完整跑通源码获取PSNR/SSIM指标和可视化结果;详细解析模型架构与关键代码注释,帮助快速复现基线模型。实验部分提供了测试配置文件和训练设置说明,支持2K/4K/8K大图像超分和x2/x4轻量化超分。环境依赖PyTorch和BasicSR框架,数据集包含DIV2K等常用基准。测试结果与论文指标一致,可视化输出保存至指定目录。训练配置可自定义数据集路径、GPU数量等参数。该实现突出了CAMixerSR在降低W-MSA复杂度方面的

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 438

OpenClaw进阶实战(二十五):抖音企业号——私信回复与视频评论分析

摘要:本文介绍抖音企业号自动化运营方案,突破抖音强风控体系的技术挑战。针对内容生产、私信互动和账号矩阵三大场景,提出混合架构解决方案: 私信自动化:结合关键词触发与随机延迟(45秒±15),实现拟人化回复,支持价格咨询/商务合作等高优先级消息识别 混合技术栈:官方API(合规)+真机RPA(覆盖长尾需求)+AI辅助生成(脚本→剪辑→发布闭环) 安全策略:通过设备指纹模拟、行为间隔随机化和内容差异化处理规避风控,提供每日200条的安全操作阈值。配套OpenClaw技能实现一键部署,包含cookie配置、回复规

PeterPan的博客 142

Python实现商品价格监控与波动分析爬虫项目

本文通过完整的代码示例和详细的技术讲解,展示了如何实现商品价格的自动监控和波动分析。该项目不仅适用于个人购物助手,还可以扩展为商家的竞品监控工具。通过结合数据抓取、存储、分析与可视化,能够帮助我们更好地理解市场趋势并做出优化决策。

2201_76125261的博客 1742

Monorepo与pnpm:前端项目管理的完美搭档

pnpm又称 performant npm,翻译过来就是高性能的npm。Monorepo是一种项目开发与管理的策略模式,它代表"单一代码仓库"(Monolithic Repository)。在Monorepo模式中,所有相关的项目和组件都被存储在一个统一的代码仓库中,而不是分散在多个独立的代码仓库中,这些项目之间还可能会有依赖关系。

m0_68271787的博客 2562

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 电子罗盘在GPS导航设备中的使用
下一篇: 2010年度总结1:北斗一体机
xuing
博客等级 码龄23年 86粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值