欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Cocosmos| 交互式三维无缝大宇宙模型

最编程 2024-03-17 13:55:22
...


儿时,您是否也曾抬头,仰望星空……被眼前那无边浩渺、广袤深邃、美轮美奂的景象而深深震撼……

作者和项目介绍

大家好,我是圣子,一名大厂码农,从事游戏和前端互动相关的开发工作多年,平时也算半个的天文爱好者。有多年的Cocos引擎使用经验。

一次偶然的机会,打算用个人业余时间写一个演示太阳系的网页端应用程序,无需下载,即点即看,作为社区技术分享。

由于源自个人爱好,不受内容边界的约束,想到哪写到哪。随着开发过程深入,此工程已逐渐发展成为一个实时的、精确的,覆盖整个宇宙尺度的可交互3D模型,并暂时取名为Cocosmos(使用 Cocos 引擎开发的 cosmos宇宙)。

圣子打算在未来将此过程中涉及到的部分游戏开发技术和经验分享给大家。

序章和规划概述

本章将作为这一列技术分享的先导章节,只涉及内容的介绍和部分重要技术点的概述,并不会展示代码和过多纠缠于实现细节。

圣子可能会在未来章节中详细的分享各处的内容,以下是初步规划的章节标题(但这并不代表最终的章节,随着后续开发,圣子亦会同步增删和修改其中的内容):

00. 序章(本篇)

01. 从咫尺蓝星到亿万光年

02. 从恒星一点到熠熠光辉

03. 从脚下地球到八大行星

04. 从坐标系统到轨迹方程

05. 从赫罗星谱到银河璀璨

06. 从近日星海到全天星座

07. 从流星一瞬到时光万年

08. 从层次细节到网格绘制

09. 从渲染排序到优化剔除

10. 从光线追踪到引力透镜

11. 规划中……

如果您也是个游戏行业从业者、天文爱好者、程序员或技术达人或任何对此篇内容感兴趣的朋友,请赶紧关注我吧,您的支持会是我莫大的动力。

也欢迎您为这个项目提出宝贵的建议或为我指正其中包含的错误。


Cocosmos

无缝大宇宙

层次模型

Cocosmos

谈及宇宙,大家都知道我们居住的地球属于太阳系,太阳系属于银河系。而太阳系内除了八大行星外还有什么?银河之上、银河之下又有什么?大多人就不甚了解了。

事实上我们的母恒星太阳只是银河系内约2千亿颗恒星中普通的一员,而银河系又只是宇宙中约2万亿个星系中普通的一员。如此庞大的天文数字是很难用语言形容的,因此将广袤的宇宙按照尺度模型划分分层渲染,有助于Cocosmos在内容上的的科学严谨性和场景资源的有效管控。

宇宙层次模型,点击查看大图

TIPS

    圣子将Cocosmos分为十个尺度,每个尺度的直径都是前者的3-4个数量级(1000~10000倍)。


Cocosmos实机截图:基于幂指数计算

注意上图中最右侧的标尺,随相机视野广度的变化。刻度单位从上到下逐渐增大:

km=公里、c=光秒(即真空光速)、AU=天文单位、LY=光年、kpc=千秒差距、mpc=百万秒差距、H0=哈勃直径。

TIPS

    圣子使用了两套数值系统:一套正常的科学计数用于实际显示和计算;另一套则只使用10的幂指数,用于无论多大的尺度下用户交互、镜头缩放等都能线性平滑地过渡。

无缝推拉

Cocosmos

Cocosmos可以从千米级别的视角,直接拖拽到整个可观测宇宙,这个过程是无缝衔接的。随视野的缩放,我们可以:聚焦于一颗具体的星球上,观察整个行星系统,查看太阳系下所有天体的运行,群星与星座,银河系的浩瀚的星海,密密麻麻的星系组成的群落,黑洞、超新星、超星系团以及如宇宙长城般庞然大物……

Cocosmos实机截图:土星和它的行星系统

Cocosmos实机截图:太阳和它的恒星系统

Cocosmos实机截图:银河系和它的棒旋结构

TIPS

潜在可见集(Potential Visible Set)思想是一种有效的场景优化手段:我们利用有效的场景层次划分,动态地预测和加载即将被渲染的场景物体,合理地释放和销毁远离当前尺度下的场景资源。

Cocosmos实机截图:超星系团和星际长城

Cocosmos实机截图:哈勃直径与宇宙极限

TIPS

视锥体裁剪(View Frustum Culling)是一个常见的预剔除手段,有趣的在我们的场景下这将十分高效。试想我们的多层相机规划(下文会提及,这将忽视相机剪裁面的设置影响),超大的场景使得星体只是一个点(无需考虑包围盒),这样一来裁剪算法只需要在投影坐标系下用两次点乘即可实现。

相对变换

Cocosmos

无缝视野缩放,意味着我们需要从最小的单个天体到哈勃直径(约为940亿光年或88,931,000,000,000,000,000,000公里),这时将跨越足足20多个数量级进行渲染。单纯将这些内容统一到世界坐标系下,浮点数的精表示是不可接受的。对此,我们将使用相对相机的渲染方式。

此方式是在CPU侧算出观察矩阵,再传递到GPU侧替代原世界矩阵参与计算,最后在相机空间下做投影变换。有些引擎已经内置了这种渲染管线,而我们也可以结合需求自行实现:圣子在为了权衡相机动画,最终决定世界空间只参与相对缩放和平移变换,主相机则在单位球上完成球面旋转变换。

Cocosmos中的相对变换图示

虽然我们能通过相对变换去往宇宙的任何地点,但是用户可*地第一人称漫游并不合理,其原因还是因为宇宙太广袤太空旷。

举例,即使镜头能以光速移动,用户从地球到达海王星还是需要拖拽屏幕足足242分钟!(事实是他大概率会迷失在深空中)

TIPS

除了通常使用的笛卡尔坐标系(Cartesian Coordinate System)外,球面极坐标系(Polar Coordinate Systems)也会经常被使用到。

比如,球面相机的位置描述:方位角+高度角+极半径;其次,我们几乎能获得的所有恒星数据都是通过赤经+赤纬+光年距来表示。

最后,直线而快速地抵达目标非常生硬且容易穿模。因此,在切换不同尺度目标的同时,辅予镜头轨迹变换动画是很有必要的。

例如,圣子在从行星A到行星B的视角切换过程中,相机会自动先拉起到一个合适太阳系“全景鸟瞰”位置上,再变速抵达目标位置。

Cocosmos实机截图:平滑地目标切换

Cocosmos中的镜头设置功能

TIPS

上一篇: 播客(Podcast)推荐列表和 Moon FM PC 版 [破解版] [入口

下一篇: 1 - 3ds Max Python API 入门