当前位置: 首页 > news >正文

【Virtual Globe 渲染技术笔记】4 椭球面上的曲线

椭球面上的曲线

在虚拟地球中,经常需要在椭球面上连接两个端点。
如果直接用直线连接,路径会切入椭球内部(图 4.1(a)(a)(a))。更好的做法是用一系列采样点构造一条“贴”着椭球曲面前进的路径(图 4.1 (b)(b)(b)(c)(c)(c))。
在这里插入图片描述

常见曲线类型

  • 大地线(geodesic):两点间最短路径。
  • 等角航线(rhumb line):方位角恒定;虽非最短,却因导航简便而广泛使用。

本节介绍一种简单方法:用平面与椭球面相交来生成曲线(图 4.2(a))。
在球面上,过球心的平面与球面相交得大圆,其短弧即为最短路径。类似地,对接近球形的椭球(如地球扁球),只要端点相距不远,用此法得到的曲线已足够用于渲染。
在这里插入图片描述

算法步骤

给定端点 p,q\mathbf p,\mathbf qp,q、角度粒度 γ\gammaγ、椭球 (a,b,c)(a,b,c)(a,b,c),计算一条以 γ\gammaγ 为角间距的采样路径。
如图 4.2(c–e),γ\gammaγ 越小,采样越密,曲线越平滑。

注:除 γ→0\gamma\to 0γ0 极限外,线段仍会轻微切入椭球;后续章节将给出一种深度测试策略,使线段仍能被正确绘制。

  1. 求平面法向量
    p~=p−0,q~=q−0,m=p~×q~,n^=m∥m∥ \tilde{\mathbf p}= \mathbf p-0,\quad \tilde{\mathbf q}= \mathbf q-0,\quad \mathbf m=\tilde{\mathbf p}\times\tilde{\mathbf q},\quad \hat{\mathbf n}=\frac{\mathbf m}{\|\mathbf m\|} p~=p0,q~=q0,m=p~×q~,n^=mm

  2. 计算端点夹角
    p^=p~∥p~∥,q^=q~∥q~∥,θ=arccos⁡(p^⋅q^) \hat{\mathbf p}= \frac{\tilde{\mathbf p}}{\|\tilde{\mathbf p}\|},\quad \hat{\mathbf q}= \frac{\tilde{\mathbf q}}{\|\tilde{\mathbf q}\|},\quad \theta=\arccos(\hat{\mathbf p}\cdot\hat{\mathbf q}) p^=p~p~,q^=q~q~,θ=arccos(p^q^)

  3. 采样点数
    n=⌊θγ⌋−1,s=max⁡(n,0) n=\left\lfloor\frac{\theta}{\gamma}\right\rfloor-1,\quad s=\max(n,0) n=γθ1,s=max(n,0)

  4. 生成采样点
    对每个 i=0,1,…,si=0,1,\dots,si=0,1,,s,取
    ϕi=iγ \phi_i = i\gamma ϕi=
    p~\tilde{\mathbf p}p~n^\hat{\mathbf n}n^ 旋转 ϕi\phi_iϕivi\mathbf v_ivi,再用地心缩放vi\mathbf v_ivi 缩放到椭球面上,即得第 iii 个采样点。
    (使用地心缩放而非大地缩放,可确保点仍在原平面内,从而落在期望曲线上。)


思考题
如果不用角度粒度和绕法向量旋转,而是直接对端点做线性插值得到一组点,再对每点调用 scaleToGeocentricSurface,有何优缺点?

  • 优点

    • 实现更简单;
    • 采样点在三维空间均匀分布。
  • 缺点

    • 插值点不一定共面,生成的曲线可能偏离期望平面;
    • 在椭球高曲率区域,路径可能出现明显扭曲;
    • 均匀线性插值在椭球表面上的角距不均匀,导致视觉密度不一致。
http://www.dtcms.com/a/330036.html

相关文章:

  • 大数据可视化设计 | 智能家居 UI 设计:从落地方法到案例拆解
  • 室外 3DVG 基准
  • mysql - 查询重复数据,不区分大小重复问题解决
  • Redis的基础命令
  • 玳瑁的嵌入式日记D17-08013(linux)
  • Java多线程进阶-从乐观锁到读写锁
  • 项目可手撕题目详解
  • 【数字孪生系列】数字孪生引擎中的地标建筑管理系统
  • rar压缩包python解压
  • Go语言网络故障诊断与调试技巧:从入门到实战
  • AMD KFD的BO设计分析系列 0:开篇
  • redis分布式锁封装 redis分布式锁实现 封装Spring工具Redis工具类 redis操作类封装 redis锁封装 redis分布式锁封装
  • 【SpringBoot系列-02】自动配置机制源码剖析
  • Promise.all使用
  • 嵌入式Linux中的OpenWrt 是指什么
  • python类--python011
  • Python3解释器深度解析与实战教程:从源码到性能优化的全路径探索
  • O2OA:数字化转型中安全与效率的平衡之道
  • hadoop 前端yarn 8088端口查看任务执行情况
  • 华清远见25072班C语言学习day8
  • Spring学习笔记:基于注解的Sprig AOP配置的深入学习
  • ConstraintViolation是什么?
  • 架构设计原则与风格
  • 销售管理系统哪个好?14款软件深度对比
  • 【从网络基础到实战】理解TCP/IP协议体系的核心要点(包含ARP协议等其他协议介绍)
  • Flutter网络请求实战:Retrofit+Dio完美解决方案
  • 2025年前端组件库热度排行榜分析
  • 修复运动模糊的视频用什么软件?快速解决方案分享
  • 仓库无人叉车的安全功能有哪些?如何在提升效率时保障安全?
  • 制作一款打飞机游戏90:完结