Files
thejinchao.github.io/blog/2025/02/SPH004.html
T

42 lines
21 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="zh-CN" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-rc.24" />
<meta name="theme" content="VuePress Theme Hope 2.0.0-rc.94" />
<style>
:root {
--vp-c-bg: #fff;
}
[data-theme="dark"] {
--vp-c-bg: #1b1b1f;
}
html,
body {
background: var(--vp-c-bg);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":" SPH算法简介(四): 算法实现","image":["https://thejinchao.github.io/images/2014/08/sph_45.jpg"],"dateModified":"2025-08-31T08:33:30.000Z","author":[{"@type":"Person","name":"JinChao","url":"https://thecodeway.com"}]}</script><meta property="og:url" content="https://thejinchao.github.io/blog/2025/02/SPH004.html"><meta property="og:site_name" content="我的博客和笔记"><meta property="og:title" content=" SPH算法简介(四): 算法实现"><meta property="og:description" content="上几节,我们推导出一大推复杂无比的公式,似乎有点纸上谈兵,这节来点真的,写一个可以运行的SPH系统,下面就是SPH基本的运算流程 初始化粒子,为每个粒子赋上初始位置 根据公式3.7计算每个粒子的密度 根据公式3.10计算每个粒子的压强 根据公式3.18计算每个粒子的加速度 根据临界条件调整加速度 根据加速度计算每个粒子的速度变化 根据速度计算粒子位置的..."><meta property="og:type" content="article"><meta property="og:image" content="https://thejinchao.github.io/images/2014/08/sph_45.jpg"><meta property="og:locale" content="zh-CN"><meta property="og:updated_time" content="2025-08-31T08:33:30.000Z"><meta property="article:modified_time" content="2025-08-31T08:33:30.000Z"><title> SPH算法简介(四): 算法实现 | 我的博客和笔记</title><meta name="description" content="上几节,我们推导出一大推复杂无比的公式,似乎有点纸上谈兵,这节来点真的,写一个可以运行的SPH系统,下面就是SPH基本的运算流程 初始化粒子,为每个粒子赋上初始位置 根据公式3.7计算每个粒子的密度 根据公式3.10计算每个粒子的压强 根据公式3.18计算每个粒子的加速度 根据临界条件调整加速度 根据加速度计算每个粒子的速度变化 根据速度计算粒子位置的...">
<link rel="preload" href="/assets/style-DeGCDZm0.css" as="style"><link rel="stylesheet" href="/assets/style-DeGCDZm0.css">
<link rel="modulepreload" href="/assets/app-DkPs9iUo.js"><link rel="modulepreload" href="/assets/SPH004.html-C9HwaUMK.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper-DlAUqK2U.js">
<link rel="prefetch" href="/assets/about.html-D8ZEewqx.js" as="script"><link rel="prefetch" href="/assets/index.html-B3M5iyTc.js" as="script"><link rel="prefetch" href="/assets/index.html-Bea7Ljc1.js" as="script"><link rel="prefetch" href="/assets/index.html-7NgUIJQI.js" as="script"><link rel="prefetch" href="/assets/flip_coin.html-Dqb7yVXa.js" as="script"><link rel="prefetch" href="/assets/index.html-Bq5DBW64.js" as="script"><link rel="prefetch" href="/assets/mental_poker.html-upgIFQg-.js" as="script"><link rel="prefetch" href="/assets/rsa.html-C2MAz3q_.js" as="script"><link rel="prefetch" href="/assets/index.html-XSjkcFNM.js" as="script"><link rel="prefetch" href="/assets/index.html-BlLDa5wi.js" as="script"><link rel="prefetch" href="/assets/group.html-BlUxnrdB.js" as="script"><link rel="prefetch" href="/assets/index.html-Dwh4wjjI.js" as="script"><link rel="prefetch" href="/assets/number_theory_1.html-CCFBIDVc.js" as="script"><link rel="prefetch" href="/assets/number_theory_2.html-E_1t2N8D.js" as="script"><link rel="prefetch" href="/assets/number_theory_3.html-C7mKWaPe.js" as="script"><link rel="prefetch" href="/assets/probability.html-BMb2DoB6.js" as="script"><link rel="prefetch" href="/assets/symbol.html-D3F4QCvD.js" as="script"><link rel="prefetch" href="/assets/DH.html-DiwoCoT2.js" as="script"><link rel="prefetch" href="/assets/Ellipse.html-CICsz7N8.js" as="script"><link rel="prefetch" href="/assets/Fibonacci.html-DwNCRM9r.js" as="script"><link rel="prefetch" href="/assets/JPEG001.html-CYxZXTFd.js" as="script"><link rel="prefetch" href="/assets/JPEG002.html-vZLSAKIw.js" as="script"><link rel="prefetch" href="/assets/JPEG003.html-7k9cQbY0.js" as="script"><link rel="prefetch" href="/assets/JPEG004.html-DW3enIUW.js" as="script"><link rel="prefetch" href="/assets/JPEG005.html-X283q0WU.js" as="script"><link rel="prefetch" href="/assets/Martingle.html-DuzCTdr9.js" as="script"><link rel="prefetch" href="/assets/MentalPoker01.html-Bdim8zF8.js" as="script"><link rel="prefetch" href="/assets/MentalPoker02.html-BUMR90xg.js" as="script"><link rel="prefetch" href="/assets/RandRound.html-BUyJ1lJc.js" as="script"><link rel="prefetch" href="/assets/SPH001.html-bJMWk1Hs.js" as="script"><link rel="prefetch" href="/assets/SPH002.html-RDRFrjsP.js" as="script"><link rel="prefetch" href="/assets/SPH003.html-CXiZtz-k.js" as="script"><link rel="prefetch" href="/assets/SegmentCircle.html-DN0PC88v.js" as="script"><link rel="prefetch" href="/assets/BezierLine01.html-DSOurUee.js" as="script"><link rel="prefetch" href="/assets/BezierLine02.html-o6CA4gWl.js" as="script"><link rel="prefetch" href="/assets/index.html-vvgXTSoi.js" as="script"><link rel="prefetch" href="/assets/ibl_01.html-C0MMJ2Qi.js" as="script"><link rel="prefetch" href="/assets/ibl_02.html-CDJTuRsv.js" as="script"><link rel="prefetch" href="/assets/index.html-6kuE0ncx.js" as="script"><link rel="prefetch" href="/assets/index.html-C_mrng8z.js" as="script"><link rel="prefetch" href="/assets/math_01.html-zuecFNlw.js" as="script"><link rel="prefetch" href="/assets/math_02.html-iWb5l07C.js" as="script"><link rel="prefetch" href="/assets/math_03.html-xFITL_XP.js" as="script"><link rel="prefetch" href="/assets/transform_01.html-CksmrUHg.js" as="script"><link rel="prefetch" href="/assets/transform_02.html-1CVsioyX.js" as="script"><link rel="prefetch" href="/assets/transform_03.html-BAQ_NXXo.js" as="script"><link rel="prefetch" href="/assets/transform_04.html-ByAt1SaR.js" as="script"><link rel="prefetch" href="/assets/index.html-DuxyD8S5.js" as="script"><link rel="prefetch" href="/assets/raster01.html-BI35OP1h.js" as="script"><link rel="prefetch" href="/assets/raster02.html-Cbv1P85A.js" as="script"><link rel="prefetch" href="/assets/raster03.html-B5s3WYUL.js" as="script"><link rel="prefetch" href="/assets/function.html-Bm4MvBPx.js" as="script"><link rel="prefetch" href="/assets/grammar.html-CMgQ_iI7.js" as="script"><link rel="prefetch" href="/assets/helloworld.html-CgXNBpH7.js" as="script"><link rel="prefetch" href="/assets/index.html-Byg_N-Qq.js" as="script"><link rel="prefetch" href="/assets/object_and_class.html-DlE-spI2.js" as="script"><link rel="prefetch" href="/assets/BRDF.html-CtU43GcR.js" as="script"><link rel="prefetch" href="/assets/illumination_model_01.html-DI-AkNf4.js" as="script"><link rel="prefetch" href="/assets/luminosity.html-D22X8fHI.js" as="script"><link rel="prefetch" href="/assets/microfacets_1.html-NZvxM6qf.js" as="script"><link rel="prefetch" href="/assets/microfacets_2.html-xOlkk0AO.js" as="script"><link rel="prefetch" href="/assets/microfacets_3.html-Dc3XD-of.js" as="script"><link rel="prefetch" href="/assets/render_function_1.html-Mv-UHURo.js" as="script"><link rel="prefetch" href="/assets/404.html-CAmZAJ57.js" as="script"><link rel="prefetch" href="/assets/index.html-CODMUdzk.js" as="script"><link rel="prefetch" href="/assets/index.html-7RC8zQRd.js" as="script"><link rel="prefetch" href="/assets/index.html-Bg4xIDq3.js" as="script"><link rel="prefetch" href="/assets/index.html-Lt4dhVBQ.js" as="script"><link rel="prefetch" href="/assets/index.html-kNgjgymO.js" as="script"><link rel="prefetch" href="/assets/index.html-C5LW7NZm.js" as="script"><link rel="prefetch" href="/assets/index.html-DdK-CrSq.js" as="script"><link rel="prefetch" href="/assets/index.html-CadT90Og.js" as="script"><link rel="prefetch" href="/assets/photoswipe.esm-CKV1Bsxh.js" as="script">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><!--[--><div class="theme-container external-link-icon" vp-container><!--[--><header id="navbar" class="vp-navbar" vp-navbar><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><a class="route-link vp-brand" href="/" aria-label="带我回家"><img class="vp-nav-logo" src="/favicon.png" alt><!----><span class="vp-site-name hide-in-pad">我的博客和笔记</span></a><!--]--></div><div class="vp-navbar-center"><!--[--><nav class="vp-nav-links"><div class="vp-nav-item hide-in-mobile"><a class="route-link auto-link" href="/" aria-label="主页"><!--[--><iconify-icon class="vp-icon" icon="fa6-solid:house" sizing="height" height="1em"></iconify-icon><!--]-->主页<!----></a></div><div class="vp-nav-item hide-in-mobile"><a class="route-link route-link-active auto-link" href="/blog/" aria-label="文章"><!--[--><iconify-icon class="vp-icon" icon="fa6-solid:book" sizing="height" height="1em"></iconify-icon><!--]-->文章<!----></a></div><div class="vp-nav-item hide-in-mobile"><div class="vp-dropdown-wrapper"><button type="button" class="vp-dropdown-title" aria-label="开源项目"><!--[--><iconify-icon class="vp-icon" icon="fa6-solid:diagram-project" sizing="height" height="1em"></iconify-icon>开源项目<!--]--><span class="arrow"></span><ul class="vp-dropdown"><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/turbolink" aria-label="TurboLink" rel="noopener noreferrer" target="_blank"><!---->TurboLink<!----></a></li><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/TinyEncrypt" aria-label="TinyEncrypt" rel="noopener noreferrer" target="_blank"><!---->TinyEncrypt<!----></a></li><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/ue5-style-guide" aria-label="UnrealStyleGuide" rel="noopener noreferrer" target="_blank"><!---->UnrealStyleGuide<!----></a></li><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/AxTrace" aria-label="AxTrace" rel="noopener noreferrer" target="_blank"><!---->AxTrace<!----></a></li><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/cyclone" aria-label="Cyclone" rel="noopener noreferrer" target="_blank"><!---->Cyclone<!----></a></li></ul></button></div></div><div class="vp-nav-item hide-in-mobile"><div class="vp-dropdown-wrapper"><button type="button" class="vp-dropdown-title" aria-label="个人笔记"><!--[--><iconify-icon class="vp-icon" icon="fa6-solid:lightbulb" sizing="height" height="1em"></iconify-icon>个人笔记<!--]--><span class="arrow"></span><ul class="vp-dropdown"><li class="vp-dropdown-item"><a class="route-link auto-link" href="/note/math/" aria-label="数学相关"><!---->数学相关<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/note/graphics/" aria-label="图形学"><!---->图形学<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/note/cryptography/" aria-label="密码学"><!---->密码学<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/note/language/" aria-label="编程语言"><!---->编程语言<!----></a></li></ul></button></div></div><div class="vp-nav-item hide-in-mobile"><a class="route-link auto-link" href="/about.html" aria-label="关于"><!--[--><iconify-icon class="vp-icon" icon="fa6-solid:user-astronaut" sizing="height" height="1em"></iconify-icon><!--]-->关于<!----></a></div></nav><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!----><div class="vp-nav-item hide-in-mobile"><button type="button" class="vp-color-mode-switch" id="color-mode-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" name="auto" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" name="dark" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" name="light" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar" vp-sidebar><!----><ul class="vp-sidebar-links"><li><a class="route-link auto-link vp-sidebar-link" href="/" aria-label="主页"><!--[--><iconify-icon class="vp-icon" icon="fa6-solid:house" sizing="both" width="1em" height="1em"></iconify-icon><!--]-->主页<!----></a></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-header clickable active" type="button"><iconify-icon class="vp-icon" icon="fa6-solid:book" sizing="both" width="1em" height="1em"></iconify-icon><span class="vp-sidebar-title">我的文章</span><span class="vp-arrow down"></span></button><ul class="vp-sidebar-links"><li><section class="vp-sidebar-group"><button class="vp-sidebar-header clickable" type="button"><!----><span class="vp-sidebar-title">从抛币协议到智能合约</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-header clickable" type="button"><!----><span class="vp-sidebar-title">JPEG算法解密</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-header clickable active" type="button"><!----><span class="vp-sidebar-title">SPH算法简介</span><span class="vp-arrow down"></span></button><ul class="vp-sidebar-links"><li><a class="route-link auto-link vp-sidebar-link" href="/blog/2025/02/SPH001.html" aria-label="Part1"><!---->Part1<!----></a></li><li><a class="route-link auto-link vp-sidebar-link" href="/blog/2025/02/SPH002.html" aria-label="Part2"><!---->Part2<!----></a></li><li><a class="route-link auto-link vp-sidebar-link" href="/blog/2025/02/SPH003.html" aria-label="Part3"><!---->Part3<!----></a></li><li><a class="route-link route-link-active auto-link vp-sidebar-link active" href="/blog/2025/02/SPH004.html" aria-label="Part4"><!---->Part4<!----></a></li><li><a class="auto-link external-link vp-sidebar-link" href="https://github.com/thejinchao/fluid" aria-label="Github" rel="noopener noreferrer" target="_blank"><!---->Github<!----></a></li></ul></section></li><li><a class="route-link auto-link vp-sidebar-link" href="/blog/2025/02/Martingle.html" aria-label="赌博中的数学:Martingle策略"><!---->赌博中的数学:Martingle策略<!----></a></li><li><a class="route-link auto-link vp-sidebar-link" href="/blog/2025/02/RandRound.html" aria-label="如何生成一个随机的圆形"><!---->如何生成一个随机的圆形<!----></a></li><li><a class="route-link auto-link vp-sidebar-link" href="/blog/2025/02/DH.html" aria-label="一个简单的DH密钥协商算法的实现"><!---->一个简单的DH密钥协商算法的实现<!----></a></li><li><a class="route-link auto-link vp-sidebar-link" href="/blog/2025/02/SegmentCircle.html" aria-label="如何计算线段和圆的交点"><!---->如何计算线段和圆的交点<!----></a></li><li><a class="route-link auto-link vp-sidebar-link" href="/blog/2025/02/Ellipse.html" aria-label="一道数学趣题"><!---->一道数学趣题<!----></a></li><li><a class="route-link auto-link vp-sidebar-link" href="/blog/2025/02/Fibonacci.html" aria-label="斐波那契数列和1/89"><!---->斐波那契数列和1/89<!----></a></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-header clickable" type="button"><!----><span class="vp-sidebar-title">匀速贝塞尔曲线运动的实现</span><span class="vp-arrow end"></span></button><!----></section></li></ul></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-header clickable" type="button"><iconify-icon class="vp-icon" icon="fa6-solid:diagram-project" sizing="both" width="1em" height="1em"></iconify-icon><span class="vp-sidebar-title">开源项目</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-header clickable" type="button"><iconify-icon class="vp-icon" icon="fa6-solid:lightbulb" sizing="both" width="1em" height="1em"></iconify-icon><span class="vp-sidebar-title">学习笔记</span><span class="vp-arrow end"></span></button><!----></section></li></ul><!----></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><!----> SPH算法简介(四): 算法实现</h1><!----><hr></div><!----><div class="" vp-content><!----><div id="markdown-content"><p>上几节,我们推导出一大推复杂无比的公式,似乎有点纸上谈兵,这节来点真的,写一个可以运行的SPH系统,下面就是SPH基本的运算流程</p><ol><li>初始化粒子,为每个粒子赋上初始位置</li><li>根据公式3.7计算每个粒子的密度</li><li>根据公式3.10计算每个粒子的压强</li><li>根据公式3.18计算每个粒子的加速度</li><li>根据临界条件调整加速度</li><li>根据加速度计算每个粒子的速度变化</li><li>根据速度计算粒子位置的变化</li><li>绘制粒子</li><li>回到步骤2<br> 下面有个简单的示例程序,运行效果如下</li></ol><figure><img src="/images/2014/08/sph_45.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure><p>这个程序基本上没有怎么考虑效率,只是让系统跑起来,所以比较适合拿来对照公式学习,按照惯例,放出源代码和可执行程序<br> Github:<a href="https://github.com/thejinchao/fluid" target="_blank" rel="noopener noreferrer">https://github.com/thejinchao/fluid</a><br> 可执行程序下载: <a href="https://github.com/thejinchao/fluid/releases/download/v1.0/fluid_relase_x64.zip" target="_blank" rel="noopener noreferrer">fluid_relase_x64.zip</a>(132KB)<br> SPH还有很多细节值得讨论,比如表面张力、并行计算、构建网格、真实材质的水渲染等,这些部分我会抽时间再写一些东西出来介绍。</p></div><!----><!----><!----></div><footer class="vp-page-meta"><!----><div class="vp-meta-item git-info"><!----><!----></div></footer><nav class="vp-page-nav"><a class="route-link auto-link prev" href="/blog/2025/02/SPH003.html" aria-label="SPH算法简介(三): 光滑核函数"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><!---->SPH算法简介(三): 光滑核函数</div></a><!----></nav><!----><!----><!--]--></main><!--]--><footer class="vp-footer-wrapper" vp-footer><div class="vp-footer">使用 <a href="https://theme-hope.vuejs.press/zh/" target="_blank">VuePress Theme Hope</a> 主题 | <a href="https://beian.miit.gov.cn/" target="_blank">京ICP备16018986号-1</a></div><!----></footer></div><!--]--><!--]--><!--[--><!----><!--[--><!--]--><!--]--><!--]--></div>
<script type="module" src="/assets/app-DkPs9iUo.js" defer></script>
</body>
</html>