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

引言

随着·····

概述

基于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. iOS UI基础-4.1应用程序管理 字典转Model

    用模型取代字典 使用字典的坏处 一般情况下,设置数据和取出数据都使用“字符串类型的key”,编写这些key时,编辑器没有智能提示,需要手敲 dict[@"name"] = @&qu ...

  2. How To Join XLA_AE_HEADERS and RCV_TRANSACTIONS(子分类账到事务处理追溯)

    Applies to:   Oracle Inventory Management - Version: 12.0.6<max_ver> and later   [Release: 12 ...

  3. kafka监控工具之一--kafka-manager

    部署环境 jdk7 kafka_2.10-0.9.0.1 xshell4 rhel-server-6.5 kafka-manager 是功能比较多的kafka管控工具. 安装方法一 安装方法二 步骤一 ...

  4. Python 运算符与基本数据类型

    一.运算符 1.算数运算: 2.比较运算: 3.赋值运算: 4.逻辑运算: 5.成员运算: 二.基本数据类型 1.空(None) 表示该值是一个空对象,空值是Python里一个特殊的值,用None表示 ...

  5. python 用类方法和静态方法实现是追加写文件内容,和读指定行号的内容

    用类方法和静态方法实现:一个是追加写文件一行内容,一个是读指定行号的内容   #coding=utf-8   class handle_file(object):     def __init__(s ...

  6. html/jquery最实用功能与注意点

    获取某元素的父元素 通常用在根据被click的td获取tbody时. parent是指取得一个包含着所有匹配元素的唯一父元素的元素集合.parents则是取得一个包含着所有匹配元素的祖先元素的元素集合 ...

  7. C++设计模式 之 “接口隔离” 模式:Facade、Proxy、Mediator、Adapter

    “接口隔离”模式 在组建构建过程中,某些接口之间之间的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接(稳定)接口,来隔离本来相互紧密关联的接口是一种常见的解决方案. 典型模式 #Facad ...

  8. Ubuntu Linux系统环境变量配置文件

    Ubuntu Linux系统环境变量配置文件: /etc/profile : 在登录时,操作系统定制用户环境时使用的第一个文件 ,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. ...

  9. 探索Java8:(二)Function接口的使用

    Java8 添加了一个新的特性Function,顾名思义这一定是一个函数式的操作.我们知道Java8的最大特性就是函数式接口.所有标注了@FunctionalInterface注解的接口都是函数式接口 ...

  10. UESTC 594 我要长高 - 单调性优化

    韩父有N个儿子,分别是韩一,韩二…韩N.由于韩家演技功底深厚,加上他们间的密切配合,演出获得了巨大成功,票房甚至高达2000万.舟子是名很有威望的公知,可是他表面上两袖清风实则内心阴暗,看到韩家红红火 ...