<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Projects on ゲーム開発部</title>
    <link>https://kirari.fun/projects/index.html</link>
    <description>Recent content in Projects on ゲーム開発部</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    
    
    
    
    
    <atom:link href="https://kirari.fun/projects/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>BMI160_Unity</title>
      <link>https://kirari.fun/projects/bmi160_unity.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kirari.fun/projects/bmi160_unity.html</guid>
      <description>&lt;p&gt;&lt;figure&#xA;    class=&#34;image-caption image-zoom-container&#34;&#xA;&gt;&#xA;    &#xA;    &lt;input&#xA;        type=&#34;checkbox&#34;&#xA;        id=&#34;img-46edbab3&#34;&#xA;        class=&#34;image-zoom-toggle&#34;&#xA;        aria-label=&#34;放大图片：运行效果&#34;&#xA;    /&gt;&#xA;    &lt;label&#xA;        for=&#34;img-46edbab3&#34;&#xA;        class=&#34;image-zoom-label&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://114514.zroevn.cn/imgs/BMI160_Unity.avif&#34;&#xA;            alt=&#34;运行效果&#34;&#xA;            loading=&#34;lazy&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;label&#xA;        for=&#34;img-46edbab3&#34;&#xA;        class=&#34;image-zoom-overlay&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://114514.zroevn.cn/imgs/BMI160_Unity.avif&#34;&#xA;            alt=&#34;运行效果&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;figcaption&gt;运行效果&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;实现技术：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;PlatformIO 串口发送数据&lt;/li&gt;&#xA;&lt;li&gt;-&amp;gt; Python 接收串口数据并创建 Tcp 服务器&lt;/li&gt;&#xA;&lt;li&gt;-&amp;gt; Unity 连接 Tcp 服务器并接收数据 累加角速度+转换坐标&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>clash-verge-tui-control</title>
      <link>https://kirari.fun/projects/chashvergetui.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kirari.fun/projects/chashvergetui.html</guid>
      <description>&lt;h2 id=&#34;-前往-github-仓库&#34;&gt;&lt;a href=&#34;https://github.com/zyf2007/clash-verge-tui-control&#34;&gt;→ 前往 Github 仓库&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;一个 TypeScript 终端 TUI，用于方便你只有 ssh 或 TTY 的情况下控制桌面端 Clash Verge Rev 切换节点。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;本程序不是基于 Mihomo 的 TUI 客户端，而是用于在你已经安装了其他 Mihomo GUI 的情况下提供多一种应急控制方式。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;figure&#xA;    class=&#34;image-caption image-zoom-container&#34;&#xA;&gt;&#xA;    &#xA;    &lt;input&#xA;        type=&#34;checkbox&#34;&#xA;        id=&#34;img-f40264c0&#34;&#xA;        class=&#34;image-zoom-toggle&#34;&#xA;        aria-label=&#34;放大图片：运行效果&#34;&#xA;    /&gt;&#xA;    &lt;label&#xA;        for=&#34;img-f40264c0&#34;&#xA;        class=&#34;image-zoom-label&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://raw.githubusercontent.com/zyf2007/clash-verge-tui-control/refs/heads/main/example.jpg&#34;&#xA;            alt=&#34;运行效果&#34;&#xA;            loading=&#34;lazy&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;label&#xA;        for=&#34;img-f40264c0&#34;&#xA;        class=&#34;image-zoom-overlay&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://raw.githubusercontent.com/zyf2007/clash-verge-tui-control/refs/heads/main/example.jpg&#34;&#xA;            alt=&#34;运行效果&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;figcaption&gt;运行效果&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;支持以下功能：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;查看策略组可选节点&lt;/li&gt;&#xA;&lt;li&gt;显示每个节点的延迟&lt;/li&gt;&#xA;&lt;li&gt;切换节点&lt;/li&gt;&#xA;&lt;li&gt;一键切到 &lt;code&gt;DIRECT&lt;/code&gt;（直连）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;默认连接方式&#34;&gt;默认连接方式&lt;/h2&gt;&#xA;&lt;p&gt;默认使用 &lt;code&gt;auto&lt;/code&gt; 自动发现：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;先尝试 Unix Socket：&lt;code&gt;/tmp/verge/verge-mihomo.sock&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;失败后再尝试 HTTP：&lt;code&gt;http://127.0.0.1:9090&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;默认策略组：&lt;code&gt;🚀 节点选择&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;clash-verge-rev-设置&#34;&gt;Clash Verge Rev 设置&lt;/h2&gt;&#xA;&lt;p&gt;如果要开启 HTTP 控制器（external-controller），需要配置：&lt;/p&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;ZXh0ZXJuYWwtY29udHJvbGxlcjogMTI3LjAuMC4xOjkwOTAKc2VjcmV0OiB5b3VyLXNlY3JldA==&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;external-controller&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;127.0.0.1&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;9090&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;secret&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;your-secret&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;p&gt;然后运行时设置：&lt;/p&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;Q0xBU0hfQkFTRV9VUkw9aHR0cDovLzEyNy4wLjAuMTo5MDkwIENMQVNIX1NFQ1JFVD15b3VyLXNlY3JldCBucG0gcnVuIGRldg==&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CLASH_BASE_URL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://127.0.0.1:9090 CLASH_SECRET&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;your-secret npm run dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;构建&#34;&gt;构建&lt;/h2&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;bnBtIHJ1biBidWlsZA==&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm run build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;安装与运行&#34;&gt;安装与运行&lt;/h2&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;bnBtIGkgLWcgY2xhc2gtdmVyZ2UtdHVpLWNvbnRyb2w=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm i -g clash-verge-tui-control&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;Y2xhc2h0dWk=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clashtui&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;按键&#34;&gt;按键&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;↑(j) / ↓(k)&lt;/code&gt;：选择节点&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Enter&lt;/code&gt;：切换到选中节点&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;r&lt;/code&gt;：刷新节点并测速（启动时默认不测速）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;d&lt;/code&gt;：切换到 &lt;code&gt;DIRECT&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;esc(q)&lt;/code&gt;：退出&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;环境变量&#34;&gt;环境变量&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;CLASH_UNIX_SOCKET&lt;/code&gt;：Unix Socket 路径（默认 &lt;code&gt;/tmp/verge/verge-mihomo.sock&lt;/code&gt;）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;CLASH_BASE_URL&lt;/code&gt;：HTTP 控制器地址（默认 &lt;code&gt;http://127.0.0.1:9090&lt;/code&gt;）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;CLASH_SECRET&lt;/code&gt;：如果设置了 API secret，填这里&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;CLASH_SELECTOR&lt;/code&gt;：策略组名称（默认 &lt;code&gt;🚀 节点选择&lt;/code&gt;）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;CLASH_TEST_URL&lt;/code&gt;：测速 URL（默认 &lt;code&gt;https://www.gstatic.com/generate_204&lt;/code&gt;）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;CLASH_TIMEOUT_MS&lt;/code&gt;：测速超时毫秒（默认 &lt;code&gt;5000&lt;/code&gt;）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;CLASH_CONCURRENCY&lt;/code&gt;：并发测速数量（默认 &lt;code&gt;8&lt;/code&gt;）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;示例&#34;&gt;示例&lt;/h2&gt;&#xA;&lt;h2 id=&#34;命令行参数&#34;&gt;命令行参数&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;--transport auto|unix|http&lt;/code&gt;：强制指定传输方式（默认 &lt;code&gt;auto&lt;/code&gt;）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;--socket-path /path/to.sock&lt;/code&gt;：覆盖 Unix Socket 路径&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;--base-url http://127.0.0.1:9090&lt;/code&gt;：覆盖 HTTP 控制器地址&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;--secret your-secret&lt;/code&gt;：覆盖 API secret&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;示例-1&#34;&gt;示例&lt;/h2&gt;&#xA;&lt;p&gt;强制用 HTTP：&lt;/p&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;Y2xhc2h0dWkgLS10cmFuc3BvcnQgaHR0cCAtLWJhc2UtdXJsIGh0dHA6Ly8xMjcuMC4wLjE6OTA5MCAtLXNlY3JldCB5b3VyLXNlY3JldA==&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clashtui --transport http --base-url http://127.0.0.1:9090 --secret your-secret&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;p&gt;强制用 Unix Socket：&lt;/p&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;Y2xhc2h0dWkgLS10cmFuc3BvcnQgdW5peCAtLXNvY2tldC1wYXRoIC90bXAvdmVyZ2UvdmVyZ2UtbWlob21vLnNvY2s=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clashtui --transport unix --socket-path /tmp/verge/verge-mihomo.sock&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>MemoCard</title>
      <link>https://kirari.fun/projects/memocard.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kirari.fun/projects/memocard.html</guid>
      <description>&lt;h2 id=&#34;-前往-github-仓库&#34;&gt;&lt;a href=&#34;https://github.com/zyf2007/MemoCard&#34;&gt;→ 前往 Github 仓库&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;一款轻量高效的记忆卡片手机 App。支持在线浏览并导入题库，通过卡片化交互与智能出题机制，帮助你快速记忆知识，并通过统计图表看到学习数据。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&#xA;    class=&#34;image-caption image-zoom-container&#34;&#xA;&gt;&#xA;    &#xA;    &lt;input&#xA;        type=&#34;checkbox&#34;&#xA;        id=&#34;img-00f7f299&#34;&#xA;        class=&#34;image-zoom-toggle&#34;&#xA;        aria-label=&#34;放大图片：MemoCard&#34;&#xA;    /&gt;&#xA;    &lt;label&#xA;        for=&#34;img-00f7f299&#34;&#xA;        class=&#34;image-zoom-label&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://raw.githubusercontent.com/zyf2007/MemoCard/refs/heads/main/assets/images/memocard_readme.avif&#34;&#xA;            alt=&#34;MemoCard&#34;&#xA;            loading=&#34;lazy&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;label&#xA;        for=&#34;img-00f7f299&#34;&#xA;        class=&#34;image-zoom-overlay&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://raw.githubusercontent.com/zyf2007/MemoCard/refs/heads/main/assets/images/memocard_readme.avif&#34;&#xA;            alt=&#34;MemoCard&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;figcaption&gt;MemoCard&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;-核心特性&#34;&gt;✨ 核心特性&lt;/h2&gt;&#xA;&lt;h3 id=&#34;-沉浸式刷题训练&#34;&gt;📝 沉浸式刷题训练&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;卡片式交互体验，左右滑动轻松切换题目&lt;/li&gt;&#xA;&lt;li&gt;兼容&lt;strong&gt;单选题、填空题&lt;/strong&gt;等多种题型&lt;/li&gt;&#xA;&lt;li&gt;作答后即时反馈，对错一目了然&lt;/li&gt;&#xA;&lt;li&gt;顶部进度条实时展示刷题进度，掌控学习节奏&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;-灵活的题库管理&#34;&gt;📚 灵活的题库管理&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;支持多种创建/导入方式：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;手动新建专属题库&lt;/li&gt;&#xA;&lt;li&gt;粘贴 JSON 文本快速导入（适合 AI 生成题库文件）&lt;/li&gt;&#xA;&lt;li&gt;本地 JSON 文件批量导入&lt;/li&gt;&#xA;&lt;li&gt;通过 URL 一键拉取远程题库&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;完整的题库生命周期管理：查看、编辑、删除一站式操作&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;-在线题库生态&#34;&gt;🌐 在线题库生态&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;预览题库内容，精准选择适配的学习材料&lt;/li&gt;&#xA;&lt;li&gt;一键导入在线题库，无需手动录入&lt;/li&gt;&#xA;&lt;li&gt;自定义管理在线题库仓库源&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;-个性化出题设置&#34;&gt;⚙️ 个性化出题设置&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;自定义每日/每轮出题规则，适配不同学习节奏&lt;/li&gt;&#xA;&lt;li&gt;灵活选择启用的题库，精准聚焦当前学习目标&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;-可视化学习统计&#34;&gt;📊 可视化学习统计&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;核心数据概览：总答题数、正确率、活跃天数等&lt;/li&gt;&#xA;&lt;li&gt;趋势分析：7天/30天学习数据图表，直观掌握学习状态&lt;/li&gt;&#xA;&lt;li&gt;题库维度分析：各题库答题分布与能力提升情况&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;-便捷的数据迁移&#34;&gt;🔄 便捷的数据迁移&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;数据导出：支持导出至文件或剪贴板，轻松备份&lt;/li&gt;&#xA;&lt;li&gt;数据导入：从文件/剪贴板/文本粘贴导入，覆盖式同步&lt;/li&gt;&#xA;&lt;li&gt;跨设备同步：完美适配换机、备份、多设备使用场景&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;-友好的首次使用引导&#34;&gt;🎯 友好的首次使用引导&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;新用户：快速创建首个题库，即刻开启记忆训练&lt;/li&gt;&#xA;&lt;li&gt;老用户：一键导入历史数据，无缝衔接学习进度&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;-应用结构&#34;&gt;📱 应用结构&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;记忆&lt;/strong&gt;：核心训练页面，卡片式刷题交互&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;统计&lt;/strong&gt;：学习数据可视化，趋势分析与复盘&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;管理&lt;/strong&gt;：题库管理、出题设置、导入导出、在线题库一站式操作&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;-快速开始&#34;&gt;🚀 快速开始&lt;/h2&gt;&#xA;&lt;h3 id=&#34;环境准备&#34;&gt;环境准备&lt;/h3&gt;&#xA;&lt;p&gt;确保已安装 Node.js 及 npm/yarn，且配置好 Expo 开发环境。&lt;/p&gt;&#xA;&lt;h3 id=&#34;安装与运行&#34;&gt;安装与运行&lt;/h3&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;IyDlronoo4Xkvp3otZYKbnBtIGluc3RhbGwKCiMg5ZCv5Yqo5byA5Y&amp;#43;R5pyN5Yqh5ZmoCm5wbSBydW4gc3RhcnQKCiMg6L&amp;#43;Q6KGM5YiwIEFuZHJvaWQg6K6&amp;#43;5aSHL&amp;#43;aooeaLn&amp;#43;WZqApucHggZXhwbyBydW46YW5kcm9pZA==&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 安装依赖&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 启动开发服务器&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm run start&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 运行到 Android 设备/模拟器&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npx expo run:android&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;blockquote&gt;&#xA;&lt;p&gt;（目前只在 Android 平台测试）&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;-配置与文档&#34;&gt;📖 配置与文档&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在线题库仓库配置规范与索引格式（可以做给 AI 的提示词）：&lt;a href=&#34;https://github.com/zyf2007/MemoCard/blob/main/docs/online-question-base-repository.md&#34;&gt;docs/online-question-base-repository.md&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>React Native 实时动捕原生模块</title>
      <link>https://kirari.fun/projects/posedetect.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kirari.fun/projects/posedetect.html</guid>
      <description>&lt;p&gt;是挑战杯项目中的一部分，因老师要求无法开源。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&#xA;    class=&#34;image-caption image-zoom-container&#34;&#xA;&gt;&#xA;    &#xA;    &lt;input&#xA;        type=&#34;checkbox&#34;&#xA;        id=&#34;img-303606bd&#34;&#xA;        class=&#34;image-zoom-toggle&#34;&#xA;        aria-label=&#34;放大图片：运行效果&#34;&#xA;    /&gt;&#xA;    &lt;label&#xA;        for=&#34;img-303606bd&#34;&#xA;        class=&#34;image-zoom-label&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://114514.zroevn.cn/imgs/RealTimePoseDetect_Large.gif&#34;&#xA;            alt=&#34;运行效果&#34;&#xA;            loading=&#34;lazy&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;label&#xA;        for=&#34;img-303606bd&#34;&#xA;        class=&#34;image-zoom-overlay&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://114514.zroevn.cn/imgs/RealTimePoseDetect_Large.gif&#34;&#xA;            alt=&#34;运行效果&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;figcaption&gt;运行效果&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;关键点：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用 kotlin 编写原生模块，将视频流使用 ExoPlayer 硬件解码播放 → VideoFrameProcessor → ImageReader → Bitmap → Mediapipe 实现实时推理&lt;/li&gt;&#xA;&lt;li&gt;将推理结果返回给 RN 侧，进行可视化展示&lt;/li&gt;&#xA;&lt;li&gt;设备不支持 ExoPlayer 时，自动回退降级按设定 FPS 间隔使用 retriever.getFrameAtTime() 软件解码取帧推理，保证兼容性。&lt;/li&gt;&#xA;&lt;li&gt;降级模式由于速度较慢，采用异步检测，结果通过事件发回 JS ，用 ConcurrentHashMap 保存时间戳→帧索引，后续播放时直接从缓存中获取。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>react-native-latex-text</title>
      <link>https://kirari.fun/projects/reactnativelatextext.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kirari.fun/projects/reactnativelatextext.html</guid>
      <description>&lt;h2 id=&#34;-前往-github-仓库&#34;&gt;&lt;a href=&#34;https://github.com/zyf2007/react-native-latex-text&#34;&gt;→ 前往 Github 仓库&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h1 id=&#34;react-native-latex-text&#34;&gt;react-native-latex-text&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;./README.md&#34;&gt;English&lt;/a&gt; | 中文&lt;/p&gt;&#xA;&lt;p&gt;一个轻量、高性能的 React Native 组件，支持文字与 Latex 公式混排，自定义公式分隔符，使用 \n 换行，自动计算公式行高，基于 MathJax SVG 在 react-native-svg 中渲染，内置缓存，无原生依赖（可直接在 Expo Go 中运行）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure&#xA;    class=&#34;image-caption image-zoom-container&#34;&#xA;&gt;&#xA;    &#xA;    &lt;input&#xA;        type=&#34;checkbox&#34;&#xA;        id=&#34;img-13a80da9&#34;&#xA;        class=&#34;image-zoom-toggle&#34;&#xA;        aria-label=&#34;放大图片：渲染效果&#34;&#xA;    /&gt;&#xA;    &lt;label&#xA;        for=&#34;img-13a80da9&#34;&#xA;        class=&#34;image-zoom-label&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://imgoss.qijieya.cn/imgoss/59/69c2822801a15.avif&#34;&#xA;            alt=&#34;渲染效果&#34;&#xA;            loading=&#34;lazy&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;label&#xA;        for=&#34;img-13a80da9&#34;&#xA;        class=&#34;image-zoom-overlay&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://imgoss.qijieya.cn/imgoss/59/69c2822801a15.avif&#34;&#xA;            alt=&#34;渲染效果&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;figcaption&gt;渲染效果&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;h1 id=&#34;how-it-works&#34;&gt;How It Works?&lt;/h1&gt;&#xA;&lt;p&gt;MathJaxRenderer 组件会在根节点创建一个隐藏的 1*1 的 WebView 组件，用于加载 MathJax 库和渲染公式，并通过 postMessage 将 svg-xml 字符串返回给 React Native，并使 react-native-svg 组件实现高性能渲染。&lt;br&gt;&#xA;因此，这种渲染方式不依赖任何原生组件，可以直接在 Expo Go 中运行。&lt;/p&gt;&#xA;&lt;p&gt;MathText 组件通过正则表达式将文本中的公式部分提取出来，分别渲染并计算行高，最后将普通文本与渲染后的公式拼接起来。&lt;/p&gt;&#xA;&lt;h1 id=&#34;使用方法&#34;&gt;使用方法&lt;/h1&gt;&#xA;&lt;h2 id=&#34;初始化&#34;&gt;初始化：&lt;/h2&gt;&#xA;&lt;p&gt;在项目的根节点（比如最外层的 _layout.tsx）中引入 MathJaxRenderer 组件，并用其 ref 初始化全局 MathRenderer：&lt;/p&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;Ly8gX2xheW91dC50c3gKaW1wb3J0IFJlYWN0LCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JzsKaW1wb3J0IHsgVmlldyB9IGZyb20gJ3JlYWN0LW5hdGl2ZSc7CmltcG9ydCB7IE1hdGhKYXhSZW5kZXJlciwgTWF0aEpheFJlbmRlcmVyUmVmLCBNYXRoUmVuZGVyZXIsIE1hdGhUZXh0IH0gZnJvbSAncmVhY3QtbmF0aXZlLWxhdGV4LXRleHQnOwoKZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXBwKCkgewogIC8vIDEuIOWIm&amp;#43;W7uiBNYXRoSmF4UmVuZGVyZXIg5byV55SoCiAgY29uc3QgbWF0aEpheFJlZiA9IHVzZVJlZjxNYXRoSmF4UmVuZGVyZXJSZWY&amp;#43;KG51bGwpOwogIAogIC8vIDIuIOWIneWni&amp;#43;WMluWFqOWxgOa4suafk&amp;#43;WZqAogIE1hdGhSZW5kZXJlci5Jbml0KG1hdGhKYXhSZWYpOwoKICByZXR1cm4gKAogICAgPFZpZXcgc3R5bGU9e3sgZmxleDogMSwgcGFkZGluZzogMjAgfX0&amp;#43;CiAgICAgICB7LyogMy4g5riy5p&amp;#43;T5Zmo5qC45b&amp;#43;D57uE5Lu277yI6ZqQ6JeP5byP77yJICovfQogICAgICA8TWF0aEpheFJlbmRlcmVyIAogICAgICAgIHJlZj17bWF0aEpheFJlZn0gCiAgICAgICAgbWF4Q2FjaGVTaXplPXs1MH0gCiAgICAgIC8&amp;#43;CiAgICA8L1ZpZXc&amp;#43;CiAgKTsKfQ==&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-tsx&#34; data-lang=&#34;tsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// _layout.tsx&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;React&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;useRef&lt;/span&gt; } &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;react&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;View&lt;/span&gt; } &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;react-native&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;MathJaxRenderer&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;MathJaxRendererRef&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;MathRenderer&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;MathText&lt;/span&gt; } &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;react-native-latex-text&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App() {&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 1. 创建 MathJaxRenderer 引用&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mathJaxRef&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;useRef&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;MathJaxRendererRef&lt;/span&gt;&amp;gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 2. 初始化全局渲染器&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;MathRenderer&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Init&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;mathJaxRef&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;View&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{{ &lt;span style=&#34;color:#a6e22e&#34;&gt;flex&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;padding&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;20&lt;/span&gt; }}&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       {&lt;span style=&#34;color:#75715e&#34;&gt;/* 3. 渲染器核心组件（隐藏式） */&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;MathJaxRenderer&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;ref&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;mathJaxRef&lt;/span&gt;} &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;maxCacheSize&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;} &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;View&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  );&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;渲染公式&#34;&gt;渲染公式：&lt;/h2&gt;&#xA;&lt;p&gt;在项目的任意位置，直接使用 MathText 组件渲染带公式的文本：&lt;/p&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;aW1wb3J0IHsgTWF0aFRleHQgfSBmcm9tICdyZWFjdC1uYXRpdmUtbGF0ZXgtdGV4dCc7CgoKCjxNYXRoVGV4dAogIGNvbnRlbnQ9J&amp;#43;Wdl&amp;#43;e6p&amp;#43;WFrOW8j&amp;#43;&amp;#43;8muaxguS7peS4i&amp;#43;Wumuenr&amp;#43;WIhueahOe7k&amp;#43;aenO&amp;#43;8mlxbXGludF8wXjIgeF4zIGR4XF1cbuihjOWGheWFrOW8j&amp;#43;&amp;#43;8muiuoeeul&amp;#43;eUteWcuuW8uuW6plwoXHZlY3tFfSA9IFxmcmFje1x2ZWN7Rn19e3F9XCnvvIzoi6Xor5XmjqLnlLXojbdcKHEgPSAyw5cxMF57LTZ9Q1wp77yM5Y&amp;#43;X5Yiw55qE55S15Zy65YqbXChcdmVje0Z9ID0gNMOXMTBeey0zfU5cKe&amp;#43;8jOWImeeUteWcuuW8uuW6pueahOWkp&amp;#43;Wwj&amp;#43;S4uu&amp;#43;8nycKICB0ZXh0Q29sb3I9JyNGRkZGRkYnCi8&amp;#43;&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-tsx&#34; data-lang=&#34;tsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;MathText&lt;/span&gt; } &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;react-native-latex-text&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;MathText&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;块级公式：求以下定积分的结果：\[\int_0^2 x^3 dx\]\n行内公式：计算电场强度\(\vec{E} = \frac{\vec{F}}{q}\)，若试探电荷\(q = 2×10^{-6}C\)，受到的电场力\(\vec{F} = 4×10^{-3}N\)，则电场强度的大小为？&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;textColor&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;#FFFFFF&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;特性&#34;&gt;特性&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;🚀 &lt;strong&gt;高性能&lt;/strong&gt;：内置公式缓存机制，避免重复渲染&lt;/li&gt;&#xA;&lt;li&gt;🎨 &lt;strong&gt;自定义样式&lt;/strong&gt;：支持公式颜色、大小、行高自定义，使用 \n 随时换行&lt;/li&gt;&#xA;&lt;li&gt;✨ &lt;strong&gt;混合渲染&lt;/strong&gt;：公式与普通文本无缝混合显示&lt;/li&gt;&#xA;&lt;li&gt;🎯 &lt;strong&gt;灵活配置&lt;/strong&gt;：支持自定义公式分隔符、缓存大小等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;&#xA;&lt;h3 id=&#34;前提依赖&#34;&gt;前提依赖&lt;/h3&gt;&#xA;&lt;p&gt;确保你的项目已安装以下依赖：&lt;/p&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;bnBtIGluc3RhbGwgcmVhY3QtbmF0aXZlLXN2ZyByZWFjdC1uYXRpdmUtd2VidmlldwojIOaIluS9v&amp;#43;eUqCB5YXJuCnlhcm4gYWRkIHJlYWN0LW5hdGl2ZS1zdmcgcmVhY3QtbmF0aXZlLXdlYnZpZXc=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install react-native-svg react-native-webview&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 或使用 yarn&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yarn add react-native-svg react-native-webview&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;安装主包&#34;&gt;安装主包&lt;/h3&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;bnBtIGluc3RhbGwgcmVhY3QtbmF0aXZlLWxhdGV4LXRleHQKIyDmiJbkvb/nlKggeWFybgp5YXJuIGFkZCByZWFjdC1uYXRpdmUtbGF0ZXgtdGV4dA==&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install react-native-latex-text&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 或使用 yarn&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yarn add react-native-latex-text&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;额外配置androidios&#34;&gt;额外配置（Android/iOS）&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;iOS&lt;/strong&gt;：执行 &lt;code&gt;pod install&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;ICBjZCBpb3MgJiYgcG9kIGluc3RhbGwgJiYgY2QgLi4=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cd ios &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; pod install &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; cd ..&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Android&lt;/strong&gt;：无需额外配置&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;快速开始&#34;&gt;快速开始&lt;/h2&gt;&#xA;&lt;h3 id=&#34;基础用法&#34;&gt;基础用法&lt;/h3&gt;&#xA;&lt;h2 id=&#34;api-文档&#34;&gt;API 文档&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-mathjaxrenderer核心渲染器&#34;&gt;1. MathJaxRenderer（核心渲染器）&lt;/h3&gt;&#xA;&lt;p&gt;必须在应用根组件中引入，负责公式的底层渲染（隐藏式组件）。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;属性&lt;/th&gt;&#xA;          &lt;th&gt;类型&lt;/th&gt;&#xA;          &lt;th&gt;默认值&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;initialCache&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;初始化时预渲染的公式列表（提升首次渲染速度）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;initialCacheColor&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;black&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;预渲染公式的默认颜色&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;maxCacheSize&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;100&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;公式缓存最大数量（超出自动清除最早缓存）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;onRenderComplete&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;(result: RenderResult, latex: string, color: string) =&amp;gt; void&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;-&lt;/td&gt;&#xA;          &lt;td&gt;公式渲染完成回调&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;onRenderError&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;(error: string, latex: string, color: string) =&amp;gt; void&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;-&lt;/td&gt;&#xA;          &lt;td&gt;公式渲染失败回调&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;onReady&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;() =&amp;gt; void&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;-&lt;/td&gt;&#xA;          &lt;td&gt;渲染器初始化完成回调&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;暴露的方法通过-ref-调用&#34;&gt;暴露的方法（通过 ref 调用）&lt;/h4&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;方法&lt;/th&gt;&#xA;          &lt;th&gt;参数&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;render&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;(latex: string, onComplete, options?)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;手动渲染单个公式&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;clearCache&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;(latex?: string, color?: string)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;清除缓存（不传参清除所有，传 latex 清除该公式所有颜色，传 latex+color 清除指定缓存）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;getCacheSize&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;-&lt;/td&gt;&#xA;          &lt;td&gt;获取当前缓存数量&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;isReady&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;-&lt;/td&gt;&#xA;          &lt;td&gt;判断渲染器是否就绪&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;2-mathtext文本公式渲染组件&#34;&gt;2. MathText（文本+公式渲染组件）&lt;/h3&gt;&#xA;&lt;p&gt;用于显示混合了普通文本和数学公式的内容。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;属性&lt;/th&gt;&#xA;          &lt;th&gt;类型&lt;/th&gt;&#xA;          &lt;th&gt;默认值&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;content&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;-&lt;/td&gt;&#xA;          &lt;td&gt;包含公式的文本内容（必填）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;viewStyle&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;ViewStyle&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;-&lt;/td&gt;&#xA;          &lt;td&gt;容器样式&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;lineStyle&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;ViewStyle&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;-&lt;/td&gt;&#xA;          &lt;td&gt;行样式(单行居中常用)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;textColor&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;#000000&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;普通文本颜色&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;fontSize&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;普通文本字体大小&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;baseMathSize&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;公式渲染大小放大倍率&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;lineHeight&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;1.5&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;全局行高（文本+公式）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;delimiters&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;{ inline: {left, right}[], display: {left, right}[] }&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;见下方默认值&lt;/td&gt;&#xA;          &lt;td&gt;公式分隔符配置&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;默认分隔符&#34;&gt;默认分隔符&lt;/h4&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;ewogIGlubGluZTogWyAvLyDooYzlhoXlhazlvI/liIbpmpTnrKYKICAgIHsgbGVmdDogJ1xcKCcsIHJpZ2h0OiAnXFwpJyB9LAogICAgeyBsZWZ0OiAnJCcsIHJpZ2h0OiAnJCcgfSwKICBdLAogIGRpc3BsYXk6IFsgLy8g5Z2X57qn5YWs5byP5YiG6ZqU56ymCiAgICB7IGxlZnQ6ICdcXFsnLCByaWdodDogJ1xcXScgfSwKICAgIHsgbGVmdDogJyQkJywgcmlnaHQ6ICckJCcgfSwKICBdLAp9&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;inline&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [ &lt;span style=&#34;color:#75715e&#34;&gt;// 行内公式分隔符&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    { &lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\\(&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\\)&amp;#39;&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    { &lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;$&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;$&amp;#39;&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;display&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [ &lt;span style=&#34;color:#75715e&#34;&gt;// 块级公式分隔符&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    { &lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\\[&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\\]&amp;#39;&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    { &lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;$$&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;$$&amp;#39;&lt;/span&gt; },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;3-mathrenderer全局渲染工具类&#34;&gt;3. MathRenderer（全局渲染工具类）&lt;/h3&gt;&#xA;&lt;p&gt;提供全局公式渲染方法。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;静态方法&lt;/th&gt;&#xA;          &lt;th&gt;参数&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;Init&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;ref: React.RefObject&amp;lt;MathJaxRendererRef&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;初始化全局渲染器&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;Render&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;(latex: string, onComplete, options)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;全局渲染公式&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;ClearCache&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;-&lt;/td&gt;&#xA;          &lt;td&gt;清除所有公式缓存&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;高级用法&#34;&gt;高级用法&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-自定义公式分隔符&#34;&gt;1. 自定义公式分隔符&lt;/h3&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;PE1hdGhUZXh0CiAgY29udGVudD0i6Ieq5a6a5LmJ5YiG6ZqU56ym56S65L6L77yaJWFeMitiXjI9Y14yJSDmiJYgJSVcXGludF97MH1eezF9eF4yZHglJSIKICBkZWxpbWl0ZXJzPXt7CiAgICBpbmxpbmU6IFt7IGxlZnQ6ICclJywgcmlnaHQ6ICclJyB9XSwKICAgIGRpc3BsYXk6IFt7IGxlZnQ6ICclJScsIHJpZ2h0OiAnJSUnIH1dLAogIH19Ci8&amp;#43;&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-tsx&#34; data-lang=&#34;tsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;MathText&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;自定义分隔符示例：%a^2+b^2=c^2% 或 %%\\int_{0}^{1}x^2dx%%&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;delimiters&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;inline&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [{ &lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;%&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;%&amp;#39;&lt;/span&gt; }],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;display&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [{ &lt;span style=&#34;color:#a6e22e&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;%%&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;right&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;%%&amp;#39;&lt;/span&gt; }],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;2-手动控制缓存&#34;&gt;2. 手动控制缓存&lt;/h3&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;Ly8g5riF6Zmk5oyH5a6a5YWs5byP55qE57yT5a2YCm1hdGhKYXhSZWYuY3VycmVudD8uY2xlYXJDYWNoZSgnYV4yICsgYl4yID0gY14yJywgJyMwMDY2Y2MnKTsKCi8vIOa4hemZpOaJgOaciee8k&amp;#43;WtmApNYXRoUmVuZGVyZXIuQ2xlYXJDYWNoZSgpOwoKLy8g6I635Y&amp;#43;W5b2T5YmN57yT5a2Y5aSn5bCPCmNvbnNvbGUubG9nKCfnvJPlrZjmlbDph4/vvJonLCBtYXRoSmF4UmVmLmN1cnJlbnQ/LmdldENhY2hlU2l6ZSgpKTs=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-tsx&#34; data-lang=&#34;tsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 清除指定公式的缓存&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mathJaxRef&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;current&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;clearCache&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a^2 + b^2 = c^2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;#0066cc&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 清除所有缓存&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;MathRenderer&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ClearCache&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 获取当前缓存大小&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;缓存数量：&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;mathJaxRef&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;current&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getCacheSize&lt;/span&gt;());&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;3-调试模式&#34;&gt;3. 调试模式&lt;/h3&gt;&#xA;&lt;p&gt;开启调试日志（修改源码中 &lt;code&gt;DEBUG_MATH_RENDERER&lt;/code&gt; 为 &lt;code&gt;true&lt;/code&gt;）：&lt;/p&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;Ly8g5Zyo5a&amp;#43;55bqU5paH5Lu26aG26YOo5L&amp;#43;u5pS5CmNvbnN0IERFQlVHX01BVEhfUkVOREVSRVIgPSB0cnVlOw==&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 在对应文件顶部修改&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DEBUG_MATH_RENDERER&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;注意事项&#34;&gt;注意事项&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;MathJaxRenderer&lt;/code&gt; 必须在 &lt;code&gt;MathText&lt;/code&gt; 之前渲染，建议放在应用根组件&lt;/li&gt;&#xA;&lt;li&gt;首次渲染可能有轻微延迟（一打开应用可能会看到 [公式加载中] ，为 MathJax 脚本加载时间），建议使用 &lt;code&gt;initialCache&lt;/code&gt; 预渲染常用公式&lt;/li&gt;&#xA;&lt;li&gt;确保 &lt;code&gt;react-native-webview&lt;/code&gt; 和 &lt;code&gt;react-native-svg&lt;/code&gt; 版本与 React Native 兼容&lt;/li&gt;&#xA;&lt;li&gt;块级公式会独占一行，行内公式与文本同行显示&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;许可证&#34;&gt;许可证&lt;/h2&gt;&#xA;&lt;p&gt;MIT&lt;/p&gt;&#xA;&lt;h2 id=&#34;贡献&#34;&gt;贡献&lt;/h2&gt;&#xA;&lt;p&gt;欢迎提交 Issue 和 PR。&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>UnitySPH</title>
      <link>https://kirari.fun/projects/unitysph.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kirari.fun/projects/unitysph.html</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;这是对 &lt;a href=&#34;https://zhiquanwang.notion.site/Smoothed-Particle-Hydrodynamics-Particle-Based-Fluid-Simulation-for-Interactive-Applications-9061b2ec19de49e1857ec80fa30d1e50&#34;&gt;这篇blog&lt;/a&gt; 中的公式的一个 Unity 实现，但是这篇 blog 现在已经被删除了&amp;hellip;&lt;br&gt;&#xA;这是胡桃酱高中时期作为综评课题的一个学习项目，由于代码质量不高 就不开源了&amp;hellip;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;figure&#xA;    class=&#34;image-caption image-zoom-container&#34;&#xA;&gt;&#xA;    &#xA;    &lt;input&#xA;        type=&#34;checkbox&#34;&#xA;        id=&#34;img-022a84c4&#34;&#xA;        class=&#34;image-zoom-toggle&#34;&#xA;        aria-label=&#34;放大图片：效果演示&#34;&#xA;    /&gt;&#xA;    &lt;label&#xA;        for=&#34;img-022a84c4&#34;&#xA;        class=&#34;image-zoom-label&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://imgoss.qijieya.cn/imgoss/59/69c100274c94d.gif&#34;&#xA;            alt=&#34;效果演示&#34;&#xA;            loading=&#34;lazy&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;label&#xA;        for=&#34;img-022a84c4&#34;&#xA;        class=&#34;image-zoom-overlay&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://imgoss.qijieya.cn/imgoss/59/69c100274c94d.gif&#34;&#xA;            alt=&#34;效果演示&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;figcaption&gt;效果演示&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;h3 id=&#34;主要特点&#34;&gt;主要特点&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;GPU 加速计算&lt;/strong&gt;：利用 Compute Shader 在 GPU 上并行计算所有粒子的物理属性&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;GPU Instance 渲染&lt;/strong&gt;：使用 GPU Instance 技术高效渲染大量粒子，减少 CPU-GPU 带宽开销&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;完整 SPH 算法实现&lt;/strong&gt;：包含压力、粘性、表面张力、重力等物理计算&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;三角面碰撞检测&lt;/strong&gt;：支持与场景中任意三角面的碰撞和反弹&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;主要组件说明&#34;&gt;主要组件说明&lt;/h3&gt;&#xA;&lt;h4 id=&#34;sphparticlesystem&#34;&gt;SphParticleSystem&lt;/h4&gt;&#xA;&lt;p&gt;主控制器组件，管理粒子系统配置：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;参数&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;particleCount&lt;/td&gt;&#xA;          &lt;td&gt;粒子总数&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;smoothingRadius&lt;/td&gt;&#xA;          &lt;td&gt;平滑核半径&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;particleMass&lt;/td&gt;&#xA;          &lt;td&gt;单个粒子质量&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;particleViscosity&lt;/td&gt;&#xA;          &lt;td&gt;粘性系数&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;particleRenderRadius&lt;/td&gt;&#xA;          &lt;td&gt;粒子渲染半径&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;particleDrag&lt;/td&gt;&#xA;          &lt;td&gt;碰撞阻尼&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;restDensity&lt;/td&gt;&#xA;          &lt;td&gt;静止密度&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h4 id=&#34;sphsolver&#34;&gt;SphSolver&lt;/h4&gt;&#xA;&lt;p&gt;计算求解器，负责 GPU 计算调用：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;自动管理 Compute Shader 的加载和初始化&lt;/li&gt;&#xA;&lt;li&gt;处理粒子和碰撞体数据在 CPU 和 GPU 之间的传输&lt;/li&gt;&#xA;&lt;li&gt;调度各个计算 Kernel 执行&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;sphcollidermesh&#34;&gt;SphColliderMesh&lt;/h4&gt;&#xA;&lt;p&gt;碰撞体组件，用于添加可碰撞的三角面：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;可添加多个 Mesh Collider 作为碰撞体&lt;/li&gt;&#xA;&lt;li&gt;自动将 Mesh 转换为世界坐标系的碰撞数据&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;核心算法实现&#34;&gt;核心算法实现&lt;/h2&gt;&#xA;&lt;h3 id=&#34;粒子数据结构&#34;&gt;粒子数据结构&lt;/h3&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;c3RydWN0IFNQSFBhcnRpY2xlCnsKICAgIGZsb2F0MyBwb3NpdGlvbjsgICAgLy8g5L2N572uCiAgICBmbG9hdDMgdmVsb2NpdHk7ICAgIC8vIOmAn&amp;#43;W6pgogICAgZmxvYXQzIGZvcmNlOyAgICAgICAvLyDlj5flipsKICAgIGZsb2F0IGRlbnNpdHk7ICAgICAgLy8g5a&amp;#43;G5bqmCiAgICBmbG9hdCBwcmVzc3VyZTsgICAgIC8vIOWOi&amp;#43;WKmwogICAgZmxvYXQyIGdyaWQ7ICAgICAgICAvLyDnvZHmoLzlnZDmoIfvvIjnlKjkuo7lkI7nu63kvJjljJbvvIkKfTs=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;9&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SPHParticle&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    float3 position;    &lt;span style=&#34;color:#75715e&#34;&gt;// 位置&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    float3 velocity;    &lt;span style=&#34;color:#75715e&#34;&gt;// 速度&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    float3 force;       &lt;span style=&#34;color:#75715e&#34;&gt;// 受力&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; density;      &lt;span style=&#34;color:#75715e&#34;&gt;// 密度&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; pressure;     &lt;span style=&#34;color:#75715e&#34;&gt;// 压力&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    float2 grid;        &lt;span style=&#34;color:#75715e&#34;&gt;// 网格坐标（用于后续优化）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;sph-管线流程&#34;&gt;SPH 管线流程&lt;/h3&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;MS4g5Yid5aeL5YyW57KS5a2Q5L2N572uIOKGkiAyLiDorqHnrpflr4bluqblkozljovlipsg4oaSIDMuIOiuoeeul&amp;#43;WPl&amp;#43;WKmwogICAg4oaTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaTCjQuIOabtOaWsOmAn&amp;#43;W6puWSjOS9jee9riDihpAgNS4g56Kw5pKe5qOA5rWL5ZKM5ZON5bqU&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1. 初始化粒子位置 → 2. 计算密度和压力 → 3. 计算受力&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ↓                                    ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4. 更新速度和位置 ← 5. 碰撞检测和响应&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;支持的图形-api&#34;&gt;支持的图形 API&lt;/h3&gt;&#xA;&lt;p&gt;项目支持多种图形 API：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;OpenGL&lt;/strong&gt;：兼容性良好，适用于大多数系统&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Vulkan&lt;/strong&gt;：性能最佳，适用于高性能需求场景&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;项目结构&#34;&gt;项目结构&lt;/h2&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;IEFzc2V0cy8KIOKUnOKUgOKUgCBTY3JpcHQvCiDilIIgICDilJTilIDilIAgTXlTcGgvCiDilIIgICAgICAg4pSc4pSA4pSAIEJhc2UvICAgICAgICAgICAgICAgICAgICAjIOWfuuehgOaVsOaNrue7k&amp;#43;aehAog4pSCICAgICAgIOKUgiAgIOKUlOKUgOKUgCBTcGhQYXJ0aWNsZS5jcwog4pSCICAgICAgIOKUnOKUgOKUgCBTUEhTb2x2ZXIvCiDilIIgICAgICAg4pSCICAg4pSU4pSA4pSAIFNwaFNvbHZlci5jcyAgICAgICAgICAjIOaxguino&amp;#43;WZqOS4u&amp;#43;exuwog4pSCICAgICAgIOKUnOKUgOKUgCBTcGhQYXJ0aWNsZVN5c3RlbS5jcyAgICAgICMg57KS5a2Q57O757uf566h55CGCiDilIIgICAgICAg4pSU4pSA4pSAIFNwaENvbGxpZGVyTWVzaC5jcyAgICAgICAgIyDnorDmkp7kvZPnu4Tku7YKIOKUnOKUgOKUgCBSZXNvdXJjZXMvCiDilIIgICDilJTilIDilIAgQ29tcHV0ZVNoYWRlci8KIOKUgiAgICAgICDilJTilIDilIAgU3BoLwog4pSCICAgICAgICAgICDilJTilIDilIAgU3BoU29sdmVyLmNvbXB1dGUgICAgICMg6K6h566X552A6Imy5ZmoCiDilJTilIDilIAgTWVzaGVzLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIOKUlOKUgOKUgCBTcGhlcmVMb3dQb2x5LmZieCAgICAgICAgICAgICAjIOeykuWtkCBNZXNo&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Assets/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ├── Script/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; │   └── MySph/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; │       ├── Base/                    # 基础数据结构&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; │       │   └── SphParticle.cs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; │       ├── SPHSolver/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; │       │   └── SphSolver.cs          # 求解器主类&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; │       ├── SphParticleSystem.cs      # 粒子系统管理&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; │       └── SphColliderMesh.cs        # 碰撞体组件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ├── Resources/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; │   └── ComputeShader/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; │       └── Sph/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; │           └── SphSolver.compute     # 计算着色器&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; └── Meshes/                           &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     └── SphereLowPoly.fbx             # 粒子 Mesh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;使用示例&#34;&gt;使用示例&lt;/h2&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;Ly8g6I635Y&amp;#43;W57KS5a2Q57O757uf57uE5Lu2CnZhciBwYXJ0aWNsZVN5c3RlbSA9IEdldENvbXBvbmVudDxTcGhQYXJ0aWNsZVN5c3RlbT4oKTsKCi8vIOmFjee9rueykuWtkOaVsOmHj&amp;#43;WSjOWNiuW&amp;#43;hApwYXJ0aWNsZVN5c3RlbS5wYXJ0aWNsZUNvdW50ID0gODAwMDsKcGFydGljbGVTeXN0ZW0uc21vb3RoaW5nUmFkaXVzID0gMS4wZjsKcGFydGljbGVTeXN0ZW0ucGFydGljbGVNYXNzID0gMC4xZjsKCi8vIOa3u&amp;#43;WKoOeisOaSnuS9kwp2YXIgY29sbGlkZXIgPSBnYW1lT2JqZWN0LkFkZENvbXBvbmVudDxTcGhDb2xsaWRlck1lc2g&amp;#43;KCk7CmNvbGxpZGVyLnRyYW5zZm9ybS5GaW5kKCJDb2xsaWRhYmxlTWVzaCIpLkdldENvbXBvbmVudDxNZXNoQ29sbGlkZXI&amp;#43;KCk7CgovLyDmt7vliqDmsYLop6PlmagKdmFyIHNvbHZlciA9IGdhbWVPYmplY3QuQWRkQ29tcG9uZW50PFNwaFNvbHZlcj4oKTs=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 获取粒子系统组件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; particleSystem = GetComponent&amp;lt;SphParticleSystem&amp;gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 配置粒子数量和半径&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;particleSystem.particleCount = &lt;span style=&#34;color:#ae81ff&#34;&gt;8000&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;particleSystem.smoothingRadius = &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0f&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;particleSystem.particleMass = &lt;span style=&#34;color:#ae81ff&#34;&gt;0.1f&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 添加碰撞体&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; collider = gameObject.AddComponent&amp;lt;SphColliderMesh&amp;gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collider.transform.Find(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CollidableMesh&amp;#34;&lt;/span&gt;).GetComponent&amp;lt;MeshCollider&amp;gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 添加求解器&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; solver = gameObject.AddComponent&amp;lt;SphSolver&amp;gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;技术细节&#34;&gt;技术细节&lt;/h2&gt;&#xA;&lt;h3 id=&#34;smooth-kernel-functions&#34;&gt;Smooth Kernel Functions&lt;/h3&gt;&#xA;&lt;p&gt;项目实现了三种常用的 SPH 核函数：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Poly6 核函数&lt;/strong&gt;：用于计算密度&lt;/p&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;V19wb2x5NihyLCBoKSA9IDMxNS8oNjTPgGjigbkpICogKGjCsiAtIHLCsinCsyAqIHN0ZXAociwgaCk=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;W_poly6(r, h) = 315/(64πh⁹) * (h² - r²)³ * step(r, h)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Spiky 核函数&lt;/strong&gt;：用于计算压力梯度&lt;/p&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;4oiHV19zcGlreShyLCBoKSA9IC00NS8oz4Bo4oG2KSAqIChoIC0gcinCsiAqIHLMgiAqIHN0ZXAociwgaCk=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;∇W_spiky(r, h) = -45/(πh⁶) * (h - r)² * r̂ * step(r, h)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Viscosity 核函数&lt;/strong&gt;：用于计算粘性力&lt;/p&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;4oiHwrJXX3Zpc2Nvc2l0eShyLCBoKSA9IDQ1LyjPgGjigbYpICogKGggLSByKSAqIHN0ZXAociwgaCk=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;∇²W_viscosity(r, h) = 45/(πh⁶) * (h - r) * step(r, h)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;部分实现代码&#34;&gt;部分实现代码&lt;/h3&gt;&#xA;&lt;div class=&#34;code-wrapper&#34; style=&#34;position: relative; margin-bottom: 1.5em;&#34;&gt;&#xA;    &lt;div class=&#34;code-header-btns&#34;&gt;&#xA;        &lt;button class=&#34;wrap-code-btn&#34; title=&#34;Toggle Wrap&#34;&gt;自动换行&lt;/button&gt;&#xA;        &lt;button class=&#34;copy-code-btn&#34; data-code=&#34;CmZsb2F0IFdwb2x5NihmbG9hdDMgciwgZmxvYXQgaCkKewogICAgcmV0dXJuIDMxNS4wZiAvICg2NC4wZiAqIFBJICogcG93KGgsIDkuMGYpKSAqIHBvdyhoICogaCAtIGRvdChyLCByKSwgMy4wZikgKiBzdGVwKGxlbmd0aChyKSwgaCk7Cn0KCltudW10aHJlYWRzKFBBUlRJQ0xFVEhSRUFEQ09VTlQsMSwxKV0Kdm9pZCBDb21wdXRlRGVuc2l0eVByZXNzdXJlKHVpbnQzIGlkIDogU1ZfRGlzcGF0Y2hUaHJlYWRJRCkKewogICAgU1BIUGFydGljbGUgcGFydGljbGUgPSBwYXJ0aWNsZXNbaWQueF07CiAgICBwYXJ0aWNsZS5kZW5zaXR5ID0gMC4wZjsKCiAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhcnRpY2xlQ291bnQ7IGorKykKICAgIHsKICAgICAgICBwYXJ0aWNsZS5kZW5zaXR5ICs9IG1hc3MgKiBXcG9seTYocGFydGljbGVzW2pdLnBvc2l0aW9uIC0gcGFydGljbGUucG9zaXRpb24sIHNtb290aGluZ1JhZGl1cyk7CiAgICB9CiAgICAvLyDorqHnrpdwcmVzc3VyZQogICAgcGFydGljbGUucHJlc3N1cmUgPSBnYXMgKiAocGFydGljbGUuZGVuc2l0eSAtIHJlc3REZW5zaXR5KTsKCiAgICBwYXJ0aWNsZXNbaWQueF0gPSBwYXJ0aWNsZTsKfQoKCmZsb2F0MyBTaW5nbGVQcmVzc3VyZUZvcmNlKGZsb2F0MyByaSwgZmxvYXQzIHJqLCBmbG9hdCBwaSwgZmxvYXQgcGosIGZsb2F0IGRpLCBmbG9hdCBkaikKewogICAgZmxvYXQgciA9IGxlbmd0aChyaSAtIHJqKTsKICAgIHJldHVybiAocGkgKyBwaikgLyAoMi4wZiAqIGRqKSAqIHBvdyhzbW9vdGhpbmdSYWRpdXMgLSByLCAyLjBmKSAqIChyaSAtIHJqKSAvIHIgKiBzdGVwKHIsIHNtb290aGluZ1JhZGl1cyk7Cn0KCmZsb2F0MyBDb21wdXRlUHJlc3N1cmVGb3JjZSh1aW50IGkpCnsKICAgIGZsb2F0MyBmb3JjZVByZXNzdXJlID0gMDsKICAgIGZvciAodWludCBqID0gMDsgaiA8IHBhcnRpY2xlQ291bnQ7IGorKykKICAgICAgICBmb3JjZVByZXNzdXJlICs9IGkgPT0gagogICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2luZ2xlUHJlc3N1cmVGb3JjZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljbGVzW2ldLnBvc2l0aW9uLCBwYXJ0aWNsZXNbal0ucG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlc1tpXS5wcmVzc3VyZSwgcGFydGljbGVzW2pdLnByZXNzdXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNbaV0uZGVuc2l0eSwgcGFydGljbGVzW2pdLmRlbnNpdHkpOwogICAgLy8gU3Bpa3kg5qC45Ye95pWwCiAgICBmb3JjZVByZXNzdXJlICo9IG1hc3MgKiAoLTQ1LjBmIC8gKFBJICogcG93KHNtb290aGluZ1JhZGl1cywgNi4wZikpKTsKICAgIHJldHVybiBmb3JjZVByZXNzdXJlOwp9CgpmbG9hdDMgU2luZ2xlVmlzY29zaXR5Rm9yY2UoZmxvYXQzIHJpLCBmbG9hdDMgcmosIGZsb2F0IGRpLCBmbG9hdCBkaiwgZmxvYXQgdmksIGZsb2F0IHZqKQp7CiAgICBmbG9hdCByID0gbGVuZ3RoKHJpIC0gcmopOwogICAgcmV0dXJuIChzbW9vdGhpbmdSYWRpdXMgLSByKSAqICh2aiAtIHZpKSAvIGRqICogc3RlcChyLCBzbW9vdGhpbmdSYWRpdXMpOwp9CgpmbG9hdDMgQ29tcHV0ZVZpc2Nvc2l0eUZvcmNlKHVpbnQgaSkKewogICAgZmxvYXQzIGZvcmNlVmlzY29zaXR5ID0gMDsKICAgIGZvciAodWludCBqID0gMDsgaiA8IHBhcnRpY2xlQ291bnQ7IGorKykKICAgICAgICBmb3JjZVZpc2Nvc2l0eSArPSBpID09IGoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2luZ2xlVmlzY29zaXR5Rm9yY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNbaV0ucG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNbal0ucG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNbaV0uZGVuc2l0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlc1tqXS5kZW5zaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljbGVzW2ldLnZlbG9jaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljbGVzW2pdLnZlbG9jaXR5KTsKICAgIC8vIOKIh8KyV192aXNjb3NpdHkg5qC45Ye95pWwCiAgICBmb3JjZVZpc2Nvc2l0eSAqPSBtYXNzICogcGFydGljbGVWaXNjb3NpdHkgKiAoNDUuMGYgLyAoUEkgKiBwb3coc21vb3RoaW5nUmFkaXVzLCA2LjBmKSkpOwogICAgcmV0dXJuIGZvcmNlVmlzY29zaXR5Owp9CgpbbnVtdGhyZWFkcyhQQVJUSUNMRVRIUkVBRENPVU5ULDEsMSldCnZvaWQgQ29tcHV0ZUZvcmNlcyh1aW50MyBpZCA6IFNWX0Rpc3BhdGNoVGhyZWFkSUQpCnsKICAgIGZsb2F0MyBmb3JjZUdyYXZpdHkgPSBncmF2aXR5Lnh5eiAqIHBhcnRpY2xlc1tpZC54XS5kZW5zaXR5ICogZ3Jhdml0eS53OwogICAgcGFydGljbGVzW2lkLnhdLmZvcmNlID0gQ29tcHV0ZVByZXNzdXJlRm9yY2UoaWQueCkgKyBDb21wdXRlVmlzY29zaXR5Rm9yY2UoaWQueCkgKyBmb3JjZUdyYXZpdHk7Cn0=&#34; title=&#34;Copy&#34;&gt;复制&lt;/button&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;code-content&#34;&gt;&#xA;        &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;33&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;34&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;35&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;36&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;37&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;38&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;39&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;40&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;41&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;42&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;43&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;44&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;45&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;46&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;47&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;48&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;49&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;50&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;51&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;52&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;53&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;54&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;55&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;56&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;57&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;58&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;59&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;60&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;61&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;62&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;63&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;64&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;65&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;66&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;67&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;68&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;69&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;70&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;71&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;72&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;73&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;74&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; Wpoly6(float3 r, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; h)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;315.0f&lt;/span&gt; / (&lt;span style=&#34;color:#ae81ff&#34;&gt;64.0f&lt;/span&gt; * PI * pow(h, &lt;span style=&#34;color:#ae81ff&#34;&gt;9.0f&lt;/span&gt;)) * pow(h * h - dot(r, r), &lt;span style=&#34;color:#ae81ff&#34;&gt;3.0f&lt;/span&gt;) * step(length(r), h);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;[numthreads(PARTICLETHREADCOUNT,1,1)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; ComputeDensityPressure(uint3 id : SV_DispatchThreadID)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    SPHParticle particle = particles[id.x];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    particle.density = &lt;span style=&#34;color:#ae81ff&#34;&gt;0.0f&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; j = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; j &amp;lt; particleCount; j++)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        particle.density += mass * Wpoly6(particles[j].position - particle.position, smoothingRadius);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 计算pressure&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    particle.pressure = gas * (particle.density - restDensity);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    particles[id.x] = particle;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;float3 SinglePressureForce(float3 ri, float3 rj, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; pi, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; pj, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; di, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; dj)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; r = length(ri - rj);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (pi + pj) / (&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0f&lt;/span&gt; * dj) * pow(smoothingRadius - r, &lt;span style=&#34;color:#ae81ff&#34;&gt;2.0f&lt;/span&gt;) * (ri - rj) / r * step(r, smoothingRadius);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;float3 ComputePressureForce(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint&lt;/span&gt; i)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    float3 forcePressure = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint&lt;/span&gt; j = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; j &amp;lt; particleCount; j++)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        forcePressure += i == j&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                             ? &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                             : SinglePressureForce(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                 particles[i].position, particles[j].position,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                 particles[i].pressure, particles[j].pressure,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                 particles[i].density, particles[j].density);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Spiky 核函数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    forcePressure *= mass * (-&lt;span style=&#34;color:#ae81ff&#34;&gt;45.0f&lt;/span&gt; / (PI * pow(smoothingRadius, &lt;span style=&#34;color:#ae81ff&#34;&gt;6.0f&lt;/span&gt;)));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; forcePressure;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;float3 SingleViscosityForce(float3 ri, float3 rj, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; di, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; dj, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; vi, &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; vj)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; r = length(ri - rj);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (smoothingRadius - r) * (vj - vi) / dj * step(r, smoothingRadius);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;float3 ComputeViscosityForce(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint&lt;/span&gt; i)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    float3 forceViscosity = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint&lt;/span&gt; j = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; j &amp;lt; particleCount; j++)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        forceViscosity += i == j&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                              ? &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                              : SingleViscosityForce(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                  particles[i].position,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                  particles[j].position,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                  particles[i].density,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                  particles[j].density,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                  particles[i].velocity,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                  particles[j].velocity);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ∇²W_viscosity 核函数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    forceViscosity *= mass * particleViscosity * (&lt;span style=&#34;color:#ae81ff&#34;&gt;45.0f&lt;/span&gt; / (PI * pow(smoothingRadius, &lt;span style=&#34;color:#ae81ff&#34;&gt;6.0f&lt;/span&gt;)));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; forceViscosity;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;[numthreads(PARTICLETHREADCOUNT,1,1)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; ComputeForces(uint3 id : SV_DispatchThreadID)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    float3 forceGravity = gravity.xyz * particles[id.x].density * gravity.w;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    particles[id.x].force = ComputePressureForce(id.x) + ComputeViscosityForce(id.x) + forceGravity;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;button class=&#34;code-toggle-btn&#34; style=&#34;display: none;&#34;&gt;展开代码块&lt;/button&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>宿舍智能门锁</title>
      <link>https://kirari.fun/projects/autolock.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://kirari.fun/projects/autolock.html</guid>
      <description>&lt;p&gt;&lt;figure&#xA;    class=&#34;image-caption image-zoom-container&#34;&#xA;&gt;&#xA;    &#xA;    &lt;input&#xA;        type=&#34;checkbox&#34;&#xA;        id=&#34;img-46accdf5&#34;&#xA;        class=&#34;image-zoom-toggle&#34;&#xA;        aria-label=&#34;放大图片：运行效果&#34;&#xA;    /&gt;&#xA;    &lt;label&#xA;        for=&#34;img-46accdf5&#34;&#xA;        class=&#34;image-zoom-label&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://imgoss.qijieya.cn/imgoss/59/69c280d1b549f.avif&#34;&#xA;            alt=&#34;运行效果&#34;&#xA;            loading=&#34;lazy&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;label&#xA;        for=&#34;img-46accdf5&#34;&#xA;        class=&#34;image-zoom-overlay&#34;&#xA;    &gt;&#xA;        &lt;img&#xA;            src=&#34;https://imgoss.qijieya.cn/imgoss/59/69c280d1b549f.avif&#34;&#xA;            alt=&#34;运行效果&#34;&#xA;            class=&#34;zoomable-image&#34;&#xA;        /&gt;&#xA;    &lt;/label&gt;&#xA;    &#xA;    &lt;figcaption&gt;运行效果&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;实现技术：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;PlatformIO + Esp8266 Server&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
  </channel>
</rss>