[WorldWind学习]5.相机对象

  首先查看WorldWindow的事件:OnMouseUp、OnMouseMove、HandleKeyDown,这几个方法中多次调用this.drawArgs.WorldCamera的各种属性实现了场景的控制,包括球的旋转、场景的放大缩小,上下移动。

  1. 接下来查看CameraBase类RotationYawPitchRoll虚函数:

 1 public virtual void RotationYawPitchRoll(Angle yaw, Angle pitch, Angle roll)
 2         {
 3         //    this._orientation *= MathEngine.EulerToQuaternion(yaw.Radians, pitch.Radians, roll.Radians);
 4         //    Vector3 v = MathEngine.QuaternionToEuler(this._orientation);
 5             
 6         //    if(!double.IsNaN(v.Y))
 7         //        this._latitude.Radians = v.Y;
 8         //    if(!double.IsNaN(v.X))
 9         //        this._longitude.Radians = v.X;
10         //    if(Math.Abs(roll.Radians)>Single.Epsilon)
11         //        this._heading.Radians = v.Z;
12 
13 
14             m_Orientation = Quaternion4d.EulerToQuaternion(yaw.Radians, pitch.Radians, roll.Radians) * m_Orientation;
15 
16             Point3d p = Quaternion4d.QuaternionToEuler(m_Orientation);
17             if(!double.IsNaN(p.Y))
18                 _latitude.Radians = p.Y;
19             if(!double.IsNaN(p.X))
20                 _longitude.Radians = p.X;
21             if(Math.Abs(roll.Radians) > double.Epsilon)
22                 _heading.Radians = p.Z;
23         }
RotationYawPitchRoll

  WorldCamera类的RotationYawPitchRoll方法:

 1 public override void RotationYawPitchRoll(Angle yaw, Angle pitch, Angle roll)
 2         {
 3             _targetOrientation = Quaternion4d.EulerToQuaternion(yaw.Radians, pitch.Radians, roll.Radians) * _targetOrientation;
 4             
 5             Point3d v = Quaternion4d.QuaternionToEuler(_targetOrientation);
 6             if(!double.IsNaN(v.Y))
 7                 this._targetLatitude.Radians = v.Y;
 8             if(!double.IsNaN(v.X))
 9                 this._targetLongitude.Radians = v.X;
10             if(Math.Abs(roll.Radians)>double.Epsilon)
11                 this._targetHeading.Radians = v.Z;
12         }
RotationYawPitchRoll

  MomentumCamera类的RotationYawPitchRoll方法:

 1 public override void RotationYawPitchRoll(Angle yaw, Angle pitch, Angle roll)
 2         {
 3             if(World.Settings.cameraHasMomentum)
 4             {
 5                 _latitudeMomentum += pitch/100;
 6                 _longitudeMomentum += yaw/100;
 7                 _headingMomentum += roll/100;
 8             }
 9 
10             this._targetOrientation = Quaternion4d.EulerToQuaternion( yaw.Radians, pitch.Radians, roll.Radians ) * _targetOrientation;
11             Point3d v = Quaternion4d.QuaternionToEuler(_targetOrientation);
12             if(!double.IsNaN(v.Y))
13             {
14                 this._targetLatitude.Radians = v.Y;
15                 this._targetLongitude.Radians = v.X;
16                 if(!World.Settings.cameraTwistLock)
17                     _targetHeading.Radians = v.Z;
18             }
19 
20             base.RotationYawPitchRoll(yaw,pitch,roll);
21         }
RotationYawPitchRoll

  2. CameraBase类的Pan方法:

 1 /// <summary>
 2         /// Pan the camera using delta values
 3         /// 平移相机,采用经纬度偏移量
 4         /// </summary>
 5         /// <param name="lat">Latitude offset</param>
 6         /// <param name="lon">Longitude offset</param>
 7         public virtual void Pan(Angle lat, Angle lon)
 8         {
 9             if(Angle.IsNaN(lat)) lat = this._latitude;
10             if(Angle.IsNaN(lon)) lon = this._longitude;
11             lat += _latitude;
12             lon += _longitude;
13 
14         //    this._orientation = MathEngine.EulerToQuaternion(
15         //        lon.Radians,
16         //        lat.Radians,
17         //        _heading.Radians);
18 
19             m_Orientation = Quaternion4d.EulerToQuaternion(
20                 lon.Radians, lat.Radians, _heading.Radians);
21 
22             Point3d p = Quaternion4d.QuaternionToEuler(m_Orientation);
23 
24         //    Vector3 v = MathEngine.QuaternionToEuler(this._orientation);
25         //    if(!double.IsNaN(v.Y))
26         //    {
27         //        this._latitude.Radians = v.Y;
28         //        this._longitude.Radians = v.X;
29         //    }
30 
31             if(!double.IsNaN(p.Y))
32             {
33                 _latitude.Radians = p.Y;
34                 _longitude.Radians = p.X;
35             }
36         }
Pan

  MomentumCamera类的Pan方法:

 1 public override void Pan(Angle lat, Angle lon)
 2         {
 3             if(World.Settings.cameraHasMomentum)
 4             {
 5                 _latitudeMomentum += lat/100;
 6                 _longitudeMomentum += lon/100;
 7             }
 8 
 9             if(Angle.IsNaN(lat)) lat = this._targetLatitude;
10             if(Angle.IsNaN(lon)) lon = this._targetLongitude;
11             lat += _targetLatitude;
12             lon += _targetLongitude;
13 
14             if(Math.Abs(lat.Radians)>Math.PI/2-1e-3)
15             {
16                 lat.Radians = Math.Sign(lat.Radians)*(Math.PI/2 - 1e-3);
17             }
18 
19             this._targetOrientation = Quaternion4d.EulerToQuaternion(
20                 lon.Radians,
21                 lat.Radians,
22                 _targetHeading.Radians);
23 
24             Point3d v = Quaternion4d.QuaternionToEuler(this._targetOrientation);
25             if(!double.IsNaN(v.Y))
26             {
27                 _targetLatitude.Radians = v.Y;
28                 _targetLongitude.Radians = v.X;
29                 _targetHeading.Radians = v.Z;
30 
31                 if(!World.Settings.cameraSmooth)
32                 {
33                     _latitude = _targetLatitude;
34                     _longitude = _targetLongitude;
35                     _heading = _targetHeading;
36                     m_Orientation = _targetOrientation;
37                 }
38             }
39         }
Pan

 

错误 1 无法注册程序集“F:\World_Wind_1.4.0_Source\HtmlEditor\bin\Debug\HtmlEditor.dll”- 拒绝访问。请确保您正在以管理员身份运行应用程序。对注册表项“HKEY_CLASSES_ROOT\onlyconnect.HtmlDialog”的访问被拒绝。 HtmlEditor

解决方法:HtmlEditor项目的属性,取消“生成(Build )”选项卡的为COM互操作注册

转载于:https://www.cnblogs.com/yhlx125/archive/2013/04/01/2987075.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中varchar(11)与int(11)的区别

结果&#xff1a; 对于varchar(11)&#xff1a;最多存储11个字符&#xff0c;超过则不存。 mysql> create table tt(c1 int primary key,c2 varchar(50))enginexxx; Query OK, 0 rows affected (0.15 sec)mysql> insert into tt values(1, aaaaaaaaaabbbbbbbbbbccccccc…

@Slf4j

注解Slf4j:&#xff08;当前日志为logback,其他日志框架不祥&#xff09; 直接使用log.xxxx("mothod is start") 例如&#xff1a;log.info("/returncode/add start"); 代替 如果不想每次都写 private final Logger logger LoggerFactory.getLog…

在VS2010开发的MVC3 应用程序中设定默认的浏览器

vs2010做mvc3 开发,用的是Razor的View,想修改默认浏览器,发现右键没有"浏览方式",把View改成.aspx的,也没有找到这个选项. 解决方法两种 (1)最简单的,建个Asp.net Web应用程序,在随便一个xxx.aspx页面,右键"浏览方式"即可.. (2)通过修改项目属性也可以,右键…

hdu 1161 Eddy's mistakes

http://acm.hdu.edu.cn/showproblem.php?pid1161 本题主要运用的就是大小写的转换&#xff1b; 我写的代码&#xff1a; #include<iostream>#include <string>#include <ctype.h>using namespace std;int main(int argc, char *argv[]){ string a; ch…

今年适合买房吗

本人是程序员&#xff0c;今天不聊程序相关的事情。不过今天有了点时间&#xff0c;考虑了下今年是否适合买房这件事。因为从中央到地方都在鼓励买房&#xff0c;每个人根据自己的实际情况决定是否要买房。 优点&#xff1a; (1)、房贷利率低&#xff0c;基本上是历史低点了 …

[18]Debian Linux Install GNU GCC Compiler and Development Environment

# apt-getinstall build-essential# gcc -v# make -v转载于:https://www.cnblogs.com/smartvessel/archive/2011/04/16/2018459.html

FireEye:2012年下半年高级威胁分析报告

最近&#xff0c;fireeye发布了2012年的高级威胁分析报告。根据对超过8900万获取的恶意代码事件进行分析&#xff0c;Fireeye认为&#xff1a; 1&#xff09;平均一个组织和单位每三分钟就会遭受一次恶意代码***&#xff0c;特指带有恶意附件、或者恶意WEB链接、或者CnC通讯的邮…

main()的参数argc与argv

C语言中的main()函数,一般会带有2个参数,例如int main (int argc, char* argv[]),这是一个典型的main函数的声明。 参数如下&#xff1a; argc: 整数, 为传给main()的命令行参数个数。 argv: 字符串数组。 在DOS 3.X 版本中, argv[0] 为程序运行的全路径…

数组中的forEach和map的区别

大多数情况下&#xff0c;我们都要对数组进行遍历&#xff0c;然后经常用到的两个方法就是forEach和map方法。先来说说它们的共同点 相同点 都是循环遍历数组中的每一项forEach和map方法里每次执行匿名函数都支持3个参数&#xff0c;参数分别是item&#xff08;当前每一项&…

1298 FORZA David Beckham

经典01背包问题&#xff0c;没有什么陷阱&#xff0c;唯一要求就是要优化空间复杂度&#xff01;下面是关于01背包的讲解&#xff1a; 01背包问题是最基础的背包问题&#xff0c;特点是&#xff1a;每种物品仅有一件&#xff0c;可以选择放或不放。用子问题定义状态&#xff1a…

android 获取lanucher 列表

引用&#xff1a;http://www.iteye.com/topic/696187 获取Launcher 启动列表 即 列出所有Launcher程序 通过PackageManager 来获取 [代码 步骤] 1. 定义内部类 LauncherItem 用于定义Application相关属性 比如&#xff1a;图标 名称 以及 ComponentName Java代码 public clas…

对int变量赋值的操作是原子的吗?

对于例子如下&#xff1a; int count 0; count; // 是原子操作吗? count; 是原子操作吗? 先说答案&#xff1a; 1、在单处理器下&#xff0c;如果将 count; 语句 翻译为单指令时&#xff0c;是原子操作。 不过现在处理器都会对语句进行优化。 2、在多处理器下&#xf…

信号量进程同步与互斥

2.哲学家吃面问题 semaphore fork[5]; for(int i0; i<5;i) fork[i]1; cobegin process philosopher_i( ){ while(ture){ think( ); P(fork[i]); P(fork[(i10%5])&#xff1b; eat&#xff08;&#xff09;&#xff1b; V(fork[i]); V(fork[(i10%5])&#xff1b; } } coend 5…

企业面试中关于MYSQL重点的28道面试题解答

问题1&#xff1a;char、varchar的区别是什么&#xff1f; varchar是变长而char的长度是固定的。如果你的内容是固定大小的&#xff0c;你会得到更好的性能。 问题2: TRUNCATE和DELETE的区别是什么&#xff1f; DELETE命令从一个表中删除某一行&#xff0c;或多行&#xff0c;T…

普通的int main(){}没有写return 0;会怎么样?

结论可能大家看上面的图就知道了&#xff0c;没有加return 0;编译器会自动添加一个。那怎么证明呢&#xff1f; 可以查看相应的汇编代码&#xff0c;查看汇编代码推荐使用godbolt.org网站&#xff0c;相当方便。 如上图&#xff0c;输入C代码&#xff0c;在右半部分会显示编译…

HDU1029

这道题没啥好说的&#xff0c;直接飘过…… #include<iostream>#include<map>using namespace std;int main(void){ int ans,n,b; while(cin>>n) { map<int,int>a; for(int i0;i<n;i) { cin>>b;//用cin就超时了&#xff0c;超1000ms(换…

python 内置方法 BUILT-IN METHODS

setattr getattr hasattr 1. abs() returns absolute value of a number 返回绝对值 integer -20 print(Absolute value of -20 is:, abs(integer)) 2. all() returns true when all elements in iterable is true 都为true则为true 3. any() Checks if any Element of an Ite…

ubuntu下安装拼音输入法ibus

可以安装ibus输入法。ibus有取代scim到趋势。 使用方法&#xff1a; 启用:ctrolspace&#xff1b; 中英文切换&#xff1a;shift&#xff1b;

并发与并行的区别

学习多线程的时候会遇到一个名词&#xff1a;并发。这是属于操作系统中的词汇&#xff0c;需要了解并发和并行的区别&#xff0c;从网上搜集了几种说法帮助理解。 一&#xff1a; 并发是指一个处理器同时处理多个任务。 并行是指多个处理器或者是多核的处理器同时处理多个不同的…

TI CC2480 -- Z-Accel介绍

德州仪器(TI)宣布推出最新Z-Accel系列2.4GHz ZigBee认证网络处理器中的首款产品——CC2480。该器件为工程师提供了完整ZigBee功能&#xff0c;而无需全面了解繁琐的全功能ZigBee协议栈&#xff0c;从而尽可能减少了开发工作量&#xff0c;并简化了ZigBee功能与各种应用的集成工…