基于osgEarth的卫星瞬时覆盖绘制方法


一、问题提出

卫星是空间态势中的重要对象,在空间态势中不仅要表现卫星的位置、轨道信息,还需要表现卫星的覆盖能力。

表现卫星覆盖包括2个问题:卫星探测在空间的形状,在场景中一般采用具有一定透明度的几何体表示;卫星在地球表面形成的覆盖范围,用离散的线集表示。

如在STK中,卫星可附着sensor对象,其覆盖形状可为简单圆锥、四棱锥、SAR等。sensor的设置非常灵活,可以与卫星存在各种位置关系,而不是一定在卫星坐标系原点。同时当这些sensor的形状超出地球表面范围时,可以仍然只显示相交区域。

OSG本身是既支持预设的多种几何形状,也可以直接构造primitiveset,如以三角形扇表示圆锥。我们希望获得如下图所示的绘制效果。

在这里插入图片描述
但如果不进行任何处理直接以三角形扇绘制,则随着视点位置的改变,表示覆盖的透明区域会出现下图所示的情况。
在这里插入图片描述
圆锥中出现了部分重复绘制的部分,即透明绘制是不稳定的。究其原因,是透明覆盖本身是存在先后关系的,圆锥是由多个三角形表示的,在不进行任何处理的情况下其绘制顺序固定。如果靠近视点一侧的三角形都先于远离视点一侧三角形,则远离一侧三角形在绘制时由于Z缓冲值已经小于当前值,所以不会绘制,形成理想的效果;否则,远离一侧的部分三角形先绘制完成后,靠近一侧三角形还会被绘制,形成上图效果。

需要指出的是,上述效果的出现前提是:绘制透明覆盖时不进行背面剔除(CULL_FACE)。如果进行背面剔除,那么通过控制三角形方向,对于简单圆锥形状的透明覆盖,是不会出现上述现象的。但如果是复杂的覆盖形状,仍会出现上述现象;同时,当视点进入覆盖内部的时候,应该可见的面不会绘制。

对于地表形成的覆盖区域边界,可以用LINE_LOOP表示,但如果直接表示,由于离散三角形与地表的交点构成的线段与表示地表的网格并不共面,因此会出现下图所示的消隐错误情况(显示不连贯、闪烁等),而且这是不能通过polygon_offset解决的(线与地球表面三角形并不共面)。当然,在计算时可以不是与地球表面求交,而是与地球上方如8km高程的椭球求交,那么可以避免消隐不正确,但是显然当视点靠近地表时其效果明显不好。
在这里插入图片描述


二、控制三角形扇的绘制顺序实现透明覆盖的稳定绘制

对于透明覆盖在不同视点时表现不稳定问题,应该可以通过shader解决,暂时还未尝试,现在介绍另外一种根据视点调整三角形扇绘制顺序的方法。

1.三角形扇数据生成

在这里插入图片描述
如图所示,根据卫星位置(严格来说是传感器位置,其原点可位于卫星坐标系中某点)、指向以及覆盖角度,采用离散的三角形扇表示覆盖锥形(如固定120个三角形或者间隔若干度形成一个三角形)。此时,需要计算离散后的圆锥与地球表面的交点,这些交点既用于表示三角形扇,也用于表示地表覆盖区域。虽然osgEarth支持地形数据,但如果与地形实时求交,其计算量过大。因此与地球椭球计算交点。交点计算通过矢量运算完成,代码如下

	CVector3D pos = _frame->getOrigin();
	osg::Vec3Array* va0 = dynamic_cast<osg::Vec3Array*>(_geometryPlane->getVertexArray());
	(*va)[0] = osg::Vec3(pos.x, pos.y, pos.z);
	osg::Vec3Array* va1 = dynamic_cast<osg::Vec3Array*>(_geometryLoop->getVertexArray());
	CVector3D xAxis = _frame->getAxisX();
	CVector3D yAxis = _frame->getAxisY();
	CVector3D zAxis = _frame->getAxisZ();
	double dis = 1000.0;
	double tmp = 1000.0*tan(_detectAngle* osg::PI / 180.0);
	for (int i = 0; i < discreteNum; i++){
   
   
		CVector3D p1 = pos + xAxis * tmp * _sincos[2 * i] + yAxis * tmp * _sincos[2 * i + 1] + zAxis * dis;
		CVector3D p;
		segInterEarth(pos, p1, p);
		(*va)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值