cesium 学习(七) HeadingPitchRoll

cesium 学习(七) HeadingPitchRoll

一、前言

  对于模型旋转变换、相机视角变换以及方向变换的处理操作,也就是改变heading、pitch、roll这三个的值。这三个值代表什么意思呢?接下来就专门介绍一下Cesium的HeadingPitchRoll。

二、HeadingPitchRoll

  HeadingPitchRoll其实也就是欧拉(Euler)角:

   

  机体坐标系与地面坐标系的关系是三个Euler角:yaw,pitch,roll,反应了飞机相对地面的姿态。也就是说Yaw对应的是Heading。(个人认为Cesium用作Heading来表示是非常好的,Heading头朝向,更形象理解这个角)

2.1 Heading值

  偏航角ψ(Heading)的值,是控制机体头的朝向位置,这个角的改变,也就是左右方向的改变。

2.2 Pitch值

  俯仰角的值,从上图来看是控制机体上下方向的改变,值为正是顺时针旋转;为负则相反。当然,这个是根据坐标轴来旋转的,要是进行了翻滚就不一定是上下旋转了;如果还将头朝向的方向看作前方,其实还是可以看作上下旋转的。

2.3 Roll值

  翻滚角,想象一下侧空翻,你就是那个侧空翻的人,假如你的头始终朝着前方看,然后进行侧空翻,翻滚完成也就是旋转了360度。

三、HeadingPitchRange

  从HeadingPitchRange的名字就可以看出和HeadingPitchRoll是类似的,没错他们的Headiing值、Pitch值所代表的意思是一样的,不一样的就是Range值。

3.1 Range值

  Range值所代表的是一个半径值,在cesium(五)那篇文章的加载动画模型已经用过了,如下:

   

  其实也就是锁定了相机距离目标的距离,这个在视角跟随中常用,跟随的时候这个半径值也是可变的。

四、模型旋转变换

  介绍了基础知识,然后可以应用一下,做了一个简单页面,控制模型的三个方向的旋转。

  核心代码如下:

 1 this.updateRotation = function (options) {
 2     if (!Cesium.defined(model)) return;
 3     var options = options ? options : {};
 4     //三轴旋转
 5     var xAxis = options.xAxis ? angletoradian(options.xAxis) : 0;
 6     var yAxis = options.yAxis ? angletoradian(options.yAxis) : 0;
 7     var zAxis = options.zAxis ? angletoradian(options.zAxis) : 0;
 8
 9     hpRoll.heading = zAxis;
10     hpRoll.roll = xAxis;
11     hpRoll.pitch = yAxis;
12     model.rotation = hpRoll;
13     postionVector = Cesium.Cartesian3.multiplyByScalar(Cesium.Cartesian3.UNIT_X, 0, new Cesium.Cartesian3());
14     position = Cesium.Matrix4.multiplyByPoint(model.modelMatrix, postionVector, position);
15     Cesium.Transforms.headingPitchRollToFixedFrame(position, hpRoll, Cesium.Ellipsoid.WGS84, fixedFrameTransform, model.modelMatrix);
16 };

  效果图:

 

五、总结

  虽然没有将HeadingPitchRoll的例子放上来,但其实使用时不难的。

  在空间变化中特别是三维空间,欧拉角的应用是非常广泛的,这里只是使用了Cesium.Transforms.headingPitchRollToFixedFrame来实现模型的旋转变换,其实还有位置移动、缩放比例等的变换,还可以增加颜色的改变,这里就不再多说了,慢慢来。

原文地址:https://www.cnblogs.com/CreateFree/p/11247284.html

时间: 2024-11-06 09:57:55

cesium 学习(七) HeadingPitchRoll的相关文章

springMVC3学习(七)--Interceptor拦截器

Spring为我们提供了:org.springframework.web.servlet.HandlerInterceptor接口, org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器, 实现这个接口或继承此类,能够很方便的实现自己的拦截器. 有下面三个方法: Action之前运行 public boolean preHandle(HttpServletRequest request, HttpServletR

Spark学习七:spark streaming与flume集成

Spark学习七:spark streaming与flume集成 标签(空格分隔): Spark 一,启动flume flume-conf.properties文件 agent002.sources = sources002 agent002.channels = channels002 agent002.sinks = sinks002 ## define sources agent002.sources.sources002.type = exec agent002.sources.sour

CorePlot学习七---坐标轴的详细分析

先看代码,有标注,很详细,看看是如何设定x.y轴的可视范围.移动范围.已经如何确定原点的位置的.还有就是如何固定坐标轴!!! //坐标轴的初始化 -(void)axesInit { // Setup plot space: 设置一屏内可显示的x,y量度范围 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)[xyGraph defaultPlotSpace]; plotSpace.delegate = self; plotSpace.allowsUser

cesium 学习(八) 基础绘制(点线面)

一.前言 对于一个地图GIS场景,绘制点.线.面属于是基础功能,无论是二维地图还是三维地图场景均是如此,尤其对于三维场景来说比二维应该是更加困难了些. 但是基础的简单绘制不用考虑太多,下面我们开始学习在Cesium的三维场景中如何进行基础绘制的实现. 二.使用原始Cesium的Entity方法绘制 Cesium中封装了几何对象的接口,也就是点.线.面.圆柱体.长方体.圆锥体等等,还有特殊的几何对象:corridor.ellipse.ellipsoid:以及billboard和model.但这次主

tcl脚本学习七:if的学习

lesson 7 : if的学习 1. set x 1; if {$x == 2} {puts "$x is 2"} else {puts "$x is not 2"} if {$x != 1} { puts "$x is != 1" } else { puts "$x is 1" }//if的基本用法 2. if $x==1 {puts "GOT 1"}//可以if里面的判断语句可以不加括号 3. set

Android 学习笔记之AndBase框架学习(七) SlidingMenu滑动菜单的实现

PS:努力的往前飞..再累也无所谓.. 学习内容: 1.使用SlidingMenu实现滑动菜单..   SlidingMenu滑动菜单..滑动菜单在绝大多数app中也是存在的..非常的实用..Github有位牛人将这个东西书写成了一个简单的框架..我们只需要通过引用相关的资源就能够完成一个滑动菜单的实现..有了这一层的基础..那么滑动菜单就很容易实现了..就拿我们最为熟悉的QQ来说吧..当我们进行滑动操作的时候..会有一个新的View去覆盖原本的View..我们可以通过触发新的视图上的控件来执行

Android学习七:new Date使用

1.例子 学习时间函数,并实现了简单的多个按钮监听同一个事件的方法 2.代码 代码很简单,也很清晰 package com.example.datetime; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; import android.view.Menu;

Python学习(七) 杂学

无论windos还是Linux只要安装了python,配置好了环境变量,则在命令行输入python这个命令的时候就会进入交互模式.在这个模式下可以进行一些简单的python代码编写.退出可以使用exit()方法. Python程序是可以执行的,例如下面代码,保存在hello.py中,如果想要执行这个文件则可以执行命令python hello.py,那么将会输出Hello World. print 'Hello World' 另外,如果想让这个脚本成为可执行文件,则需要在这个文件头上添加 #!/u

[Java并发包学习七]解密ThreadLocal

概述 相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程访问资源时的共享问题.如果你也这样认为的,那现在给你10秒钟,清空之前对ThreadLocal的错误的认知! 看看JDK中的源码是怎么写的: This class provides thread-local variables. These variables differ from their norm