<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>高级物理引擎实战指南笔记 on 清雨影的Blog</title><link>http://blog.tsingjyujing.com/game201/</link><description>Recent content in 高级物理引擎实战指南笔记 on 清雨影的Blog</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sat, 25 Jul 2020 00:00:00 +0900</lastBuildDate><atom:link href="http://blog.tsingjyujing.com/game201/index.xml" rel="self" type="application/rss+xml"/><item><title>专题：线性方程组求解</title><link>http://blog.tsingjyujing.com/game201/linear_eq_solver/</link><pubDate>Sat, 25 Jul 2020 00:00:00 +0900</pubDate><guid>http://blog.tsingjyujing.com/game201/linear_eq_solver/</guid><description>&lt;h1 id="专题线性方程组求解"&gt;专题：线性方程组求解&lt;a class="anchor" href="#%e4%b8%93%e9%a2%98%e7%ba%bf%e6%80%a7%e6%96%b9%e7%a8%8b%e7%bb%84%e6%b1%82%e8%a7%a3"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="简介"&gt;简介&lt;a class="anchor" href="#%e7%ae%80%e4%bb%8b"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;这里完整介绍一些求 &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="bold"&gt;A&lt;/mi&gt;&lt;mover accent="true"&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mover accent="true"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\bold{A}\vec{x}=\vec{b}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.714em;"&gt;&lt;/span&gt;&lt;span class="mord mathbf"&gt;A&lt;/span&gt;&lt;span class="mord katex-accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2077em;"&gt;&lt;span class="katex-overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5&#10;3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11&#10;10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63&#10;-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1&#10;-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59&#10;H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359&#10;c-16-25.333-24-45-24-59z"/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.9774em;"&gt;&lt;/span&gt;&lt;span class="mord katex-accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9774em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.2634em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="katex-overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5&#10;3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11&#10;10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63&#10;-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1&#10;-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59&#10;H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359&#10;c-16-25.333-24-45-24-59z"/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;link rel="stylesheet" href="http://blog.tsingjyujing.com/katex/katex.min.css" /&gt; 的方法，特点是A矩阵的规模比较大。 正常来说，求解线性方程组可以通过求逆矩阵，高斯消元，克拉默法则（&lt;del&gt;大学线代第一节课就学这个没用的东西，不会真的有人用吧，不会吧不会吧&lt;/del&gt;）等等方式去求解。 但是A很大的时候这个方法就失效了，这个时候一般用迭代法，本文以介绍迭代法为主。&lt;/p&gt;</description></item><item><title>弹簧质点系统</title><link>http://blog.tsingjyujing.com/game201/mass_spring/</link><pubDate>Fri, 24 Jul 2020 00:00:00 +0900</pubDate><guid>http://blog.tsingjyujing.com/game201/mass_spring/</guid><description>&lt;h1 id="弹簧质点系统"&gt;弹簧质点系统&lt;a class="anchor" href="#%e5%bc%b9%e7%b0%a7%e8%b4%a8%e7%82%b9%e7%b3%bb%e7%bb%9f"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="受力分析"&gt;受力分析&lt;a class="anchor" href="#%e5%8f%97%e5%8a%9b%e5%88%86%e6%9e%90"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;弹簧质点系统遵循胡克定律和牛顿运动定律：&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="2020-07-19-20-03-31.png" alt="" /&gt;&lt;/p&gt;&#10;&lt;p&gt;并不复杂（当然需要考虑重力）。&lt;/p&gt;&#10;&lt;h2 id="时间积分"&gt;时间积分&lt;a class="anchor" href="#%e6%97%b6%e9%97%b4%e7%a7%af%e5%88%86"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="2020-07-19-20-05-20.png" alt="" /&gt;&lt;/p&gt;&#10;&lt;h3 id="前向欧拉"&gt;前向欧拉&lt;a class="anchor" href="#%e5%89%8d%e5%90%91%e6%ac%a7%e6%8b%89"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;通过当前的状态推测下一步的状态&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;通过当前的受力分析计算加速度，推断下一步的速度（ &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;δ&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\times \delta t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.7778em;vertical-align:-0.0833em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;×&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.0379em;"&gt;δ&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;link rel="stylesheet" href="http://blog.tsingjyujing.com/katex/katex.min.css" /&gt; ）&lt;/li&gt;&#10;&lt;li&gt;通过当前的速度计算下一步的位移&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="半隐式欧拉-aka-symplectic-euler-对偶欧拉"&gt;半隐式欧拉 （AKA. Symplectic Euler 对偶欧拉）&lt;a class="anchor" href="#%e5%8d%8a%e9%9a%90%e5%bc%8f%e6%ac%a7%e6%8b%89-aka-symplectic-euler-%e5%af%b9%e5%81%b6%e6%ac%a7%e6%8b%89"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;通过当前的受力分析计算加速度，推断下一步的速度（ &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;δ&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\times \delta t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="katex-base"&gt;&lt;span class="katex-strut" style="height:0.7778em;vertical-align:-0.0833em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;×&lt;/span&gt;&lt;span class="mord mathnormal" style="margin-right:0.0379em;"&gt;δ&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; ）（和上面一样）&lt;/li&gt;&#10;&lt;li&gt;用计算出来的新速度计算下一步的位移&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;实现的时候，在更新计算和地面的碰撞的时候，更新位置之前首先计算和地面的碰撞（&lt;code&gt;pos.y&amp;lt;bottom_height?&lt;/code&gt;），如果碰撞了，把速度设置为0。&lt;/p&gt;</description></item><item><title>光滑粒子法</title><link>http://blog.tsingjyujing.com/game201/sph/</link><pubDate>Fri, 24 Jul 2020 00:00:00 +0900</pubDate><guid>http://blog.tsingjyujing.com/game201/sph/</guid><description>&lt;h1 id="光滑粒子法"&gt;光滑粒子法&lt;a class="anchor" href="#%e5%85%89%e6%bb%91%e7%b2%92%e5%ad%90%e6%b3%95"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="简介"&gt;简介&lt;a class="anchor" href="#%e7%ae%80%e4%bb%8b"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="2020-07-23-13-12-12.png" alt="" /&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;不需要Mesh，适合描述自由表面流体（水，烟不是自由表面流体）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="wcsph"&gt;WCSPH&lt;a class="anchor" href="#wcsph"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="2020-07-23-13-15-02.png" alt="" /&gt;&lt;/p&gt;&#10;&lt;p&gt;用于描述不可压缩的流体。&lt;/p&gt;&#10;&lt;p&gt;这里有个神奇的公式：&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="2020-07-23-13-22-59.png" alt="" /&gt;&lt;/p&gt;&#10;&lt;p&gt;严格来说这个公式是不对的，但是这个公式能保证动量守恒，否则有各种奇怪问题。&lt;/p&gt;</description></item></channel></rss>