webgl绘制太阳系行星动画

news/2024/11/23 0:24:20/

webgl模拟太阳系

demo: minicode——太阳系
文章同时发布于:我的个人网站。
webgl行星

这次做的MiniCode,是用webgl模拟太阳系的动画,绘制了太阳系和绕太阳旋转的八颗行星。各个部分的绘制方法我简要概述下。

1. 背景星空

这部分本来打算采用绘制天空盒的方式,绘制一个无边无际的宇宙的,由于我没有添加自动移动摄像机的功能,所以就简单的绘制了一张背景图片星空。

需要特别注意的是,绘制背景的时候,一定要预先关闭深度测试,绘制好星空背景后再开启深度测试,否则由于远近的关系,背景会遮住行星。

// ---space
spaceShader.useProgram();
gl.bindVertexArray(spaceVao);
gl.bindTexture(gl.TEXTURE_2D, backgroundTexture);
gl.disable(gl.DEPTH_TEST); // 禁用
gl.drawArrays(gl.TRIANGLES, 0, 6);
gl.enable(gl.DEPTH_TEST); // 开启

程序用用到的图片纹理可以在这里获得。

2.行星和太阳

这部分最难的是计算球体的顶点坐标,在opengl(webgl)中绘制一个曲面,本质上是通过划分成无限个三角形绘制的,只要划分的足够细,我们也就看不出来曲面其实并不是曲面。计算顶点坐标的大概思路如下:

  • 用多个经纬线划分地球。
  • 从上至下,用三角函数求每一圈经纬线相交的点。
  • 经过经纬线划分,此时球面被分割成很多很多的四边形。
  • 用上面求到的点,分别绘制每个四边形(每个四边形由两个三角形组成)。

基本算法如上,具体可以参考源码。

球面绘制的纹理,需要用到纹理坐标和纹理图片,至于球体的纹理坐标思路是通过UV Map计算的,计算过程也是在计算球体顶点坐标同时计算的。

还需要考虑太阳光照影响,所以需要计算球面每个三角形的顶点的法向量,因为每个绘制的三角形的顶点坐标已经计算了,所以使用向量的叉积很容易计算出法向量。

计算顶点坐标、顶点法向量和纹理坐标使用的是如下函数,可以在[这里]查看源码。

const getSpherePositions_drawTriangles = (splitCountH: number, splitCountV: number, radius: number) => {...return {vertices, normals, textureCoords};
};

函数的三个参数:

  • splitCountH: 分割球体的纬线数量(水平线)
  • splitCountV: 分割球体的经线数量(竖直线)
  • radius: 球体半径

3. 坐标变换

坐标变换,我在之前的文章已经介绍的足够详细了。想要了解可以在我的个人网站查找矩阵变换三篇文章和坐标系讲解的文章。

4. 附

github源码地址:https://github.com/pengfeiw/solar-system

(完)


http://www.ppmy.cn/news/649620.html

相关文章

苹果手机怎么拍星空_手机怎么拍摄星空?5分钟教你如何拍出璀璨星空

宇宙是个神秘的地方,在很小的时候小编就喜欢看着天文杂志,拿着天文望远镜在那遥望美丽的星空。许多小伙伴问小编,说手机能拍摄出很美的星空吗?小编的回答:当然!既然你们都问了这个问题,小编如果不教,就显得有些不近人情了。 下面我们就一起来看看如何拍摄我们头顶的璀璨…

special effects - 星空宇宙背景特效

星空宇宙背景特效 一. 效果图二. 实现代码 一. 效果图 二. 实现代码 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>星空宇宙背景特效</title><style>…

美轮美奂宇宙星空制作神器Spacescape

本文章由cartzhang编写&#xff0c;转载请注明出处。 所有权利保留。 文章链接&#xff1a;http://blog.csdn.net/cartzhang/article/details/46444569 作者&#xff1a;cartzhang 一、 简介 Spacescape 宇宙星空工具就是创建宇宙天空盒的工具&#xff0c;天空盒有星星和星…

用零知识证明连接多链宇宙

目录 一、前言 二、Bridges和Zero Knowledge Proofs 三、Succinct Verification of Proof of Consensus (Succinct Labs)

php代码授权和更新

数据表 应用表、 授权时长表、 应用版本表、 用户表 用户会员等级表 应用授权表、 应用订单表、 充值订单表、 提现表、 更新记录表、 下载记录表、 普通授权代码 基本信息 接口位置&#xff1a;/api/check/auth 参数提交方式为 POST\GET 参数1 $app 为客户端系统在授权系统…

【从零开始学习JAVA | 第二十五篇】泛型

目录 前言&#xff1a; 泛型&#xff1a; 额外拓展&#xff1a; 总结&#xff1a; 前言&#xff1a; 本文将详细介绍之前我们在JAVA 中一直在讲的泛型&#xff0c;各位感兴趣的同学可以点击进来观看。 泛型&#xff1a; 泛型是一种编程概念&#xff0c;它允许在定义类、接…

单片机与触摸屏通信c语言,讲述如何实现单片机与触摸屏的通信

随着触摸屏的应用和产量的增加,价格下降。因而有可能使用触摸屏作为单片机控制设备的键盘和显示装置,提高单片机控制设备的档次。触摸屏与PLC联合使用时,触摸屏的主要功能是: ①显示PLC输入,输出端13或辅助继电器的开关状态。 ②用触摸按键强制PLC输入,输出端口或辅助继电…

typec扩展坞hdmi没反应_Type-C转HDMI+USB+PD转接头手机连接电视图文教程疑难解答

本文为Type-C转HDMI+USB+PD扩展坞连接教程,手机投屏电视模式和电脑模式的图文说明,适用于Type-C接口支持视频功能的手机,如华为P30、华为P30 Pro、华为Mate20、华为Mate20 Pro、Mate10/Mate10 pro、华为P20、三星S8/S8+/S9/S9+、三星Note8、小米Air、联想小新 Air 13 i5 201…