[WorldWind学习]5.相机对象
1.[WorldWind学习]1.接触WorldWind项目2.[WorldWind学习]2.WorldWindow控件3.[WorldWind学习]3.Device对象4.[WorldWind学习]4.DrawArgs对象
5.[WorldWind学习]5.相机对象
6.[WorldWind学习]6.World类7.[WorldWind学习]7.RenderableObject对象8.[WorldWind学习]8.Cache对象9.[WorldWind学习]9.WW的屏幕坐标到经纬度坐标计算10.[WorldWind学习]10.插件结构11.[WorldWind学习]11.TerrainViewer插件和双线程12.[WorldWind学习]12.WavingFlags和WavingFlagLayer13.[WorldWind学习]13.日志类Log14.[WorldWind学习]14.ConfigurationLoader类15.[WorldWind学习]15.模型加载16.[WorldWind学习]16.Lod技术(1)17.[WorldWind学习]17.视域调度(视域体裁剪)18.[转载]WorldWind实时确定、更新、初始化和渲染地形和纹理数据19.[WorldWind学习]18.High-Performance Timer in C#20.[WorldWind学习]19.WebDownload21.[WorldWind学习]20.修改ShapeFileLayer类及托管D3D文字绘制方法22.[World Wind学习]21.影像切割23.[World Wind学习]22.相机高度和瓦片等级计算24.[WorldWind学习]23.TerrainAccessor首先查看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 }
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 }
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 }
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 }
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 }
错误 1 无法注册程序集“F:\World_Wind_1.4.0_Source\HtmlEditor\bin\Debug\HtmlEditor.dll”- 拒绝访问。请确保您正在以管理员身份运行应用程序。对注册表项“HKEY_CLASSES_ROOT\onlyconnect.HtmlDialog”的访问被拒绝。 HtmlEditor
解决方法:HtmlEditor项目的属性,取消“生成(Build )”选项卡的为COM互操作注册
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2012-04-01 编译一个OpenGL项目(C语言)