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

【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.xdnf.cn/news/17626.html

相关文章:

  • 线上Linux服务器被植入各种病毒的详细分析、处理、加固流程
  • 机器学习之TF-IDF文本关键词提取
  • EP1S20F484C6 Altera Stratix FPGA
  • imx6ull-驱动开发篇19——linux信号量实验
  • 鸿蒙开发资源导航与学习建议
  • 如何解决Unexpected token ‘<’, “<!doctype “… is not valid JSON 报错问题
  • 微服务ETCD服务注册和发现
  • LeetCode 2787.将一个数字表示成幂的和的方案数:经典01背包
  • Airtable 入门指南:从创建项目到基础数据分析与可视化
  • 渗透测试现已成为 CISO 战略的核心
  • 开疆智能Ethernet转ModbusTCP网关连接PAC3200电能表配置案例
  • 企业高性能web服务器(4)
  • 【运维进阶】Ansible 自动化
  • AI重构Java开发:飞算JavaAI如何实现效率与质量的双重突破?
  • 计算机网络摘星题库800题笔记 第6章 应用层
  • [Robotics_py] 机器人运动模型 | `update`函数 | 微积分矩阵
  • Visual Studio中VC++目录、C/C++和链接器配置的区别与最佳实践
  • 北京JAVA基础面试30天打卡08
  • 【问题解决】从Anaconda环境迁移到miniforge并在IDEA中完成环境配置
  • K8S学习---- Kubernetes 架构:从控制平面到工作节点的协作逻辑
  • Vue接口平台十三——测试记录
  • Git 撤回已推送到远程的最近push
  • 【数据结构入门】堆
  • NLP—词向量转换评论学习项目分析真实案例
  • 4.运算符
  • Docker命令及操作
  • imx6ull-驱动开发篇20——linux互斥体实验
  • 图解软件系统组成
  • 什么是iOS超级签名?为何它能解决企业签名的“掉签”难题?
  • 云原生高级---TOMCAT