使用Python和Matplotlib模拟3D海浪动画

使用Python和Matplotlib模拟3D海浪动画

在计算机图形学和动画领域,模拟逼真的海洋表面一直是一个具有挑战性的问题。本文将介绍如何使用Python的Matplotlib库和Gerstner波浪模型,创建一个动态的3D海浪动画。通过叠加多个波浪,我们可以生成复杂而真实的海洋效果。

前言

Gerstner波浪模型是一种经典的海浪模拟方法,具有计算简单和效果逼真的特点。它通过对海面上的每个点施加正弦波的位移,来模拟波浪的起伏。本文将详细解释代码的实现过程,并提供可运行的示例代码。

环境准备

首先,确保您的环境中安装了以下库:

  • numpy
  • matplotlib

可以使用以下命令安装:

pip install numpy matplotlib

代码实现

1. 导入必要的库

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
  • numpy用于数值计算和数组操作。
  • matplotlib.pyplot用于绘制图形。
  • matplotlib.animation用于创建动画。

2. 设置海洋网格参数

nx, ny = 200, 200  # 网格大小
x = np.linspace(-10, 10, nx)
y = np.linspace(-10, 10, ny)
X, Y = np.meshgrid(x, y)
  • 创建一个二维网格,用于表示海洋表面的坐标点。
  • 网格越密集,生成的海浪细节越丰富。

3. 设置Gerstner波浪参数

wave_amplitude = 1.0     # 波浪振幅
wave_length = 5.0        # 波长
wave_speed = 1.0         # 波速
num_waves = 5            # 波浪数量
directions = np.linspace(0, 2 * np.pi, num_waves, endpoint=False)
phases = np.random.uniform(0, 2 * np.pi, num_waves)
  • num_waves决定了叠加多少个波浪,以增加海浪的复杂度。
  • directions定义了每个波浪的传播方向,均匀分布在0到2π之间。
  • phases为每个波浪生成一个随机的初始相位。

4. 创建图形和3D坐标轴

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
  • 创建一个图形窗口,并添加一个3D坐标轴用于绘制海浪表面。

5. 设置绘图参数

ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.set_zlim(-3, 3)
ax.set_xticks([])
ax.set_yticks([])
ax.set_zticks([])
ax.view_init(elev=30, azim=225)
  • 设置坐标轴的范围和视角。
  • 隐藏坐标轴的刻度,使图形更加简洁。

6. 定义动画更新函数

def animate(frame):ax.clear()Z = np.zeros_like(X)t = frame / 20.0  # 时间参数for i in range(num_waves):direction = directions[i]phase = phases[i]k = 2 * np.pi / wave_lengthomega = k * wave_speeddir_x = np.cos(direction)dir_y = np.sin(direction)phi = k * (dir_x * X + dir_y * Y) - omega * t + phaseZ += wave_amplitude / num_waves * np.cos(phi)surf = ax.plot_surface(X, Y, Z, cmap='Blues', linewidth=0, antialiased=True)ax.set_xlim(-10, 10)ax.set_ylim(-10, 10)ax.set_zlim(-3, 3)ax.set_xticks([])ax.set_yticks([])ax.set_zticks([])ax.view_init(elev=30, azim=225)return surf,
  • animate函数用于更新每一帧的图像。
  • t是时间参数,控制波浪的动态变化。
  • 在循环中,叠加多个Gerstner波浪。
  • 使用ax.plot_surface绘制3D海浪表面。

7. 创建动画

ani = animation.FuncAnimation(fig, animate, frames=200, interval=30, blit=False)
  • 使用FuncAnimation创建动画。
  • frames=200表示总共生成200帧。
  • interval=30表示每帧之间的间隔为30毫秒。

8. 显示动画

plt.show()
  • 显示生成的海浪动画。

运行效果

运行上述代码后,将会出现一个窗口,展示动态的3D海浪动画。波浪在不断地起伏,模拟了真实的海洋表面。由于叠加了多个不同方向和相位的波浪,海浪看起来更加复杂和逼真。
在这里插入图片描述下面是-gif动图
在这里插入图片描述

深入理解Gerstner波浪模型

Gerstner波浪模型通过对海面上的每个点施加位移,来模拟波浪的传播。对于二维情况下,海面上某一点的位移可以表示为:

Z = A cos ⁡ ( k x − ω t + ϕ ) Z = A \cos(kx - \omega t + \phi) Z=Acos(kxωt+ϕ)

  • ( A ):振幅
  • ( k ):波数,( k = \frac{2\pi}{\lambda} ),其中( \lambda )为波长
  • ( \omega ):角频率,( \omega = k \cdot c ),其中( c )为波速
  • ( \phi ):初始相位

在代码中,我们对多个波浪进行叠加,每个波浪具有不同的传播方向和初始相位。这使得海浪的形状更加复杂多变。

参数调整

您可以通过修改以下参数来改变海浪的效果:

  • wave_amplitude:增大振幅会使波浪更高。
  • wave_length:改变波长会影响波浪的密集程度。
  • wave_speed:改变波速会影响波浪传播的速度。
  • num_waves:增加波浪数量会使海浪更复杂。

例如,将波浪数量增加到10:

num_waves = 10

运行后,您会发现海浪的细节更加丰富。
完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D# 设置海洋网格参数
nx, ny = 200, 200  # 网格大小,值越大,细节越丰富
x = np.linspace(-10, 10, nx)
y = np.linspace(-10, 10, ny)
X, Y = np.meshgrid(x, y)# Gerstner波浪参数
wave_amplitude = 1.0     # 波浪振幅
wave_length = 5.0        # 波长
wave_speed = 1.0         # 波速
num_waves = 5            # 波浪数量,叠加多个波浪以增加复杂度
directions = np.linspace(0, 2 * np.pi, num_waves, endpoint=False)  # 波浪传播方向
phases = np.random.uniform(0, 2 * np.pi, num_waves)                # 随机初始相位# 创建图形和3D坐标轴
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')# 设置绘图参数
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.set_zlim(-3, 3)
ax.set_xticks([])
ax.set_yticks([])
ax.set_zticks([])
ax.view_init(elev=30, azim=225)  # 视角角度,可根据需要调整# 初始化海浪高度
Z = np.zeros_like(X)# 动画更新函数
def animate(frame):ax.clear()Z = np.zeros_like(X)t = frame / 20.0  # 时间参数,控制动画速度# 叠加多个Gerstner波浪for i in range(num_waves):direction = directions[i]phase = phases[i]k = 2 * np.pi / wave_length  # 波数omega = k * wave_speed       # 角频率# 波浪传播方向的单位向量dir_x = np.cos(direction)dir_y = np.sin(direction)# 计算偏移phi = k * (dir_x * X + dir_y * Y) - omega * t + phaseZ += wave_amplitude / num_waves * np.cos(phi)# 绘制海浪表面surf = ax.plot_surface(X, Y, Z, cmap='Blues', linewidth=0, antialiased=True)# 设置绘图参数ax.set_xlim(-10, 10)ax.set_ylim(-10, 10)ax.set_zlim(-3, 3)ax.set_xticks([])ax.set_yticks([])ax.set_zticks([])ax.view_init(elev=30, azim=225)return surf,# 创建动画
ani = animation.FuncAnimation(fig, animate, frames=200, interval=30, blit=False)# 显示动画
plt.show()

结论

本文介绍了如何使用Python和Matplotlib库,基于Gerstner波浪模型,创建一个动态的3D海浪动画。通过对代码的逐步讲解,相信您已经理解了其中的原理和实现方法。您可以尝试调整参数,甚至扩展代码,实现更多有趣的效果。

参考资料

  • Gerstner Waves on Wikipedia
  • Matplotlib 3D Surface Plot Documentation
  • NumPy Meshgrid Function

希望本文对您有所帮助,祝您在数据可视化和动画制作的道路上取得更多成果!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455653.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vim的使用方法

常见的命令可参考: Linux vi/vim | 菜鸟教程​www.runoob.com/linux/linux-vim.html​编辑https://link.zhihu.com/?targethttps%3A//www.runoob.com/linux/linux-vim.html 1. vim的工作模式 vi/vim 共分为三种模式,命令模式、编辑输入模式和末行&am…

高薪、高含金量、高性价比的“三高”证书——PMP证书

24年感觉什么都不好做,经济大环境也不太好,工作也卷,裁员降薪,为什么有的人没有危机,不降反增了呢?古语云往往越是危机的时候,越是机会多的时候,今天分享一个高薪、高含金量、高性 如…

关于写“查看IT设备详细信息”接口的理解

这两个星期一直在做关于IT资产管理相关的内容。这个内容大概就建立三张表,然后对三张表进行操作。一般情况下,对一张表也就那么几种操作:增删改查,导入导出。这里我说了6个操作,那就代表要写6个接口。这6个接口就是最常…

[Linux关键词]内建命令

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

Qt 二进制文件的读写

Qt 二进制文件的读写 开发工具:VS2013 QT5.8.0 实例功能概述 1、新建项目“sample7_2binFile” 完成以上步骤后,生成以下文件: 2、界面设计 如何添加资源文件: 鼠标双击“***.qrc”文件 弹出以下界面: 点击 “Add F…

【AI视频抠图整合包及教程】开启视觉分割新纪元 —— Meta SAM 2

在数字化时代,Meta公司推出的SAM 2(Segment Anything Model 2)标志着图像和视频分割技术的一个新高度。SAM 2不仅继承了前代SAM模型的卓越性能,更在实时处理、视频分割、交互式提示等方面实现了重大突破。以下是SAM 2的全面营销文…

075_基于springboot的万里学院摄影社团管理系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

502 错误码通常出现在什么场景?

服务器过载场景 高流量访问:当网站遇到突发的高流量情况,如热门产品促销活动、新闻热点事件导致网站访问量激增时,服务器可能会因承受过多请求而无法及时响应。例如,电商平台在 “双十一” 等购物节期间,大量用户同时…

[分享] SQL在线编辑工具(好用)

在线SQL编写工具(无广告) - 在线SQL编写工具 - Web SQL - SQL在线编辑格式化 - WGCLOUD

AI修图太牛了! | 换模特、换服装、换背景都如此简单!

前言 推荐一款我最近发现的AI工具,它就是最懂电商的千鹿AI,专门用来做电商产品图、场景图的,除此外还有AI修图、线稿上色、批量抠图等等超多图片处理工具。 本人也从事过电商行业,包括跨境电商,非常知道电商人的疾苦…

Java 多线程(七)—— 定时器

定时器介绍与使用 先简单介绍一下什么是定时器:定时器类似生活中的闹钟,当时间一到,我们就会去做某些事情。 在代码层面理解就是,当我们设置的时间一到,程序就会执行我们固定的代码片段(也就是任务&#x…

谷歌新安装包文件形式 .aab 在UE4中的打包原理

摘要 本文学习了aab的基本概念以及UE4中产生aab的构建原理。 从官网了解基本概念 官网:Android Developers 1、什么是aab? .aab包形如: 2021年7月,在Google Play应用程序中,已经有数千个应用程序率先跟进了AAB格式。…

OpenCV视觉分析之运动分析(2)背景减除类:BackgroundSubtractorKNN的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 K-最近邻(K-nearest neighbours, KNN)基于的背景/前景分割算法。 该类实现了如 319中所述的 K-最近邻背景减除。如果前景…

Zypher Network Layer3 主网上线,“宝藏方舟”活动是亮点

前言 随着 Zytron Layer3 主网的上线,Zypher Network联合Linea共同推出了“宝藏方舟”活动,用户可通过参与活动,获得包括代币、积分、SBT等系列奖励。 Zypher Network 是一个以ZK方案为核心的游戏底层堆栈,其提供了一个具备主权…

C++20中头文件span的使用

<span>是C20中新增加的头文件&#xff0c;此头文件是containers库的一部分。包括&#xff1a; 1.模板类std::span&#xff1a;连续对象序列的非拥有视图(view)。std::span可以具有static extent&#xff0c;在这种情况下&#xff0c;序列中的元素数量在编译时已知并以typ…

探寻医疗行业人力资源管理系统优选方案

医疗机构管理日益重要&#xff0c;ZohoPeople HRMS助力医疗行业优化人力管理&#xff0c;提升效率。其涵盖智能排班、培训发展、合规保障、绩效管理等功能&#xff0c;支持全球化及远程协作&#xff0c;是医疗行业人力资源管理的有效工具。 一、医疗行业人力资源管理的复杂性 …

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

15.正则化——防止过拟合的有效手段

引言 在人工智能(AI)领域&#xff0c;尤其是在机器学习和深度学习中&#xff0c;正则化(regularization)具有非常重要的地位。它不仅是训练模型过程中不可或缺的一部分&#xff0c;也是提高模型性能的关键因素之一。此外&#xff0c;正则化还可以提升模型的泛化能力&#xff0…

产品如何实现3D展示?具体步骤如下

产品实现3D展示主要依赖于先进的3D建模与展示技术。以下是产品实现3D展示的具体步骤和方法&#xff1a; 一、3D建模 使用专业的3D建模软件&#xff0c;如Blender、Maya、3ds Max等&#xff0c;这些软件提供了丰富的建模工具和材质编辑器&#xff0c;能够创建出高精度的3D模型…

Flutter 12 实现双击屏幕显示点赞爱心多种动画(AnimationIcon)效果

本文主要是使用Flutter封装一个双击屏幕显示点赞爱心UI效果&#xff0c;并实现了爱心Icon 透明度、缩放、旋转、渐变等动画效果。 实现效果&#xff1a; 实现逻辑&#xff1a; 1、封装FavoriteGesture&#xff08;爱心手势&#xff09;实现双击屏幕显示爱心Icon&#xff1b; …