译者注:本文翻译自Cesium官方博文《Computing the horizon occlusion point》,by KEVIN RING。

你厌倦了地平线剔除吗? 太好了,我也没有!

上一次,我们解释了地平线剔除是关于什么的,并展示了一种非常有效的方法来测试一个点是否被椭圆体遮挡。然而,我们想要测试遮挡的对象很少是简单的点。特别是,我们希望能够测试地形瓦片是否被椭球体遮挡。但是地形瓦片是由数千个顶点组成的复杂对象。

Deron Ohlarik在上一篇博客文章中谈到了此问题,他解释说,对于任何任意几何图形,我们都可以计算与几何图形有特殊关系的点的位置(我们称为水平遮挡点)。无论观察者从哪个方向接近几何体,该点都会同时或在几何体的任何部分变为可见之前对观察者可见。这正是我们所需要的!但是,如何计算这样的点的许多细节留给读者练习。此外,还不清楚这种方法是否可以推广到椭球而不是球体。该博客旨在填补这两个空白。

再次,这里介绍的技术完全归功于Frank Stoner。

让我们来看看我们的情况。和以前一样,我们通过将每个分量 X、Y和Z乘以沿该轴的椭球半径的倒数,将所有坐标转换到椭球尺度空间。

在此图中,地球以蓝色显示,地形图块以棕色显示。在尺度空间中,地球是一个单位球体。围绕地形图块的边界球的中心显示为点C。边界球不是缩放空间中的球体,但这与我们无关,因为我们将只使用它的中心。

首先,我们任意决定我们的地平线遮挡点将位于这条中心线OC的某个位置,OC是从地球中心到地形图块边界球中心的向量。我们只需要计算它沿该向量的距离。点V是地形图块中的一个顶点。点H是从V的角度看地平线上的一个点。从V的角度看,有无数个地平线点,在单位球面上形成一个圆,但这些地平线点中只有两个点通过V形成一个向量,或与中心线相交。一个显示为实线HP。另一个显示为连接到V为虚线。在虚线上,与中心线的交点出现在点V之前,所以它会比另一个交点更靠近椭球的中心,我们不需要关心它。如果点V是地形图块中的唯一顶点,那么此图中的点P将是我们的地平线遮挡点。对于多个顶点,我们对每个顶点重复 P 的计算,然后选择离椭圆体最远的那个。

那么我们如何计算给定地形瓦片顶点的P点呢?让我们标记下图中的各个角度。

在标记角α和β之后,通过简单的三角形角的知识,我们可以通过他们表达其他的角。

接下来,根据正弦定律:
∥OP⃗∥sin(90+β)=∥OV⃗∥sin(90−(α+β))\frac{\lVert \vec{OP} \rVert }{sin(90+β)} = \frac{\lVert \vec{OV} \rVert}{sin(90-(α+β))} sin(90+β)∥OP∥​=sin(90−(α+β))∥OV∥​

根据三角函数sin(90+θ)=cos(θ)sin(90+θ) = cos(θ)sin(90+θ)=cos(θ),有:
∥OP⃗∥cos(β)=∥OV⃗∥cos(α+β)\frac{\lVert \vec{OP} \rVert }{cos(β)} = \frac{\lVert \vec{OV} \rVert}{cos(α+β)} cos(β)∥OP∥​=cos(α+β)∥OV∥​

∥OP⃗∥=∥OV⃗∥cos(β)cos(α+β)\lVert \vec{OP} \rVert = \frac{\lVert \vec{OV} \rVert cos(β)}{cos(α+β)} ∥OP∥=cos(α+β)∥OV∥cos(β)​

β是直角三角形中的角,因此有:
cos(β)=∥OH⃗∥∥OV⃗∥=1∥OV⃗∥cos(β) = \frac{\lVert \vec{OH} \rVert}{\lVert \vec{OV} \rVert} = \frac{1}{\lVert \vec{OV} \rVert} cos(β)=∥OV∥∥OH∥​=∥OV∥1​

∥OP⃗∥=∥OV⃗∥1∥OV⃗∥cos(α+β)\lVert \vec{OP} \rVert = \frac{\lVert \vec{OV} \rVert \frac{1}{\lVert \vec{OV} \rVert}}{cos(α+β)} ∥OP∥=cos(α+β)∥OV∥∥OV∥1​​

∥OP⃗∥=1cos(α+β)\lVert \vec{OP} \rVert = \frac{1}{cos(α+β)} ∥OP∥=cos(α+β)1​

然后,我们使用复合角公式:
cos(α+β)=cos(α)cos(β)−sin(α)sin(β)cos(α+β) = cos(α)cos(β) - sin(α)sin(β) cos(α+β)=cos(α)cos(β)−sin(α)sin(β)

∥OP⃗∥=1cos(α)cos(β)−sin(α)sin(β)\lVert \vec{OP} \rVert = \frac{1}{cos(α)cos(β) - sin(α)sin(β)} ∥OP∥=cos(α)cos(β)−sin(α)sin(β)1​

我们已经知道如何去计算cos(β)cos(β)cos(β)。同样通过勾股定理,我们能计算sin(β)sin(β)sin(β):
sin(β)=∥HV⃗∥∥OV⃗∥sin(β) = \frac{\lVert \vec{HV} \rVert}{\lVert \vec{OV} \rVert} sin(β)=∥OV∥∥HV∥​
∥HV⃗∥=∥OV⃗∥2−∥OH⃗∥2=∥OV⃗∥2−1\lVert \vec{HV} \rVert = \sqrt{\lVert \vec{OV} \rVert^2-\lVert \vec{OH} \rVert^2} = \sqrt{\lVert \vec{OV} \rVert^2-1} ∥HV∥=∥OV∥2−∥OH∥2​=∥OV∥2−1​
sin(β)=∥OV⃗∥2−1∥OV⃗∥sin(β) = \frac{\sqrt{\lVert \vec{OV} \rVert^2-1}}{\lVert \vec{OV} \rVert} sin(β)=∥OV∥∥OV∥2−1​​

通过点积的定义,我们能够计算cos(α)cos(α)cos(α):
OV⃗⋅OP^=∥OV⃗∥cos(α)\vec{OV} \cdot \hat{OP} = \lVert \vec{OV} \rVert cos(α) OV⋅OP^=∥OV∥cos(α)

cos(α)=OV⃗⋅OP^∥OV⃗∥cos(α) = \frac { \vec{OV} \cdot \hat{OP} } {\lVert \vec{OV} \rVert} cos(α)=∥OV∥OV⋅OP^​

cos(α)=OV^⋅OP^cos(α) = \hat{OV} \cdot \hat{OP} cos(α)=OV^⋅OP^

最后,通过矢量叉积的模,我们能够计算sin(α)sin(α)sin(α):
∥OP^×OV⃗∥=∥OV⃗∥sin(α)\lVert \hat{OP} \times \vec{OV} \rVert = \lVert \vec{OV} \rVert sin(α) ∥OP^×OV∥=∥OV∥sin(α)

sin(α)=∥OP^×OV^∥sin(α) = \lVert \hat{OP} \times \hat{OV} \rVert sin(α)=∥OP^×OV^∥

通过以上的计算,我们就能够计算OPOPOP的模了。汇总如下:

cos(β)=1∥OV⃗∥cos(β) = \frac{1}{\lVert \vec{OV} \rVert} cos(β)=∥OV∥1​

sin(β)=∥OV⃗∥2−1∥OV⃗∥sin(β) = \frac{\sqrt{\lVert \vec{OV} \rVert^2-1}}{\lVert \vec{OV} \rVert} sin(β)=∥OV∥∥OV∥2−1​​

cos(α)=OV^⋅OP^cos(α) = \hat{OV} \cdot \hat{OP} cos(α)=OV^⋅OP^

sin(α)=∥OP^×OV^∥sin(α) = \lVert \hat{OP} \times \hat{OV} \rVert sin(α)=∥OP^×OV^∥

∥OP⃗∥=1cos(α)cos(β)−sin(α)sin(β)\lVert \vec{OP} \rVert = \frac{1}{cos(α)cos(β) - sin(α)sin(β)} ∥OP∥=cos(α)cos(β)−sin(α)sin(β)1​

请记住,我们通过构造了解OP^\hat{OP}OP^;我们选择它从椭圆体的中心指向地形图块的边界球体的中心。为了计算点P在椭球尺度空间中的位置,我们简单地将方向乘以上面计算的模。由于我们的遮挡测试使用缩放空间中表示的点,因此我们完成了。如果我们还想知道真实、未密封坐标中的位置,我们只需要将位置的每个分量乘以沿相应轴的椭球半径。

下面是 Cesium 中的代码,为了清晰起见略作调整:

function computeMagnitude(ellipsoid, position, scaledSpaceDirectionToPoint) {var scaledSpacePosition = ellipsoid.transformPositionToScaledSpace(position);var magnitudeSquared = scaledSpacePosition.magnitudeSquared();var magnitude = Math.sqrt(magnitudeSquared);var direction = scaledSpacePosition.divideByScalar(magnitude);// For the purpose of this computation, points below the ellipsoid// are considered to be on it instead.magnitudeSquared = Math.max(1.0, magnitudeSquared);magnitude = Math.max(1.0, magnitude);var cosAlpha = direction.dot(scaledSpaceDirectionToPoint);var sinAlpha = direction.cross(scaledSpaceDirectionToPoint).magnitude();var cosBeta = 1.0 / magnitude;var sinBeta = Math.sqrt(magnitudeSquared - 1.0) * cosBeta;return 1.0 / (cosAlpha * cosBeta - sinAlpha * sinBeta);
}

如您所见,此计算比我们上次描述的用于在地平线上测试该点的计算成本更高。可能可以通过使用前面描述的锥体测试测试每个顶点来优化它,并且如果发现顶点在锥体之外,则仅计算顶点的精确水平遮挡点。我将把它留给读者作为练习。

无论如何,这种计算的成本是它主要只适用于静态几何的主要原因。如果几何体相对于椭球体发生变化,则需要在每次变化时重复此计算。这可能会变得昂贵。

另外,在使用这种方法时,请记住一个重要的警告。在现实世界中,被WGS84椭球遮挡的物体不一定被地球的真实表面遮挡。这是因为地球表面实际上在世界部分地区略低于椭球体。根据您的应用,使用WGS84作为遮挡体积可能是可以接受的,或者您可能需要使用更保守的椭球。

Cesium中用到的图形技术——Computing the horizon occlusion point相关推荐

  1. Cesium中用到的图形技术——Horizon Culling

    译者注:本文翻译自Cesium官方博文<Horizon Culling>,by KEVIN RING. 文章目录 地平线针对球体剔除一个点 平面测试 圆锥测试 推广到椭球 代码 预览 在开 ...

  2. IGTA 2018-第十三届图像图形技术与应用学术会议

    为促进图象图形科学技术的繁荣和发展,为加速实现我国社会主义现代化,北京图象图形学学会主办的第十三届图像图形技术与应用学术会议(IGTA 2018)将于2018年4月8日-4月10日在北京航空航天大学召 ...

  3. 【Agni-s Philosophy】使用的图形技术解说(后篇)Volume渲染和粒子处理

    在2012年11月举办的[SQUARE ENIX 开放会议 2012]的第2天,进行了新世代游戏引擎[Luminous Studio]制作的实时技术演示作品[Agni's Philosophy]中使用 ...

  4. 三维图形在计算机如何存储,计算机三维图形技术.pdf

    计算机三维图形技术 杨德星 林晓磊 顾承珠 编著 王 颖 主审 内 容 简 介 本书以 A u toCAD 2004 为平台, 详细地介绍 了三维图形的基本 内容.全书分为 14 章, 主 要有 : ...

  5. 实时3D图形技术的进化历史2

    那么,在上次最后介绍的是可编程着色器架构(Programmable Shader Architecture),最早支持它的DirectX是2000年末发表的DirectX 8. 作为对应DirectX ...

  6. CSIG图像图形技术挑战赛重磅来袭!人体目标检测分赛道正式开放注册!

    点击蓝字 关注我们 "2021CSIG图像图形挑战赛-人体目标检测分赛道"是由中国图像图形学学会(CSIG)发起,由奥比中光3D视觉开发者社区与极市平台联合主办,于今日起正式全网开 ...

  7. 【西川善司的3D图形技术连载】GPU和Shader技术的基础知识(1~8回)

    本连载的主要目的,是介绍最新的PC和GAME所使用的最新3D图形技术的发展趋势. 暂时的方针是,首先是考虑介绍比较新的PC Game和PS3,XBOX360等新时代游戏机的游戏所采用的技术. 那么首先 ...

  8. 西川善司的3D图形技术概念和渲染管线的处理

    from: http://psv.tgbus.com/news/ynzx/201305/20130528094843.shtml 3D图形技术概念和渲染管线的处理 一:3D图形的概念 图1是3D图形的 ...

  9. [西川善司]3D图形技术概念和渲染管线的处理

    翻译 Trace校对&注解 千里马肝: http://www.opengpu.org/forum.php?mod=viewthread&tid=7376&extra=page% ...

最新文章

  1. 狄克斯特拉(Dijkstra)算法原理详细解释与实现(python)
  2. OpenCV线特征Line Features
  3. centos6.5下如何把python2.6.6升级到2.7
  4. Qt文档阅读笔记-QFuture官方解析及实例
  5. 全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<网关篇>
  6. 面试准备每日五题:C++(九)——vector、list、deque、priority_queue、mapset
  7. 通达信快捷功能键大全
  8. 通过尾注设置参考文献
  9. 相见恨晚的编程学习词典!谁还不是南极滑冰的那个崽儿?!
  10. 基于51单片机的555定时器测电容proteus仿真
  11. 什么是高质量的代码--整理的网上博文
  12. 系统运维工程师必备面试题库
  13. 新Word文档借用旧文档的部分样式
  14. 利用开区间覆盖的约简给出有限覆盖定理的一个新证明
  15. 【Vegas原创】HP惠普笔记本重装系统无法引导无法进操作系统的终极解决方法
  16. 使用Python操控手机微信app(最新教程)
  17. android11.0 Launcher3 高端定制之抽屉列表固定APP显示位置
  18. C++和C语言求解一个数的阶乘以及多个数的阶乘之和
  19. 如何从Linux下载一个文件到本地
  20. Refused to display ‘https://xxx.com.cn‘ in a frame because it set ‘X-Frame-Options‘ to ‘sameorigin‘

热门文章

  1. ios h5 长按放大镜效果关闭
  2. 新媒体运营面试如何一开口就让HR给你满分
  3. AI前线重磅出品:2017中国人工智能产业生态链研究报告
  4. 漫谈无文件恶意软件的发展历史
  5. 基于深度学习技术的电表大数据检测系统
  6. Unity网络(二)-Unity3D中的网络
  7. 手机php网站不显示图片,javascript,_手机页面用innerHTML拼接的图片不显示,javascript - phpStudy...
  8. 搜集的一些javascript小技巧!
  9. 全速前进! AI助力工业制造智能升级
  10. jatoolsPrinter打印