<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数学 on ながむしメモ</title><link>https://nagakagachi.github.io/categories/%E6%95%B0%E5%AD%A6/</link><description>Recent content in 数学 on ながむしメモ</description><generator>Hugo</generator><language>ja-JP</language><lastBuildDate>Wed, 28 Jan 2026 23:46:56 +0900</lastBuildDate><atom:link href="https://nagakagachi.github.io/categories/%E6%95%B0%E5%AD%A6/index.xml" rel="self" type="application/rss+xml"/><item><title>UEマテリアルネタ帳</title><link>https://nagakagachi.github.io/entry/2026/01/28/234656/</link><pubDate>Wed, 28 Jan 2026 23:46:56 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2026/01/28/234656/</guid><description>&lt;p&gt;雑多なネタを書いてあとで探しやすくするためのページ.&lt;/p&gt;&#10;&lt;p&gt;役に立ったらイイネや紹介してね☆（ゝω・）vｷｬﾋﾟ&lt;/p&gt;&#10;&lt;ul class="table-of-contents"&gt;&#10;&lt;li&gt;&lt;a href="#Simplex頂点に任意の乱数を利用できるSimplex-Noise"&gt;Simplex頂点に任意の乱数を利用できるSimplex Noise&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#入力ベクトルの主要軸と第二主要軸を抽出する"&gt;入力ベクトルの主要軸と第二主要軸を抽出する&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="Simplex頂点に任意の乱数を利用できるSimplex-Noise"&gt;Simplex頂点に任意の乱数を利用できるSimplex Noise&lt;/h3&gt;&#10;&lt;p&gt;&lt;iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fnagakagachi.hatenablog.com%2Fentry%2F2023%2F07%2F26%2F135233" title="Simplex頂点に任意の乱数を利用できるSimplex Noise Custom Node[UE][UE5] - ながむしメモ" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"&gt;&lt;/iframe&gt;&lt;cite class="hatena-citation"&gt;&lt;a href="https://nagakagachi.hatenablog.com/entry/2023/07/26/135233"&gt;nagakagachi.hatenablog.com&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&lt;br /&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="入力ベクトルの主要軸と第二主要軸を抽出する"&gt;入力ベクトルの主要軸と第二主要軸を抽出する&lt;/h3&gt;&#10;&lt;p&gt;ベクトルの&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8"&gt;コンポーネント&lt;/a&gt;について絶対値が大きい順で第一位(Dominant), 第二位(Secondary)の軸の情報を抽出する.&lt;br /&gt;&#10;軸インデックス:x=0, y=1, z=2&lt;br /&gt;&#10;と&lt;br /&gt;&#10;軸マスクベクトル (1, 0, 0), (0, 1, 0), (0, 0, 1)&lt;br /&gt;&#10;を返す.&lt;br /&gt;&#10;もっとシンプルな記述ができそうなので後でアップデートするかも.&lt;br /&gt;&#10;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/2f7988364730b8938c8767f1068a1d61ce37261a3bab66557ad5ed82ea7fbfab.png" width="1200" height="717" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;pre class="code lang-cpp" data-lang="cpp" data-unlink&gt;&lt;span class="synType"&gt;const&lt;/span&gt; float3 abs_dir = &lt;span class="synIdentifier"&gt;abs&lt;/span&gt;(in_dir);&#10;&lt;p&gt;&lt;span class="synType"&gt;const&lt;/span&gt; int3 comp0 = abs_dir.xyz &amp;gt; abs_dir.yzx;&#10;&lt;span class="synType"&gt;const&lt;/span&gt; int3 comp1 = abs_dir.xyz &amp;gt; abs_dir.zxy;&#10;&lt;span class="synType"&gt;const&lt;/span&gt; int3 &lt;span class="synType"&gt;rank&lt;/span&gt; = comp0+comp1;&lt;/p&gt;</description></item><item><title>セルシェーディング顔陰用SDFテクスチャ合成の仕組み (SDF Based Transition Blending for Shadow Threshold Map)</title><link>https://nagakagachi.github.io/entry/2024/03/02/140704/</link><pubDate>Sat, 02 Mar 2024 14:07:04 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2024/03/02/140704/</guid><description>&lt;p&gt;&lt;span style="font-size: 80%;"&gt;誤ってページ削除してしまいましたが2024年の記事です&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;セルルックキャ&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E9%A5%AF"&gt;ラク&lt;/a&gt;ターの顔の陰制御に用いられるShadow Threshold Mapを生成する仕組みについて.&lt;br /&gt;連番二値画像からSDFを利用してテクスチャ合成する基本部分の説明を試みます.&lt;/p&gt;&#10;&lt;p&gt;(Face Thresholdテクスチャ, Shadow Thresholdテクスチャ, SDFテクスチャ などとも)&lt;/p&gt;&#10;&lt;blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"&gt;&#10;&lt;p dir="ltr" lang="ja"&gt;SDFによる補間で Shadow Threshold Map を連番画像から自動生成するツール&lt;br /&gt;&lt;br /&gt;を&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/GitHub"&gt;GitHub&lt;/a&gt;のSDFツールの中にUPしました.&lt;br /&gt;&lt;br /&gt;EUW_GenerateShadowThresholdMap がツール自体.&lt;br /&gt;現状は全画像が等間隔な&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%EF%E7%C3%CD"&gt;閾値&lt;/a&gt;になります.&lt;br /&gt;&lt;br /&gt;合成方法の説明などドキュメントは後で(∩´∀｀)∩&lt;a href="https://t.co/6GdbEja9o3"&gt;https://t.co/6GdbEja9o3&lt;/a&gt;&lt;a href="https://twitter.com/hashtag/UE5?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#UE5&lt;/a&gt; &lt;a href="https://t.co/52QUQek23i"&gt;pic.twitter.com/52QUQek23i&lt;/a&gt;&lt;/p&gt;&#10;— なが (@nagakagachi) &lt;a href="https://twitter.com/nagakagachi/status/1732041139325489588?ref_src=twsrc%5Etfw"&gt;2023年12月5日&lt;/a&gt;&lt;/blockquote&gt;&#10;&lt;p&gt;&#10;&lt;script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;&#10;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="概要"&gt;概要&lt;/h3&gt;&#10;&lt;p&gt;&lt;img src="images/e964cbb37d67738f7ee3261802f9013a60c997ee916df1f2ee6395aa10604695.png" width="1200" height="298" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /&gt;&lt;br /&gt;&lt;img src="images/5056f97907159cb92c7d91829eed6fb23e038cde4f12f324881a86553ff5e153.png" width="1200" height="959" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /&gt;&lt;/p&gt;&#10;&lt;p&gt;UE5上のツールとしては以下のSDF関連ツールに含まれています.&lt;br /&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D6%A5%E9%A5%C3%A5%AF%A5%DC%A5%C3%A5%AF%A5%B9"&gt;ブラックボックス&lt;/a&gt;無しでBPとマテリアルとして実装しているので詳細はそちらをご確認ください.&lt;br /&gt;&lt;iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fnagakagachi%2FNagaSdfTextureToolForUE" title="GitHub - nagakagachi/NagaSdfTextureToolForUE: Tools for generating SDF from textures in Unreal Engine" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"&gt;&lt;/iframe&gt;&lt;cite class="hatena-citation"&gt;&lt;a href="https://github.com/nagakagachi/NagaSdfTextureToolForUE"&gt;github.com&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&#10;&lt;br /&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="アルゴリズム"&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0"&gt;アルゴリズム&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;ここでは最もシンプルと思われる&lt;strong&gt;C0連続&lt;/strong&gt;な合成を考えます.&lt;br /&gt;連番二値画像間の遷移速度をよりなめらかにしたい場合はC1連続となるように合成するのが良いかもしれません.&lt;/p&gt;&#10;&lt;p&gt;連番の連続する2枚ずつを処理していきます.&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="処理対象の連続するペア"&gt;処理対象の連続するペア&lt;/h4&gt;&#10;&lt;figure class="figure-image figure-image-fotolife" title="連番のi番目とi+1番目の例"&gt;&lt;img src="images/943980dea4019b8066142c39379518461f9726283449391830ebf67775aa9661.png" alt="" width="1200" height="334" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /&gt;&#10;&lt;figcaption&gt;連番のi番目とi+1番目の例&lt;/figcaption&gt;&#10;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="SDF生成"&gt;SDF生成&lt;/h4&gt;&#10;&lt;p&gt;二値画像のSDFを計算.&lt;br&gt;&#10;内部側の距離も必要なのでSigned Distance Fieldである必要があります.&lt;/p&gt;</description></item><item><title>【UE5】Niagara SimulationStageでNormalMapからHeightMapを復元する(Poisson方程式)</title><link>https://nagakagachi.github.io/entry/2023/12/16/161144/</link><pubDate>Sat, 16 Dec 2023 16:11:44 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2023/12/16/161144/</guid><description>&lt;p&gt;&lt;span&gt;&lt;style&gt;&#10;img{&#10;display: inline-block;&#10;box-sizing: border-box;&#10;border: solid 1px #333;&#10;}&#10;&lt;/style&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Unreal%20Engine"&gt;Unreal Engine&lt;/a&gt; Advent Calendar 2023 の16日の記事です. &lt;a href="https://qiita.com/advent-calendar/2023/ue"&gt;Unreal Engine (UE)&amp;#x306E;&amp;#x30AB;&amp;#x30EC;&amp;#x30F3;&amp;#x30C0;&amp;#x30FC; | Advent Calendar 2023 - Qiita&lt;/a&gt;&lt;/p&gt;&lt;p&gt;最近HoudiniでNormalMapからHeightMapを復元するというものを見かけ,&lt;br /&gt;&#10;Poisson方程式を解くのであればSimulationStageで実装することができるのではと考えました.&lt;blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"&gt;&lt;p lang="ja" dir="ltr"&gt;というわけで、&lt;a href="https://twitter.com/TearsOfJake?ref_src=twsrc%5Etfw"&gt;@TearsOfJake&lt;/a&gt; さんのアド&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9"&gt;バイス&lt;/a&gt;を元に、 &lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DD%A5%A2%A5%BD%A5%F3%CA%FD%C4%F8%BC%B0"&gt;ポアソン方程式&lt;/a&gt;を用いたノーマルマップからハイトマップの復元。昨日の勾配のみの復元に比べて圧倒的に安定している。 &lt;br&gt;左：入力メッシュ &lt;br&gt;中：入力メッシュから求めたノーマルマップ&lt;br&gt;右：ノーマルマップから復元した高さ情報 &lt;a href="https://t.co/NiNyVvvrbS"&gt;pic.twitter.com/NiNyVvvrbS&lt;/a&gt;&lt;/p&gt;&amp;mdash; &lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Akira"&gt;Akira&lt;/a&gt; Saito (@a_saito) &lt;a href="https://twitter.com/a_saito/status/1721076487150084376?ref_src=twsrc%5Etfw"&gt;2023年11月5日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt; &lt;/p&gt;&lt;br /&gt;&#10;&lt;p&gt;この記事では「NormalMapからHeightMapを復元する」という問題をSimulationStageで実装する方法を紹介します.&lt;br /&gt;&#10;サンプルプロジェクトは以下のGoogleDriveになります (動作確認バージョン UE5.3).&lt;br /&gt;&#10;&lt;a href="https://drive.google.com/file/d/13X7s09O3bYuvWyIRp3HkDaNOcjrpnOdy/view?usp=sharing"&gt;ReconstructHeightMapFromNormal.zip - Google &amp;#x30C9;&amp;#x30E9;&amp;#x30A4;&amp;#x30D6;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/811419472fa7cff90fd29f512ec692d5e3a1ed029c96a017cf78f1c960ef9310.png" width="1200" height="657" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="Niagara-SimulationStage"&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Niagara"&gt;Niagara&lt;/a&gt; SimulationStage&lt;/h3&gt;&#10;&lt;p&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Niagara"&gt;Niagara&lt;/a&gt; SimulationStage はComputeShader的な&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/GPGPU"&gt;GPGPU&lt;/a&gt;処理を&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Niagara"&gt;Niagara&lt;/a&gt;モジュールとして作成できる仕組みです.&lt;br /&gt;&#10;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Epic%20Games"&gt;Epic Games&lt;/a&gt;公式の&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Niagara"&gt;Niagara&lt;/a&gt; Fluids等でも多用されています(本当にSimulationStageでほとんどの処理が作られています まじかよ).&lt;/p&gt;&lt;p&gt;SimulationStage は2D/3Dのグリッド構造に対する&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/GPGPU"&gt;GPGPU&lt;/a&gt;処理を比較的簡単に作ることができるように設計されています.&lt;br /&gt;&#10;これには数値シミュレーションで必要とされる反復実行なども含まれています.&lt;br /&gt;&#10;目的のタスクを適切な形に変形してSimulationStageで実装することで, &lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/GPU"&gt;GPU&lt;/a&gt;による高速な実行が可能になります.&lt;br /&gt;&#10;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/f98da2e455903354e0d62a7fb3506e1d0408098ff6cc774991c5c248069f90f1.png" width="1200" height="816" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="NormalMapからHeightMapを復元する問題"&gt;NormalMapからHeightMapを復元する問題&lt;/h3&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="Poisson方程式"&gt;Poisson方程式&lt;/h3&gt;&#10;&lt;p&gt;ある関数の二階の空間&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%C8%F9%CA%AC"&gt;微分&lt;/a&gt;と別の関数との関係式をPoisson方程式といいます.&lt;br /&gt;&#10;Poisson方程式は離散化によって連立一次方程式へ変形することができ, 連立一次方程式を解く方法は様々に研究されています.&lt;br /&gt;&#10;対象の問題をPoisson方程式, ひいては連立一次方程式の形にすることができれば, Solverや解法を利用して解くことができます.&lt;/p&gt;&lt;p&gt;&lt;span class="math-inline"&gt;\(\Delta \phi =-\dfrac{\rho}{\epsilon_0}\)&lt;/span&gt;&lt;br /&gt;&#10;&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="Poisson方程式への変形"&gt;Poisson方程式への変形&lt;/h4&gt;&#10;&lt;p&gt;今回は NormalMapとHeightMapの関係をPoisson方程式で表現して離散化, 連立一次方程式として解くことにします.&lt;/p&gt;&#10;&lt;p&gt;NormalMapのxy成分はHeightMapの空間&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%C8%F9%CA%AC"&gt;微分&lt;/a&gt;(勾配)から求められます.&lt;br /&gt;&#10;&lt;span class="math-inline"&gt;\(N_x(x,y)= -\dfrac { \partial H(x,y)}{\partial x}\)&lt;/span&gt;&lt;br /&gt;&#10;&lt;span class="math-inline"&gt;\(N_y(x,y)= -\dfrac { \partial H(x,y)}{\partial y}\)&lt;/span&gt;&lt;br /&gt;&#10;さらにそれぞれ x, y で&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%CA%D0%C8%F9%CA%AC"&gt;偏微分&lt;/a&gt;します.&lt;/p&gt;&lt;p&gt;&lt;span class="math-inline"&gt;\(\dfrac {\partial N_x(x,y)}{\partial x}= -\dfrac { \partial^2 H(x,y)}{\partial x^2}\)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="math-inline"&gt;\(\dfrac {\partial N_y(x,y)}{\partial y}= -\dfrac { \partial^2 H(x,y)}{\partial y^2}\)&lt;/span&gt;&lt;br /&gt;&#10;ここで上の式はPoisson方程式の形になっています.&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h5 id="差分方程式"&gt;差分方程式&lt;/h5&gt;&#10;&lt;p&gt;このPoisson方程式を離散化すると以下のようになります.&lt;br /&gt;&#10;(&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%C5%EC%B3%A4%C2%E7%B3%D8"&gt;東海大学&lt;/a&gt;理学部遠藤研究室さんのページ等がわかりやすいです. -&gt; &lt;a href="https://teamcoil.sp.u-tokai.ac.jp/lectures/EL1/Poisson/index.html"&gt;&amp;#x96FB;&amp;#x78C1;&amp;#x5834;(SP)&lt;/a&gt; )&lt;/p&gt;&lt;p&gt;&lt;span class="math-inline"&gt;\(\frac {N_x(x+h,y) - N_x(x-h,y)}{2h}= -\frac {H(x+h,y)+H(x-h,y) - 2H(x,y)}{h^2}\)&lt;/span&gt;&lt;br /&gt;&#10;&lt;span class="math-inline"&gt;\(\frac {N_x(x,y+h) - N_x(x,y-h)}{2h}= -\frac {H(x,y+h)+H(x,y-h) - 2H(x,y)}{h^2}\)&lt;/span&gt;&lt;br /&gt;&#10;(左辺は中心差分)&lt;/p&gt;&lt;p&gt;2つの式を足して左辺のNormalMap, 右辺にHeightMapに関わる項をまとめて整理します.&lt;br /&gt;&#10;またテクセルでの&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%C8%F9%CA%AC"&gt;微分&lt;/a&gt;(差分)のため &lt;span class="math-inline"&gt;\(h = 1\)&lt;/span&gt; とします.&lt;br /&gt;&#10;&lt;span class="math-inline"&gt;\(- \frac {N_x(x+1,y) - N_x(x-1,y) + N_x(x,y+1) - N_x(x,y-1)}{2} \\= H(x+1,y)+H(x-1,y) + H(x,y+1)+H(x,y-1) - 4H(x,y)\)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;上の式の左辺は入力NormalMapとして与えられる既知の値, 右辺は求めたいHeightMapのいくつかの地点の値に係数をかけたものの和です.&lt;br /&gt;&#10;よってこれは左辺を定数&lt;span class="math-inline"&gt;\(b\)&lt;/span&gt;, 未知のHeightMapを&lt;span class="math-inline"&gt;\(x\)&lt;/span&gt;, 近傍HeightMap値への係数を行列&lt;span class="math-inline"&gt;\(A\)&lt;/span&gt;とした連立一次方程式ということになります.&lt;br /&gt;&#10;&lt;span class="math-inline"&gt;\(b = Ax\)&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;連立一次方程式を解くために更に変形していきます.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h5 id="Jacobi法"&gt;Jacobi法&lt;/h5&gt;&#10;&lt;p&gt;見通しをよくするために左辺は記号で置き換えておきます.&lt;br /&gt;&#10;&lt;span class="math-inline"&gt;\(-N_{d} = H(x+1,y)+H(x-1,y) + H(x,y+1)+H(x,y-1) - 4H(x,y)\)&lt;/span&gt; &lt;br /&gt;&#10;(ここで &lt;span class="math-inline"&gt;\(N_{d} =\frac {N_x(x+1,y) - N_x(x-1,y) + N_x(x,y+1) - N_x(x,y-1)}{2}\)&lt;/span&gt; )&lt;/p&gt;&lt;p&gt;&lt;span class="math-inline"&gt;\(H(x,y)\)&lt;/span&gt; に関する形に変形します.&lt;/p&gt;&lt;p&gt;&lt;span class="math-inline"&gt;\(H(x,y) = \frac{(H(x+1,y)+H(x-1,y)+H(x,y+1)+H(x,y-1)) + N_{d} }{4}\)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;この式を反復的に計算することで &lt;span class="math-inline"&gt;\(H(x,y)\)&lt;/span&gt; を解に近づけていく方法をJacobi法といいます.&lt;br /&gt;&#10;プログラム的に考えると&lt;strong&gt;HeightMapの各テクセルについて上下左右の近傍値とNormalMapの値を使って更新&lt;/strong&gt;しているといえます.&lt;br /&gt;&#10;現在のHeightMapから次のHeightMapの各テクセルを並列に計算できるため&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/GPGPU"&gt;GPGPU&lt;/a&gt;とも相性が良いです.&lt;br /&gt;&#10;次はJacobi法によるHeightMapの計算を&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Niagara"&gt;Niagara&lt;/a&gt; SimulationStageで実装します.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>RGB信号の輝度について</title><link>https://nagakagachi.github.io/entry/2021/12/14/234241/</link><pubDate>Tue, 14 Dec 2021 23:42:41 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2021/12/14/234241/</guid><description>&lt;p&gt;そういえば と思って調べたこと.&lt;/p&gt;&#10;&lt;p&gt;RGBの3次元ベクトルから輝度を計算するときに出てくるあの係数.&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="font-size: 80%"&gt;sRGB色空間の場合&lt;/span&gt;&lt;br /&gt;&#10;&lt;span class="math-inline"&gt;\(Luminance = &#10;dot(&#10;\begin{pmatrix}&#10;R_{sRGB}\\G_{sRGB}\\B_{sRGB}\\ &#10;\end{pmatrix}&#10;, &#10;&lt;p&gt;\begin{pmatrix}&#10;0.2126\0.7152\0.0722\&#10;\end{pmatrix}&#10;))&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;span class="math-inline"&gt;\(\begin{pmatrix}&#10;0.2126\\0.7152\\0.0722\\ &#10;\end{pmatrix}\)&lt;/span&gt;&lt;br /&gt;&#10;↑これ&lt;/p&gt;&lt;br /&gt;&#10;&lt;p&gt;これはRGB値をその色空間(↑の場合はsRGB)からXYZ色空間へ変換する変換行列のY座標に関する成分.&lt;/p&gt;&#10;&lt;p&gt;XYZ色空間のYは輝度と定義されているため, XYZ色空間のY座標のみ計算しているということなんですね.&lt;/p&gt;&#10;&lt;br /&gt;&#10;&lt;p&gt;&lt;span class="math-inline"&gt;\(\begin{align}&#10;\begin{pmatrix}&#10;X\\Y\\Z\\ &#10;\end{pmatrix} &amp;amp;=&#10;\begin{pmatrix}&#10;0.4123908&amp;amp;0.35758434&amp;amp;0.18048079\\&#10;0.21263901&amp;amp;0.71516868&amp;amp;0.07219232\\&#10;0.01933082&amp;amp;0.11919478&amp;amp;0.95053215\\&#10;\end{pmatrix}&#10;\begin{pmatrix}&#10;R_{sRGB}\\G_{sRGB}\\B_{sRGB}\\ &#10;\end{pmatrix} \\&#10;&amp;amp;=&#10;\begin{pmatrix}&#10;0.4123908R_{sRGB}+0.35758434G_{sRGB}+0.18048079B_{sRGB}\\&#10;0.21263901R_{sRGB}+0.71516868G_{sRGB}+0.07219232B_{sRGB}\\&#10;0.01933082R_{sRGB}+0.11919478G_{sRGB}+0.95053215B_{sRGB}\\&#10;\end{pmatrix}&#10;\end{align}\)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&#10;&lt;p&gt;↑の式では四捨五入していないので最初の式と少し違うけれど、Yはそういうこと.&lt;/p&gt;&#10;&lt;p&gt;別の色空間のRGBなら別の係数になるのも当然. 注意重点.&lt;/p&gt;&#10;&lt;br /&gt;&#10;&lt;p&gt;色空間の変換行列がたくさん乗っているページ.&lt;br /&gt;&#10;本当に正しい値かはチェックが必要だけれどとても参考になる.&lt;br /&gt;&#10;&lt;a href="http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html"&gt;Welcome to Bruce Lindbloom&amp;#39;s Web Site&lt;/a&gt;&lt;/p&gt;&#10;&lt;figure class="figure-image figure-image-fotolife" title="http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html"&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/3d073a5da154adc22095bc6688eaf4a54a2a82f9d0500666ae0e84a67e7ad2d0.png" alt="f:id:nagakagachi:20211215001404p:plain" width="854" height="325" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;figcaption&gt;&lt;a href="http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html"&gt;http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;&lt;a href="https://nagakagachi.hatenablog.com/entry/2021/12/14/234241"&gt;元のはてなブログ記事&lt;/a&gt;&lt;/p&gt;</description></item><item><title> UE4マテリアルによるDistanceField生成(Jump Floodingアルゴリズム)</title><link>https://nagakagachi.github.io/entry/2021/11/07/231935/</link><pubDate>Sun, 07 Nov 2021 23:19:35 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2021/11/07/231935/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;2023/12/16更新&lt;br /&gt;&#10;SDF生成ツールをUE5向けに公開しました.&lt;blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"&gt;&lt;p lang="ja" dir="ltr"&gt;SDFテクスチャをテクスチャ2Dから生成するUE5上のツール. &lt;br&gt;別の作業のために生えてきた. Jump Floodingを&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/GPU"&gt;GPU&lt;/a&gt;(マテリアル)で実行.&lt;br&gt;&lt;br&gt;入力テクスチャは黒かそうでないかで外部/内部扱いしたSDF計算. 出力は RチャンネルにUV距離, Gチャンネルに内部フラグ. MIT License &lt;a href="https://twitter.com/hashtag/UE5?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#UE5&lt;/a&gt; &lt;a href="https://t.co/6GdbEja9o3"&gt;https://t.co/6GdbEja9o3&lt;/a&gt; &lt;a href="https://t.co/ogWdxzP5Xm"&gt;pic.twitter.com/ogWdxzP5Xm&lt;/a&gt;&lt;/p&gt;&amp;mdash; なが (@nagakagachi) &lt;a href="https://twitter.com/nagakagachi/status/1730982828358390040?ref_src=twsrc%5Etfw"&gt;2023年12月2日&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt; &lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;サンプルプロジェクト有 (&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/UE4"&gt;UE4&lt;/a&gt;.27).&lt;/p&gt;&lt;p&gt;Jump Flooding &lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0"&gt;アルゴリズム&lt;/a&gt;によるDistanceField生成をUEマテリアルで実装したメモ.&lt;br /&gt;&#10;ついでに Editor Utility &lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Widget"&gt;Widget&lt;/a&gt; でSeedテクスチャの生成とDistanceFieldの生成をトリガーするテスト.&lt;/p&gt;&lt;p&gt;Jump Flooding Algorithm (&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;)の詳細については各種資料参照.&lt;br /&gt;&#10;&lt;a href="https://www.comp.nus.edu.sg/~tants/jfa/i3d06.pdf"&gt;https://www.comp.nus.edu.sg/~tants/jfa/i3d06.pdf&lt;/a&gt;&lt;br /&gt;&#10;&lt;a href="https://en.wikipedia.org/wiki/Jump_flooding_algorithm"&gt;Jump flooding algorithm - Wikipedia&lt;/a&gt;&lt;br /&gt;&#10;&lt;a href="https://observablehq.com/@rreusser/gpu-voronoi-diagrams-using-the-jump-flooding-algorithm"&gt;GPU Voronoi Diagrams using the Jump Flooding Algorithm / Ricky Reusser | Observable&lt;/a&gt;&lt;/p&gt;&#10;&lt;ul class="table-of-contents"&gt;&#10;&lt;li&gt;&lt;a href="#サンプルプロジェクト"&gt;サンプルプロジェクト&lt;/a&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="#DistanceFieldテクスチャ生成手順"&gt;DistanceFieldテクスチャ生成手順&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#アセット説明"&gt;アセット説明&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#Jump-Flooding-ステップ"&gt;Jump Flooding ステップ&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#その他"&gt;その他&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="サンプルプロジェクト"&gt;サンプルプロジェクト&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1FEnmbDwYRBIwaszz5AE0AYxZszL3f-ga/view?usp=sharing"&gt;DistanceFIeldByJFA00.zip - Google &amp;#x30C9;&amp;#x30E9;&amp;#x30A4;&amp;#x30D6;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&#10;&lt;p&gt;プロジェクトの[ThirdPersonBP/DF]に関連BPやマテリアル等がある.&lt;/p&gt;&#10;&lt;figure class="figure-image figure-image-fotolife" title="関連コンテンツフォルダ"&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/01ee4bded480ce2abd6147c04de23b1413901b2a887326cf8354440d16665e4b.png" width="1200" height="683" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;figcaption&gt;関連コンテンツフォルダ&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="DistanceFieldテクスチャ生成手順"&gt;DistanceFieldテクスチャ生成手順&lt;/h4&gt;&#10;&lt;p&gt;&lt;strong&gt;EUW_JfaTestアセット&lt;/strong&gt; を右クリック-&gt;Run Editor Utility &lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Widget"&gt;Widget&lt;/a&gt; で&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Widget"&gt;Widget&lt;/a&gt;を表示する.&lt;br /&gt;&#10;&lt;strong&gt;Generate Seed Texture ボタン&lt;/strong&gt; を押すとマテリアルによってSeedテクスチャが更新される.&lt;/p&gt;&#10;&lt;figure class="figure-image figure-image-fotolife" title="Generate SeedTexture"&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/82eb92868758e2a8f2520e7a7580d5e0ee3378cbcf69ee53fcd3a5849db86ecc.png" width="1015" height="627" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;figcaption&gt;Generate SeedTexture&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Run &lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt; ボタン&lt;/strong&gt; を押すとSeedテクスチャを元にDistanceFieldテクスチャが生成される.&lt;/p&gt;&#10;&lt;figure class="figure-image figure-image-fotolife" title="DistanceField生成"&gt;&lt;span itemscope itemtype="http://schema.org/Photograph"&gt;&lt;img src="images/754ad1b9f0b4e013903449f9f98036a615c7b432b20a868ef78f5bbfd07613fa.png" width="932" height="615" loading="lazy" title="" class="hatena-fotolife" itemprop="image"&gt;&lt;/span&gt;&lt;figcaption&gt;Generate DistanceField&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="アセット説明"&gt;アセット説明&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;RT_Seed&#10;&lt;ul&gt;&#10;&lt;li&gt;DistanceFieldの元になるSeedテクスチャ. 黒テクセルは無効で, それ以外の色のテクセルがSeedとして評価される.&lt;/li&gt;&#10;&lt;li&gt;どんなテクスチャでもよいが,今回はマテリアルM_DistanceSeedでその場で生成している.&lt;/li&gt;&#10;&lt;li&gt;サイズはデフォルト512x512だが変更可能. ただし動作確認しているのは2の冪のみ.&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;RT_Jfa0&#10;&lt;ul&gt;&#10;&lt;li&gt;DistanceFieldの出力先テクスチャ.&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;M_DistanceSeed&#10;&lt;ul&gt;&#10;&lt;li&gt;Seedテクスチャの生成用マテリアル. 適当な計算で適当な位置に黒(0,0,0)ではないSeedを書き込む.&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;MF_JumpFlood&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;のメイン処理をCustomNodeで記述したMaterialFunction. M_JumpFlood_SetupとM_JumpFlood_Itrはこれを呼び出す.&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;M_JumpFlood_Setup&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;の初回パス用マテリアル. Seedテクスチャを元に黒(0,0,0)ではないテクセルをSeedとして&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;の初回パスを実行する.&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;M_JumpFlood_Itr&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;の反復パス用マテリアル. 基本的には初回パスと同じだが,&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;入力が前回の&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;パスの結果テクスチャになる.&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;M_JumpFlood_Copy&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;結果テクスチャを元に出力先テクスチャRT_Jfa0 へ出力するマテリアル.&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;li&gt;EUW_JfaTest&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;処理のMaterialDrawなどをする&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/Widget"&gt;Widget&lt;/a&gt;. 今回の&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;関連の処理はほぼここに書いてある.&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;のワークテクスチャ(PingPong用に2枚)を内部で生成して利用する.&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="keyword" href="https://d.hatena.ne.jp/keyword/JFA"&gt;JFA&lt;/a&gt;自体はテクスチャサイズXに対して (log2(X)-1)回のマテリアルDrawで完了する.&lt;/li&gt;&#10;&lt;/ul&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Voxel Mesh化手法についてメモ( Voxel Meshing )</title><link>https://nagakagachi.github.io/entry/2020/08/22/180515/</link><pubDate>Sat, 22 Aug 2020 18:05:15 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2020/08/22/180515/</guid><description>&lt;p&gt;SDFなどのVoxelからMeshを生成する手法のメモ。&lt;/p&gt;&#10;&lt;p&gt;もとのSDFのセルと、Mesh化で管理されるVoxelは一致しないので注意。&lt;/p&gt;&#10;&lt;p&gt;もとのSDFのセル中心を頂点とするようなVoxel上でMesh化が実行される。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="marching--cubes"&gt;Marching Cubes&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="http://paulbourke.net/geometry/polygonise/"&gt;Polygonising a scalar field (Marching Cubes)&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Voxelの頂点のパターンからそのVoxelのポリゴンパターンをLookupしてMesh化する。&lt;/p&gt;&#10;&lt;p&gt;シャープな形状が作りにくいらしい。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="dual-contour"&gt;Dual Contour&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://people.eecs.berkeley.edu/~jrs/meshpapers/SchaeferWarren2.pdf"&gt;https://people.eecs.berkeley.edu/~jrs/meshpapers/SchaeferWarren2.pdf&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;あるVoxelを構成する辺について、SDFをの符号が異なる両端を持つ辺に注目し、辺を横切るような等値面の交差位置と法線をSDFの勾配等から計算する。&lt;/p&gt;&#10;&lt;p&gt;一つのVoxelについて境界面は複数存在する可能性があり、すべての境界面からの距離の自乗和が最小になるような一点をそのVoxel内の頂点として最小二乗法で推定する。&lt;/p&gt;&#10;&lt;p&gt;すべてのVoxelについて上記の点を計算し、隣接Cellで点同士をつなげてMeshを構成する。&lt;/p&gt;&#10;&lt;p&gt;シャープな形状を作ることができるらしい。&lt;/p&gt;&#10;&lt;p&gt;Voxel毎に最小二乗法を解く必要があるためコストが高い可能性。&lt;/p&gt;&#10;&lt;p&gt;また自己交差メッシュができてしまう可能性もある。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="surfacenets"&gt;SurfaceNets&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://www.merl.com/publications/docs/TR99-24.pdf"&gt;https://www.merl.com/publications/docs/TR99-24.pdf&lt;/a&gt;&lt;br /&gt;&#10;&lt;a href="https://medium.com/@bonsairobo/smooth-voxel-mapping-a-technical-deep-dive-on-real-time-surface-nets-and-texturing-ef06d0f8ca14"&gt;Smooth Voxel Mapping: a Technical Deep Dive on Real-time Surface Nets and Texturing | by DreamCat Games | Aug, 2020 | Medium&lt;/a&gt;&lt;br /&gt;&#10;&lt;a href="https://github.com/TomaszFoster/NaiveSurfaceNets/blob/master/NaiveSurfaceNets.cs"&gt;NaiveSurfaceNets/NaiveSurfaceNets.cs at master &amp;middot; TomaszFoster/NaiveSurfaceNets &amp;middot; GitHub&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&#10;&lt;p&gt;Meshを構成するVoxel内の頂点を推定することはDual Contourと同様だが、複数ある辺と等値面の交差位置を平均した地点を頂点位置とするところが異なる。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;&lt;a href="https://nagakagachi.hatenablog.com/entry/2020/08/22/180515"&gt;元のはてなブログ記事&lt;/a&gt;&lt;/p&gt;</description></item><item><title>最適化 Newton法メモ</title><link>https://nagakagachi.github.io/entry/2018/07/28/002457/</link><pubDate>Sat, 28 Jul 2018 00:24:57 +0900</pubDate><guid>https://nagakagachi.github.io/entry/2018/07/28/002457/</guid><description>&lt;p&gt;自分の言葉で書いて覚えるため（誤りがあればご指摘ください）&lt;/p&gt;&#10;&lt;br /&gt;&#10;&lt;p&gt; 関数 &lt;span class="math-inline"&gt;\(f(\vec{x})\)&lt;/span&gt; の2次までのTaylor展開&lt;/p&gt;&lt;p&gt;&lt;span class="math-inline"&gt;\(f(\vec{x} + \vec{h}) = f(\vec{x}) + dot(\nabla f(\vec{x}), \vec{h}) + \frac{1}{2} dot(\vec{h^T}, \nabla^2 f(\vec{x})\vec{h})\)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;ここで &lt;span class="math-inline"&gt;\(\nabla^2 f(\vec{x})\)&lt;/span&gt; はHesse行列&lt;/p&gt;&lt;p&gt;右辺を最小化にするような&lt;span class="math-inline"&gt;\(\vec{h}\)&lt;/span&gt;によって&lt;span class="math-inline"&gt;\(\vec{x}_{next} = \vec{x} + \vec{h}\)&lt;/span&gt;と更新することで&lt;br /&gt;&#10;&lt;span class="math-inline"&gt;\(f(\vec{x})\)&lt;/span&gt;をより小さくする&lt;span class="math-inline"&gt;\(\vec{x}\)&lt;/span&gt;が得られる。&lt;br /&gt;&#10;そのために&lt;span class="math-inline"&gt;\(\vec{h}\)&lt;/span&gt;で&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC"&gt;微分&lt;/a&gt;して&lt;span class="math-inline"&gt;\(=0\)&lt;/span&gt;となるような&lt;span class="math-inline"&gt;\(\vec{h}\)&lt;/span&gt;を求める&lt;/p&gt;&lt;p&gt;&lt;span class="math-inline"&gt;\(\frac{\mathrm{d} f(\vec{x}+\vec{h})}{\mathrm{d} \vec{h}} = \frac{\mathrm{d} f(\vec{x})}{\mathrm{d} \vec{h}} + \frac{\mathrm{d} dot(\nabla f(\vec{x}), \vec{h})}{\mathrm{d}\vec{h}} + \frac{1}{2} \frac{\mathrm{d} dot(\vec{h^T}, \nabla^2 f(\vec{x})\vec{h})}{\mathrm{d} \vec{h}} = 0\)&lt;/span&gt;&lt;br /&gt;&#10; &lt;br /&gt;&#10;右辺第一項は変数&lt;span class="math-inline"&gt;\(\vec{h}\)&lt;/span&gt;が無いので&lt;span class="math-inline"&gt;\(0\)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;右辺第二項は&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%E2%C0%D1"&gt;内積&lt;/a&gt;をベクトル&lt;span class="math-inline"&gt;\(\vec{h}\)&lt;/span&gt;で&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC"&gt;微分&lt;/a&gt;するので&lt;span class="math-inline"&gt;\(\nabla f(\vec{x})\)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;右辺第三項は二次の同次&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%BF%B9%E0%BC%B0"&gt;多項式&lt;/a&gt;の二次形式&lt;span class="math-inline"&gt;\(dot(\vec{x^T}, A\vec{x})\)&lt;/span&gt;の&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%F9%CA%AC"&gt;微分&lt;/a&gt;なので、&lt;/p&gt;&lt;p&gt;&lt;span class="math-inline"&gt;\(\frac{1}{2} \frac{\mathrm{d} dot(\vec{h^T}, \nabla^2 f(\vec{x})\vec{h})}{\mathrm{d} \vec{h}} = \frac{1}{2} (\nabla^2 f(\vec{x}) + \nabla^2 f(\vec{x})^T)\vec{h}\)&lt;/span&gt;&lt;/p&gt;</description></item></channel></rss>