基于全球的物理系统集成技术

引言

随着·····

概述

基于osgEarth渲染引擎,引入先进的物理引擎physics。

本篇主要讲述:原理和解决思路。

原理要点:

  1. 空间坐标转换
  2. 物理引擎与渲染引擎同步
  3. 无限动态大地形在物理引擎中的实现

技术要点1空间坐标转换

常用的物理引擎都是基于直角坐标系为运算基础的,重力都是以某个轴的负方向为向量,如:

Phscis  重力矢量为  (0,0,-1)

而基于全球化的物理引擎在不同的经纬度,重力的矢量是变化的。

例如(以直角坐标系为例)

地球位置

经度

纬度

重力矢量趋近

北极

0

90

0,   0,   -1

南极

0

-90

0,   0,   1

非洲几内亚

0

0

-1,   0,   0

印尼(赤道)

90

0

-1,   -1,   0

太平洋

180

0

0,   -1,   0

北京

116

40

-0.8,  -1,  -0.9

全球范围内使用物理引擎,需要实时修改重力矢量。

但是,仅仅改变重力矢量是不够的。由于数据原因,物理引擎使用的直角坐标系不能直接用于全球计算。

目前在地理信息系统中常用的有:

北京54坐标系

西安80坐标系

2000国家大地坐标系

WGS84坐标系

以最常用的WGS84举例:

它的坐标系原点位于地球质心,Z轴指向BIH1984.0定义的协议地球极方向(CTP),X轴指向BIH1984.0的零度子午面和CTP的赤道交点,Y轴通过右手规则确定。

基于地球的长半轴为:6378137.0

基于地球的扁率为:1/298.257223565

经过常规直角坐标系到WGS84的转换后,场景的数值飞的非常大,而物理引擎计算都是小数值的计算,过大的数值在引擎中使用有精度影响。在地球上使用物理引擎都是某个小区域内使用(几十公里),当需要使用时,先取附近的一个点为基准点K,然后将这小区域所有的数值N减去当前基准点K的位置放入物理引擎中计算,得到结果Z后,再将结果Z加上基准点K就得到结果M

如下所示:

N值--->物理引擎--->结果m有误差

N值--->减去基准点--->物理引擎--->结果Z--->加上基准点K--->结果M无误差

技术要点2物理引擎与渲染引擎同步

物理引擎将空间数据通过物理定律运算返回结果,能模拟出在现实中物体的状态。

渲染引擎将空间数据通过计算机模拟出视觉形态。

两个引擎用的虽然使用的数据相同,但计算和加载的方式不一样,所以,要同步两个引擎中的数据。一般情况下的做法是:将所有数据先经过物理引擎处理,再将处理后的数据放入渲染引擎中显示,这样做数据一直是同步的。不过,在处理全球范围的数据时,数据量太大,物理引擎太慢,渲染帧数又有高要求,就不能采用线性的处理方式。

在实际使用中,我们用了多线程技术和时间同步技术。数据有两份,在物理引擎中一份,渲染引擎中一份。物理引擎每次返回结果后就修改数据的状态机,而渲染引擎每帧都会去遍历数据状态并刷新场景。这样物理引擎的计算时间并不影响渲染时间,提高效率。在时间同步上,渲染引擎因为是读取状态机而不进行计算,所以使用的是物理引擎的时间,不会出现位置和时间偏差。

技术要点3无限动态大地形在物理引擎中的实现

将全球的数据全加入物理引擎,在目前的硬件条件下还达不到。目前只能动态的加载和卸载地形数据。

当前的全球渲染引擎,将地球划分为一个一个的小瓦片。物理引擎也使用相同的数据。

首先,创建九个地形瓦片:

1  2  3

4  5  6

7  8  9

以当前经纬度所在的瓦片为5,并将周围的8个瓦片用渲染引擎中的数据或其他高程数据填充就得到了一块小的物理地形,可以进行物理计算。

当物理场景需要移动时,如向右移动,见下图下:

1x  2x  3x          3y

4x  5x  6x  -->   6y

7x  8x  9x          9y

先将新的三个瓦片加入物理引擎中,变成12个瓦片

1x  2x  3x  3y

4x  5x  6x  6y

7x  8x  9x  9y

再将最左边的三个瓦片卸载,变成9个瓦片

2x  3x  3y

5x  6x  6y

8x  9x  9y

修改索引编号,回到原点

2x  3x  3y          1x  2x  3x

5x  6x  6y   -->   4x  5x  6x

8x  9x  9y                7x  8x  9x

往其他方向的移动使用相同原理。

以上的技术,已经实现

[原]关于phycis集成到osgearth的(瞎写写)的更多相关文章

  1. C#基本方法(瞎写写)

    public static IEnumerable<T> GetAll<T>() where T : new() { using (var conn = new Profile ...

  2. Qt里的slot

    昨天出了一个小bug, 一直调都没调出来, 今天仔细看了下, 发现出错的原因了. 我在用osgEarth的时候, 用到一个类MapCatalogWidget, 觉得它不够用, 就把这个类给改了下, 添 ...

  3. 面向服务体系架构(SOA)和数据仓库(DW)的思考基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台

    面向服务体系架构(SOA)和数据仓库(DW)的思考 基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台 当前业界对面向服务体系架构(SOA)和数据仓库(Data Warehouse, ...

  4. 自研网关纳管Spring Cloud(一)

    摘要: 本文主要从网关的需求,以及Spring Cloud Zuul的线程模型和源码瓶颈分析结合,目前最近一段时间自研网关中间件纳管Spring Cloud的经验汇总整理. 一.自研网关纳管Sprin ...

  5. XyTalk企业即时通讯IM开始开源

    网址: https://gitee.com/475660/xyTalk-pc https://github.com/xy-Group/xyTalk-pc Xy.Platform是一个高性能.可扩展的企 ...

  6. CPU执行程序的原理(简化过程)

    前言 看了网上的一些描述CPU执行程序的过程,发现他们涉及到的内容太多了,恨不能把整个CPU的底层结构都拿出来说,这对计算机理论知识匮乏的新人甚至是一些老人都是非常不友好的.这个问题也是当初拦在我面前 ...

  7. (转)FS_S5PC100平台上Linux Camera驱动开发详解(一) .

     平台linuxstructlinux内核videocam 说明:        理解摄像头驱动需要四个前提:        1)摄像头基本的工作原理和S5PC100集成的Camera控制器的工作原理 ...

  8. 蒟蒻的9个背包的浩大工程(更新中)(无限延期)(太长了不舍删虽然写的lj的一匹)

    所以说这就是一篇写炸的废文!!!! 所以说背包直接看dd大神的就好了,算了瞎写写吧. 0/1背包 有n件物品和一个容量为C的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品放入背包可使 ...

  9. 面向服务体系架构(SOA)和数据仓库(DW)的思考

    摘要: 当前业界对面向服务体系架构(SOA)和数据仓库(Data Warehouse,DW)都介绍的很多,提出了很多优秀的解决方案,但是一般是把 SOA 和 DW 单独考虑,SOA 和 DW 有着共同 ...

随机推荐

  1. 9/252D图的画法

    我们在介绍之前先想想2D图的一些元素 我在这里按我的思路写下一些: 坐标轴(尺度,区间..),线条(样式,颜色...),图和线的标签和注释,图像大小,图像里图片的排版(一张图像中多张图) 下面我们将分 ...

  2. PIMPL(二)

    文档下载 上一篇文档,PIMPL(一) 1 如何使用PIMPL 有多种方式实现PIMPL,这里按照<Effective C++>中介绍的方式. 1.1 基本步骤 假设原有Person如下: ...

  3. 【Java】系统漏洞:关于用户登录后操作的注意事项

    项目背景: SpringMVC + Mybatis  + MySql数据库(javaWeb项目开发) 相关模块:登录,个人详细信息修改,订单详情查询 相关漏洞介绍: 1.登录的验证码:登录的验证码一定 ...

  4. linux cut字符串切割

    linux字符串列截取  cut  -d ‘分割条件’ -f ‘列数’ [root@LocalWeb01 ~]# less  /etc/passwd | grep '^user' | grep -v ...

  5. mysql的count方法详解

    1.cout(*)会统计为null的行: 2.count(列名)不会统计此列null值的行: 3.count(distinct col)计算该列除null之外的不重复数量:

  6. CAScrollLayer

    CAScrollLayer 对于一个未转换的图层,它的bounds和它的frame是一样的,frame属性是由bounds属性自动计算而出的,所以更改任意一个值都会更新其他值. 但是如果你只想显示一个 ...

  7. python 不同集合上元素的迭代 chain()

    itertools.chain()可以接受一个可迭代对象列表作为输入,并返回一个迭代器,有效的屏蔽掉在多个容器中迭代细节 >>> from itertools import chai ...

  8. Linux命令: 编辑模式移动光标

    敲命令按以下顺序 ①vim filename ②e ③i ④ESC 移动光标 0 (零):将光标移动到行的起始处. $:将光标移动到行的末尾处. H:将光标移到当前窗口(而非全文)的第一行起始处. M ...

  9. C语言实现strlen函数的几种方法

    原文地址:http://www.51testing.com/html/72/n-221172.html 传说常见的一个笔试题:不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen ...

  10. Google's Machine Learning Crash Course #03# Reducing Loss

    Goal of training a model is to find a set of weights and biases that have low loss, on average, acro ...