自分用メモ

https://wita.noyatsu.club/

3次元極座標と球面調和関数と展開と近似

※この記事は数学に詳しくない一般人が描いたものです.間違っている気がするので話半分で読んでください.修正箇所はコメントにて指摘をお願いします.
※この記事は書き途中です.

球面調和関数

なんか強そう.英語だと Spherical Harmonics.カッコイイ.しかし…

この3次元極方程式を球面調和関数を用いて展開して…

といわれたら ( ゚Д゚)ハァ? となることでしょう. そこでWikipedia大先生を参考にしようとします.

球面調和関数(きゅうめんちょうわかんすう、英: spherical harmonics[1])あるいは球関数(きゅうかんすう、英: spherical functions[2])は以下のいずれかを意味する関数である: n 次元ラプラス方程式の解となる斉次多項式を単位球面に制限する事で得られる関数。 次元 n が 3 の場合の 1 の意味での球面調和関数で、球面座標 (r, θ, φ) で書いたラプラス方程式の変数分離解を記述するのに用いる事ができる関数  Y_{n}^{k} (θ, φ). 本項では 1 及び 2 双方の意味の球面調和関数について述べるが、特に断りがない限り、「球面調和関数」という言葉を 1 の意味で用いる。

( ゚Д゚)ハァ?

そもそも3次元極座標って

極座標と言ったら,高校の時にやりましたね.xy座標の代わりに導入された半径rと角度 \thetaで表される座標系です. f:id:witalosk:20191016232249p:plain 関数も作れます. たとえば r(\theta) = 1とすれば, \thetaに何を入れても1が返ってくるので半径1の円になります.  r(\theta) = 1 + sin(\theta) とすると,お尻のような形になります.このようなものを極方程式といいました.

これを3次元に拡張したのが3次元の極座標系です.

f:id:witalosk:20191016234604p:plain
ファイル:Spherical with grid.svg - Wikipedia

 r(\theta, \phi) =1 とすれば球面になることがわかります.(ちなみに \thetaは0~πしかとりません.緯度経度を思い出しましょう.)

球面調和関数って

これです.
 Y _ {l}^{m} (\theta, \phi) =  (-1)^{(m+|m|)/2} \sqrt{\frac{2l+1}{4\pi} \cdot \frac{(l-|m|)!}{(l+|m|)!}} P _ {l}^{|m|} (cos(\theta))e^{im\phi}

ここで  P _ {l}^{|m|}ルジャンドルの陪関数(というある関数)です. l, mは整数で l=0, 1, 2,... となり, mは各lに対して, m= -l, -l+1, -l+2, ..., l -1, lの2l+1個の値を取ります.これをいきなり見せられても分からないかもしれませんが,前のsectionを読んだ方ならば極方程式(極座標関数)になっていることがわかると思います.半径を Y _ {l}^{m}として図としてみると以下のようになります.上からl=0, 1,...の時です.だんだん増えていっているのはmが2l+1個存在するからですね. f:id:witalosk:20191017000411p:plain
ファイル:Harmoniki.png - Wikipedia

ちょっとナルホド感が出てきませんか?

UnityでAndroidビルドに失敗する( java.lang.NoClassDefFoundError: com/android/tools/lint/gradle/api/ToolingRegistryProvider)

環境

エラー内容

CommandInvokationFailure: Gradle build failed. 
C:\Program Files\Unity\Hub\Editor\2019.1.0f2\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\OpenJDK\Windows\bin\java.exe -classpath "C:\Program Files\Unity\Hub\Editor\2019.1.0f2\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib\gradle-launcher-4.6.jar" org.gradle.launcher.GradleMain "-Dorg.gradle.jvmargs=-Xmx4096m" "assembleRelease"

stderr[

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\Users\USER_DIR\Documents\Unity\dice\Temp\gradleOut\build.gradle' line: 24

* What went wrong:
A problem occurred evaluating root project 'gradleOut'.
> java.lang.NoClassDefFoundError: com/android/tools/lint/gradle/api/ToolingRegistryProvider

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 14s
]
stdout[

]
exit code: 1
UnityEditor.Android.Command.WaitForProgramToRun (UnityEditor.Utils.Program p, UnityEditor.Android.Command+WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) (at <177bc8179be6497489c4b5b319f290d7>:0)
UnityEditor.Android.Command.Run (System.Diagnostics.ProcessStartInfo psi, UnityEditor.Android.Command+WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) (at <177bc8179be6497489c4b5b319f290d7>:0)
UnityEditor.Android.Command.Run (System.String command, System.String args, System.String workingdir, UnityEditor.Android.Command+WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) (at <177bc8179be6497489c4b5b319f290d7>:0)
UnityEditor.Android.AndroidJavaTools.RunJava (System.String args, System.String workingdir, System.Action`1[T] progress, System.String error) (at <177bc8179be6497489c4b5b319f290d7>:0)
UnityEditor.Android.GradleWrapper.Run (UnityEditor.Android.AndroidJavaTools javaTools, System.String workingdir, System.String task, System.Action`1[T] progress) (at <177bc8179be6497489c4b5b319f290d7>:0)
Rethrow as GradleInvokationException: Gradle build failed
UnityEditor.Android.GradleWrapper.Run (UnityEditor.Android.AndroidJavaTools javaTools, System.String workingdir, System.String task, System.Action`1[T] progress) (at <177bc8179be6497489c4b5b319f290d7>:0)
UnityEditor.Android.PostProcessor.Tasks.BuildGradleProject.Execute (UnityEditor.Android.PostProcessor.PostProcessorContext context) (at <177bc8179be6497489c4b5b319f290d7>:0)
UnityEditor.Android.PostProcessor.PostProcessRunner.RunAllTasks (UnityEditor.Android.PostProcessor.PostProcessorContext context) (at <177bc8179be6497489c4b5b319f290d7>:0)
Rethrow as BuildFailedException: Exception of type 'UnityEditor.Build.BuildFailedException' was thrown.
UnityEditor.Android.PostProcessor.CancelPostProcess.AbortBuild (System.String title, System.String message, System.Exception ex) (at <177bc8179be6497489c4b5b319f290d7>:0)
UnityEditor.Android.PostProcessor.PostProcessRunner.RunAllTasks (UnityEditor.Android.PostProcessor.PostProcessorContext context) (at <177bc8179be6497489c4b5b319f290d7>:0)
UnityEditor.Android.PostProcessAndroidPlayer.PostProcess (UnityEditor.BuildTarget target, System.String stagingAreaData, System.String stagingArea, System.String playerPackage, System.String installPath, System.String companyName, System.String productName, UnityEditor.BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.Build.Reporting.BuildReport report) (at <177bc8179be6497489c4b5b319f290d7>:0)
UnityEditor.Android.AndroidBuildPostprocessor.PostProcess (UnityEditor.Modules.BuildPostProcessArgs args, UnityEditor.BuildProperties& outProperties) (at <177bc8179be6497489c4b5b319f290d7>:0)
UnityEditor.PostprocessBuildPlayer.Postprocess (UnityEditor.BuildTargetGroup targetGroup, UnityEditor.BuildTarget target, System.String installPath, System.String companyName, System.String productName, System.Int32 width, System.Int32 height, UnityEditor.BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.Build.Reporting.BuildReport report) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/PostprocessBuildPlayer.cs:281)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

解決方法

Gradleのキャッシュを削除する. 具体的にはC:\Users\USER_DIR\.gradle\caches\modules-2ディレクトリを丸ごと削除.

参考ページ

stackoverflow.com

VR Works Audio がVS2015で動かないとき

NVIDIAVR Works AudioのデモがVS2015以降で動かないとき

ビルド時のエラー:

  • プロジェクトのプロパティ→リンカー→入力オプション→依存ライブラリに legacy_stdio_definitions.lib を加えてみる

実行時のエラー:

  • ドライバは最新ですか?(NVIDIAのHPから最新のドライバをダウンロードしてインストール)

Go言語とgo-glでライフゲーム

f:id:witalosk:20190505140833p:plain 突然Go言語に興味が出てきたので学習しながらいろいろやってみます. よってプロから見るとダメダメなコードを書いている可能性が大です.悪しからず.

続きを読む

CUDAメモ

CUDAでわからなかったもののリストです。 (マジで初歩)

用語

用語 意味
ホスト CPU側、プログラム側
バイス GPU
カーネル バイスで実行されるプログラムのこと(関数、メソッド的な)
スレッド カーネルを実行する最小単位のプロセスのこと, 各々のスレッドは3次元で管理される
ブロック スレッドのかたまり
グリッド ブロックのかたまり

カーネル

  • ホストメモリにはアクセス不可
  • 戻り値の型はvoid
  • 再帰処理はできない
  • 静的変数は使用不可
  • カーネルの前には__global__という関数識別子をつける

呼び出し方

カーネル名<<< dim3 グリッドに含まれるブロックの数(bNum), dim3 ブロックに含まれるスレッドの数(sNum)>>>(カーネルの引数)

※bNum×sNumの数が並列演算する回数(というか総スレッド数)になる

カーネル内で使える変数

__global__device__カーネルからアクセスできる。

変数 意味
blockIdx ブロックのインデックス
threadIdx ブロック内でのスレッドのインデックス
gridDim グリッドの次元(Max: 2D)
blockDim ブロックの次元
  • 3次元を扱うグリッド, ブロックの数やブロック, スレッドのインデックスは dim3型 で表現される
blockIdx.x * blockDim.x + threadIdx.x

を使うと一意のスレッドIDを生成可能。配列の添え字などに使用する。

使い方の例(配列の中身をすべてインクリメントするとき)

C++:

void inc_cpu(int *a, int N)
{
  int idx;
  for (idx = 0; idx<N; idx++)
    a[idx] = a[idx] + 1;
}

void main()
{
  ...
  inc_cpu(a, N);
}

CUDA:

__global__
void inc_gpu(int *a_d, int N)
{
  int idx = blockIdx.x * blockDim.x + threadIdx.x;
  if (idx < N)
    a_d[idx] = a_d[idx] + 1;
}

void main()
{
  …
  dim3 dimBlock (blocksize);
  dim3 dimGrid( ceil( N / (float)blocksize) );
  inc_gpu<<<dimGrid, dimBlock>>>(a_d, N);
}

メソッドについて

  • __mul24(x, y) …24bit以下の2つの整数の掛け算。x*yの結果(32bitまで)を返す。
  • ceil(x) ...xより大きい最小の整数を返す。

VisualStudioでOpenGLを使う

手順

  1. プロジェクトのプロパティを開く
  2. いつものようにC++の全般とリンカの全般でヘッダファイルとライブラリファイルの参照ディレクトリを設定
  3. .exeがあるディレクトリに.dllファイルを移動

終了!