WorldWind源码剖析系列:相机类[未完]

PluginSDK中的相机类CameraBase是三维计算机图形学中的概念。观察者在三维场景中漫游时,通过眼睛看到的场景和相机拍摄过程非常一致。实际上,Direct3D和OpenGL都是先通过对现实世界中的场景先进行世界变换,再通过设置观察矩阵以在场景中安置一个虚拟相机,构建一个视景体来裁剪场景的可见区域,然后在通过投影变换(平行投影或透视投影),获取三维场景的“像”,最后再通过视口变换,将场景的“像”光栅化输出到二维显示屏幕上。如下图所示。

在三维地形系统中,通常定义一个虚拟相机来实现对三维场景的漫游等功能。可以通过操纵虚拟相机来实现在虚拟场景中切换和漫游。这种方式实质上是通过不断改变虚拟相机的相关参数(如位置和朝向等),然后通过这些参数重新构造世界矩阵、观察矩阵或投影矩阵来完成场景漫游的。

相机类的类图如下。由CameraBase派生出WorldCamera类,再派生出MomentumCamera类。

其中,基类CameraBase主要成员有:地形高程、(所观察的)星球半径(单位为米)、相机所在经度角度_longitude、纬度角度_latitude、相机的朝向角度_heading、_tilt倾斜角度、_bank横滚角度、_distance眼睛到目标的距离、_altitude相机到海平面的高度、四元数m_Orientation、视景体对象_viewFrustum、从星球设置参数获取的相机视场角,相机的_position向量。

同时设置相机的最小倾斜角度为0度,最大倾斜角度为85度。最小高度为10度,最大高度为无穷大。

m_ProjectionMatrix投影变换矩阵、m_ViewMatrix观察变换矩阵、m_WorldMatrix世界变换矩阵。viewRange可视范围角度,trueViewRange真实的可视范围角度,viewPort视口窗口结构体。lastStepZoomTickCount最后一步缩放计数器(与Environment.TickCount结合),cameraUpVector相机的向上向量,初始化默认为Point3d(0,0,1)。ReferenceCenter相机的参考中心,初始化默认为Point3d(0,0,0),lastResetTime最后的重置时间,DoubleTapDelay双Tap延迟。

m_absoluteViewMatrix、m_absoluteWorldMatrix、m_absoluteProjectionMatrix三个绝对矩阵不清楚与上面的三个相应矩阵有什么区别?还为它们定义了只读的属性AbsoluteViewMatrix、AbsoluteWorldMatrix、AbsoluteProjectionMatrix。

属性Altitude和TargetAltitude分别表示高出海平面的高度和经过移动后目标高出海平面的高度。

属性AltitudeAboveTerrain表示高出地表物体高程的高度。属性TerrainElevation用于设置或获取地表物体高程的高度。

属性Distance和TargetDistance分别表示到目标位置的距离和经过移动后到目标位置的距离。

ComputeDistance( double altitude, Angle tilt )用给定的相机高度和相机倾斜角计算距离。

方法ComputeAltitude( double distance, Angle tilt )的计算示意图如下所示。

方法ComputeTilt(_altitude, _distance) 的计算示意图如上所示。

ComputeAbsoluteMatrices()方法里面的矩阵我知道意义,但不太理解其运算的含义。为啥要那样运算?

虚方法Update(Device device)用相机新的世界矩阵、观察矩阵、投影矩阵更新当前场景,同时也更新了视景体的参数、可视范围角度,真实的可视范围角度和World.Settings中关于相机的参数。

虚方法Reset() 用于重置相机的参数。调用了虚方法SetPosition()。

虚方法PointGoto(double lat, double lon)设置相机位置。调用了虚方法SetPosition()。

虚方法SetPosition(double lat, double lon, double heading, double _altitude, double tilt, double bank)真正的被设计用来设置设置相机位置,有三种重载形式。

虚方法virtual void PickingRayIntersection(int screenX, int screenY,out Angle latitude,out Angle longitude)用给定的屏幕像素坐标计算对应位置的经度角度和纬度角度。用构造的向量Vector3 v1 = newVector3(screenX, screenY, Viewport. MinZ)和Vector3 v2 = newVector3(screenX, screenY, Viewport. MinZ)调用了Vector3. Unproject(object viewport, Matrix projection, Matrix view, Matrix world)方法拟向将一个向量从屏幕空间投影到目标空间。然后再用一元二次方程的判别式(Why?)决定经度角度和纬度角度的取值情况。如果判别式>0,则再通过方法MathEngine.CartesianToSphericalD()计算出点对象Point3d p1 = new Point3d(v1.X, v1.Y, v1.Z)和Point3d p2 = new Point3d(v2.X, v2.Y, v2.Z)所对应的球面坐标,最后调用Angle.FromRadians返回以度表示的经度角度和纬度角度。

虚方法ComputeProjectionMatrix(Viewport viewport)计算投影矩阵,用于将三维相机或观察空间坐标转换为二维的屏幕空间坐标。

虚方法RotationYawPitchRoll(Angle yaw, Angle pitch, Angle roll)使相机按照给定的航偏角yaw、倾斜角pitch和横滚角roll旋转,实际上是给相机的经度角度_longitude、纬度角度_latitude、相机的朝向角度_heading重新赋值。如下图所示。

虚方法ZoomStepped通过键盘或鼠标缩放场景。

虚方法Zoom(float percent)在目标距离方向上按指定的百分比缩放。

虚方法Pan(Angle lat, Angle lon)按指定的经、纬度偏移漫游场景。

方法Vector3 Project( Vector3 point ) 用于将世界空间中的三维点转换为二维的屏幕坐标。

静态方法static Angle[] getViewBoundingBox()以度为单位计算可见的外包围盒。

时间: 2024-10-14 00:28:42

WorldWind源码剖析系列:相机类[未完]的相关文章

WorldWind源码剖析系列:星球类World

星球类World代表通用的星球类,因为可能需要绘制除地球之外的其它星球,如月球.火星等.该类的类图如下. 需要说明的是,在WorldWind中星球球体的渲染和经纬网格的渲染时分别绘制的.经纬网格的渲染过程请参见文章<WorldWind源码剖析系列:星球经纬度格网的绘制>,是通过Form.OnPaint()函数激活.刷新和绘制的.星球球体的渲染过程请参见文章<WorldWind源码剖析系列:星球球体的加载与渲染>.而星球类World是绘制过程中从XML配置文件中读取参数构造的用来代表

WorldWind源码剖析系列:星球球体的加载与渲染

WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()依次作以下几个事情: 1.  使用System.Version在内部,读取软件版本信息,并格式化输出.我们在外面配置软件版本,“关于”部分中版本自动更改. 获取格式化版本号 // Establish the version number string used for user display, // such as the Splash and 

WorldWind源码剖析系列:影像存储类ImageStore

影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.该类的类图如下. 影像存储类基类ImageStore提供的主要字段.属性和方法简要描述如下: protected string     m_dataDirectory;//影像数据目录 protected double m_levelZeroTileSizeDegrees = 36; //金字塔影像的零级瓦片大

WorldWind源码剖析系列:设置类SettingsBase

PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类SettingsBase内嵌了枚举型LocationType,子类WorldSettings的定义文件中附带了定义了测量模式的枚举型. 父类SettingsBase主要是对设置文件相关的设置文件名.版本.路径.载入.保存等于文件处理相关的顶层抽象.主要是以XML文件保存的,采用.NET平台提供的XmlSerial

WorldWind源码剖析系列:表面影像类SurfaceImage

表面影像类SurfaceImage描述星球类(如地球)表面纹理影像.该类的类图如下. 表面影像类SurfaceImage包含的主要的字段.属性和方法如下: string m_ImageFilePath;//影像文件的路径 double m_North;//影像文件的北部边界 double m_South;//影像文件的南部边界 double m_West;//影像文件的西部边界 double m_East; //影像文件的东部边界 Texture m_Texture = null;//用影像文件

WorldWind源码剖析系列:星球表面渲染类WorldSurfaceRenderer

星球表面渲染类WorldSurfaceRenderer描述如何渲染星球类(如地球)表面影像纹理.该类的类图如下. 星球类World包含的主要的字段.属性和方法如下: public const int RenderSurfaceSize = 256;//定义渲染表面尺寸的常量 RenderToSurface m_Rts = null;//D3D定义的类型 const int m_NumberRootTilesHigh = 5;//根瓦片高度数,即纬度方向上划分的瓦片数.经度方向上划分的瓦片数为该值

WorldWind源码剖析系列:挂件类Widgets

WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D进行绘图和处理图标纹理影像等的操作,此处不再对各个类的主要的字段.属性和方法进行描述了.感兴趣的读者可以直接阅读源码.建议阅读源码之前读者应具备一定的DirectX3D开发基础. 挂件PictureBox类被WavingFlags.TimeController等插件引擎子类所引用. 挂件Button

WorldWind源码剖析系列:表面瓦片类SurfaceTile

表面瓦片类SurfaceTile描述星球类(如地球)表面纹理影像的瓦片模型.其类图如下. 表面瓦片类SurfaceTile包含的主要的字段.属性和方法如下: int m_Level;//该瓦片所属金字塔影像的层级 double m_North;//该瓦片北边界 double m_South; //该瓦片南边界 double m_West; //该瓦片西边界 double m_East; //该瓦片东边界 bool m_Initialized = false; //该瓦片是否已被初始化 Devic

WorldWind源码剖析系列:窗口定制控件类WorldWindow

在WorldWindow定制控件是从Control类派生出来的,需要自己操纵GDI+绘制所需要的界面效果,比较耗费精力(区别于用户控件UserControl,也叫组合控件,大多是对.NET工具箱提供的默认基础控件进行的组合和轻量级的改变,实现起来比较简单).为了明确定制控件Control和用户控件UserControl之间的体系关系,此处给出了Control类继承层次结构(源自MSDN): 在WorldWindow中星球球体的渲染和经纬网格的渲染时分别绘制的,星球由类World表示,经纬网格.