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

引言

随着·····

概述

基于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. VB.net 与线程

    Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1 ...

  2. JAVA如何调用mysql写的存储过程

    存储过程是干什么的,自己百度,百度上讲的比我讲的好.为什么要用存储过程,这样可以提高效率.废话少说,直接上代码: 首先说一下语法:在mysql中写存储过程 DELIMITER $$ CREATE /* ...

  3. promise-async-await

    通常而言,这3个关键字 都是用来「优雅」的处理ajax异步请求的 //es6的时候promise诞生,很好的解决了嵌套回调地狱,改良方案为链式回调. // es2017的时候诞生了async.awai ...

  4. Object-C-复制

    copy 减少对象上下文依赖 copy 创建一个新对象,copy得到的副本对象与原来内容相同,新的对象retain为1,与旧有对象的引用计数无关,旧有对象没有变化 使用 copy 创建出来的对象是不可 ...

  5. Js基础知识4-函数的三种创建、四种调用(及关于new function()的解释)

    在js中,函数本身属于对象的一种,因此可以定义.赋值,作为对象的属性或者成为其他函数的参数.函数名只是函数这个对象类的引用. 函数定义 // 函数的三种创建方法(定义方式) function one( ...

  6. CPU负载过高异常排查实践与总结

    昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续在70%以上,看起来像是硬件资源到瓶颈需要扩容了,但仔细思考就会发现咱们的业务系统并不是一个高并 ...

  7. sp3485推荐电路(转)

    源: sp3485推荐电路 注意:转自电子发烧友 转:485通信自动收发电路 转: RS485收发的3种典型电路-重点-自动收发电路

  8. nginx做http向https的自动跳转

    在访问百度时,在浏览器输入www.baidu.com会自动跳转到https://www.baidu.com不用人工干预,nginx也可以做这样的自动跳转! 首先让nginx服务器监听两个端口,分别是8 ...

  9. bzoj1639 / P2884 [USACO07MAR]每月的费用Monthly Expense

    P2884 [USACO07MAR]每月的费用Monthly Expense 二分经典题 二分每个段的限制花费,顺便统计下最大段 注意可以分空段 #include<iostream> #i ...

  10. P2503 [HAOI2006]均分数据

    P2503 [HAOI2006]均分数据 模拟退火+dp (不得不说,我今天欧气爆棚) 随机出1个数列,然后跑一遍dp统计 #include<iostream> #include<c ...