1. 今週の予定
今週も予定を見直す時間がありませんでした。ぶっつけ本番でやっていきます。
以下の内容を勉強します。
- 映像作品としてのLevelの作成
- AIの勉強
- Nvidia Omniverseの勉強
- Gaeaの勉強
- Houdiniの勉強
- UEFNの勉強
- DirectX12の勉強
2. 映像作品としてのLevelの作成
2.1 今週の予定
先週のBlogを見ると今週は以下の事をやると書いています。
やっていきます。
2.2 Plateを追加してDragonの影全体が道路に写るようにする
以下のようにPlateを足しました。
これでDragonの影全体が写るようになりました。
Cameraから見るとこんな感じです。
影が途中で切れている感じは無くなりました。
一回動画にして確認します。
以下のようになりました。
このような小さな画面で見るとそれなりに綺麗に見えますが、
PCでFull Screenにしてみると
Plateが置かれた端に白い線があるのが確認出来ます。
影が切れているFrameもありました。
更に純粋に3D Gaussian Splattingで作成した背景も
HDと言うほどのきめ細やかさは表現出来ていません。
この辺が今の3D Gaussian Splattingの限界なのでしょうか。
Luma AIで見る3D Gaussian SplattingはPCのFullscreenで見てもHD Levelのきめ細やかな画像を生成しています。
以下にLuma AIで開いたFull Screenの画像を示します。
うーん。
UE5にImportすると質が落ちるのか?
それとも質を落とさないでUE5にImportする方法が別にあるのでしょうか?
今度は奥にある木を写しました。
Luma AIではある程度までしか近づく事が出来ませんでした。
それが重要なのかもしれません。
後は、携帯専用の動画にするとか、古いFilm風の加工を後で追加するとか、まあPost Processingで加工して誤魔化すしかなさそうです。
<追記>
後で思いついたので追記で記録しておきます。
Gaussian SplattingのPlyのFileを別なPluginでImportしたらどうでしょうか。
PlyのFile自体をLuma AIではなく例えばPost Shotなどで作成するのも手かもしれません。
前にXVERSE 3D-GS UE PluginをInstallしましたが、使っていません。Luma AIのPluginと比較して性能がどう違うのかとかの比較をしてもいいかもしれません。
後、Luma AIのPluginを追加したのも大分前です。もしかしたら今のPluginはVersionがUpされているかもしれません。
それも調べる事にします。
2.3 Level Sequence上でPlate(Asset)のVisibilityを調整する方法を調査する
PlateのParameterを見ると以下に示した様にVisibleはありますが、
Level Sequenceに追加するためのIconはありません。
Copilot先生に聞いてみました。
Level Visibility Trackを使用するとAssetのVisibilityを管理出来るそうです。
手順も紹介されています。
まずLevelを2つ作成せよ。と言っています。
次にStreaming Methodをセットしろと言っています。
これの意味がまったく分かりません。
UEではMapとLevelは同義語です。MapにLevelを追加する事は出来ないはずです。
いやSub Levelなら追加出来ますが、それってAssetのVisibilityと何の関係があるんでしょうか?
一応Level1とLevel2はThird Person Example MapのSub Levelとして追加されたと仮定して話を読み進めます。
Level Sequenceを作成しています。
ここでSequencerのAdd ButtonをClickしてLevel Visibility Trackを追加しています。
ああ、
分かりました。
Level Visibility TrackはSub LevelのVisibilityを指定するんです。
成程。
CopilotがHallucinationを起こしたのかと思いましたが、この情報は正解のようです。
Map内でSub Levelを作成してそこにAssetを登録する方法があったはずです。
そのあたりの情報ともっとDirectにLevel Visibility Trackについて調べる事にします。
Quick Look at Levels, Sublevels, and Level Visibility in Unreal Engine [1]という動画がこのあたりの内容を全部説明していました。
結構分かり易いのでこれをまとめる事にします。
2.4 Quick Look at Levels, Sublevels, and Level Visibility in Unreal Engine [1]を勉強する
このTutorialの製作者はHawaii Film Schoolだそうです。
今まで全く聞いたことがありません。
うーん。
作成している動画を見てみます。
結構しっかりしたTutorialを作成しているみたいですが、
何で再生回数がこんな少ないんでしょうか。
まあ、でも私の動画も同じぐらいの再生回数ですから、同じようなものか。
このTutorialでは以下に示した様な
Persistent Levelの下にCubes LevelとVFX Levelを作成して
Cubes Levelに以下に示した様な3つのCubeを配置して
Level Sequenceから
Cube Levelを消すSequenceを作成して
このLevel SequenceをPlayする事で
Cubeを消しています。
はい。
これが私が作成したかった機能そのものです。
で、今までの様にTutorialの内容をそのまま、まとめるのも能がないので必要な部分だけ以下にまとめます。
<Sub Levelの作成方法>
WindowからBoxを開きLevelをEnableします。
すると以下に示した様にDetailsがある箇所に新しくLevelsというTabが追加されます。
このLevelを開いてThis feature is disabled when Partition is enabled.と書かれている場合、
このLevelには新しいSub Levelを追加したり、このLevelをSub Levelとして他のLevelに追加したりする事は出来ないそうです。
え。
そうなのか。
今の3D Gaussian SplattingのLevelはどうなっているのか確認します。
Persistent Levelになっていました。
これはSub Levelが追加出来るLevelです。
大丈夫でした。
ここからSub Levelの追加方法を示しています。
何と、単にEmpty Levelを使用して新しいLevelを作成して
それを親Levelに以下のようにDrag and Dropで追加しているだけでした。
以下のようになりました。
これだけです。
<Level SequenceからSub Levelを消す方法>
Level Sequenceを開き+ Track ButtonからLevel Visibility Trackを追加します。
以下のようなTrackが追加されました。
これはSub LevelのVisibleを管理するTrackなのでSub Levelを消したい場合は
以下に示したLevel Visibilityの右端にある+を押して、Hiddenを追加します。
すると以下のようにHidden用のLevel VisibilityがTrackに追加されます。
そしてこのTrackに消したいSub LevelをLevelsからDragしてDropします。
以下のようになりました。
後はこのCube Levelを他のTrackと同じ方法で調整するだけです。
これで完成でした。
2.5 Assetを他のLevelに移動する方法
ずっと前にRPGを作成してた時ですが、これ得意だったんです。
確か、Level間を移動したいAssetを切り取って、別なLevelを選択します。その状態でPasteするとそのAssetはPasteしたLevelに移動してくれるはずです。
試してみます。
せっかく作成した3D Gaussian SplattingのProjectに問題が発生したら嫌なので、
UE5.3で作成した別なProjectで試してみます。
以下のようなLevelを作成しました。
Cubeを追加しました。
Outlinerを見るとCubeはBase Levelに配置されています。
Cubeを選択して切り取りました。
次のBase LevelのSub LevelであるEmpty Levelを選択します。
Empty Levelが青色になりました。Empty Levelが選択されてる事を示しています。
この状態で、Level上でCtrl+CでCubeをPasteします。
CubeがLevel上にまた現れました。
Cubeが所属しているLevelがEmpty Levelになっています。
はい。
出来ますね。
今週はここまでとします。
Plateを別なSub Levelに移動させて動画の最後でVisibleを消す実装と
「PlateにPwnisher氏のMaterialとMegaScanのMaterialを組み合わせた自作のMaterialを使用する」は来週やる事にします。
3. AIの勉強
先週やっとJeremy Howard氏のTutorialの Practical Deep Learning for Coders: Lesson 1 [2]の宿題が終わりました。
ので今週はLesson 2: Practical Deep Learning for Coders 2022 [3]を勉強します。
3.1 Lesson 2: Practical Deep Learning for Coders 2022 [3]を勉強する
今週は軽く見ていきます。
それぞれの節でどんな話をしたのか、以下に簡単にまとめます。
<Introduction>
特になし
<Reminder to use the fastai book as a companion to the course>
教科書の紹介です。
教科書のそれぞれの章の最後にQuizがあります。
このQuizをLecture前に読むと良いよ。と言っていました。
アメリカの全部の大学が同じかどうかは分かりませんが、私がいた大学では教授が読んでおいた方が良いよ。といった時はほぼ宿題と同じって意味でした。
第一章の最後にあったQuizも読んでいません。
うーん。
第二章の最後にあるQuizは後で読む事にします。
<aiquizzes.com for quizzes on the book>
以下のWebsiteでこの教科書の別なQuizを受ける事も出来るようです。
<Reminder to use fastai forums for links, notebooks, questions, etc.>
学習するに当たって以下のForumが使用出来るそうです。
宿題を解くのに利用したSite、 Is it a bird? Creating a model from your own data [4]もしっかりここで紹介されていました。
先に言ってくれ。って感じです。
検索したらすぐに見つかりました。
https://forums.fast.ai/t/lesson-1-official-topic/95287
内容については後でじっくり見る事にします。
<How to efficiently read the forum with summarizations>
前節で紹介したOfficial PageにあるSummarize Buttonの機能について解説しています。
<Showing what students have made since last week>
StudentがLecture1の宿題でどんなProjectをやったのかを紹介しています。
以下の生徒は事故車のImageを判別するAIを作成していました。
私のピカチュウとリザードンを判別出来るAIはここで紹介されている結果と比較してもかなり良さげです。
最後に以下に示したAppを作成した生徒が紹介されていました。
何これ?
同好会でみんな楽しくやってたら、いきなり全国大会出場した人が入会して来たみたいなのは。
Jeremy Howard教授の説明によると、この人はこのCourseをもう何回も受講しているそうです。
そらこんな凄いの作成出来るわ!
教授は更に、このCourseを終了する頃にはみんなこれくらいのAppは作成出来るようになると言っていました。
そして最後にいや、間違ってた。今日のLectureでこのようなAppの作り方を教えるんだった。今日のLectureが終わる頃にはみんなこんなAppを作成出来るようになると言い直しました。
今回のLectureではこのようなAppの作成方法を勉強するのか。
<Putting models into production>
ここから話がガラッと変わります。
最初は以下のぬいぐるみの画像を識別するCodeが書かれた画像を示して何かを説明しています。
これって宿題の内容の解説なのか?
それとも今週のLectureが始まったのか?
最初のStepはDataを集める事です。と説明していました。
そしてStep2では集めたDataを綺麗にします。と言っていました。
これの事でしょうか?
いや、前回のLectureの内容ではこれはやってないです。
よく見たら画面に解説が写っていました。
Fast.aiにあるGUIを紹介しているみたいです。
この部分を詳しく解説するために教科書のChapter2を開きます。
Jupiterから開いているので、ここに書かれているCodeをそのまま実行する事が出来ます。
うーん。
これってColabでも出来るの?
出来るはずですよね。
ここでDataをCleanする事について解説しています。
と思ったらその前のStepのDataの収集についての話でした。
Chapter2はまだ読んでいないのでどんな話なのか全く分かりません。
<Jupyter Notebook extensions>
ここはJupyterのExtensionを使用してTabにNavigationを追加する方法を解説しています。
関係ないのでSkepします。
<Gathering images with the Bing/DuckDuckGo>
今度はBingのSearchのやり方を勉強出来るのかと、思ったらBingはSDK Keyが必要だからDuckDuckGoで代わりにやります。と言っていました。
それじゃ前回と一緒です。
以下のように書き換えていました。
熊のImageを検索しています。
やっている事は前回のLectureとほとんど同じです。
<How to find information & source code on Python/fastai functions>
これは気になってたやつです。
と思ったらもうここでこれ以上勉強する時間が無くなってしまいました。
Lectureの残りは来週見る事にします。
<Cleaning the data that we gathered by training a model>
<Explaining various resizing methods>
<RandomResizedCrop explanation>
<Data augmentation>
<Question: Does fastai's data augmentation copy the image multiple times?>
<Training a model so you can clean your data>
<Confusion matrix explanation>
<plot_top_losses explanation>
<ImageClassifierCleaner demonstration>
<CPU RAM vs GPU RAM (VRAM)>
<Putting your model into production>
<Git & Github desktop>
<For Windows users>
<Deploying your deep learning model>
<Dog/cat classifier on Kaggle>
<Exporting your model with learn.export>
<Downloading your model on Kaggle>
<How to take a model you trained to make predictions>
<learn.predict and timing>
<Shaping the data to deploy to Gradio>
<Creating a Gradio interface>
<Creating a Python script from your notebook with #|export>
<Hugging Face deployed model>
<How many epochs do you train for?>
<How to export and download your model in Google Colab>
<Getting Python, Jupyter notebooks, and fastai running on your local machine>
<Comparing deployment platforms: Hugging Face, Gradio, Streamlit>
<Hugging Face API>
<Jeremy's deployed website example – tinypets>
<Get to know your pet example by aabdalla>
<Source code explanation>
<Github Pages>
4. Nvidia Omniverseの勉強
4.1 先週の内容
以下のようにOmniverse Create内で車を表示するところまでやりました。
今週は、ここにLightを追加する方法を調べます。
まずはSetting Up A Project in NVIDIA Omniverse Create Part 2: Lighting & Rendering [5]を勉強します。
4.2 Setting Up A Project in NVIDIA Omniverse Create Part 2: Lighting & Rendering [5]を勉強する
<Intro>
特になし。
<Lighting Setup>0:41
Defaultの設定でついていたLightを全部消しました。
そしてCreateからLightを選択して
Dome Lightを追加しました。
Stage Panel内でDome Lightを選択した状態で、
使用したいHDRI Fileを以下に示したTexture Fileの値にDropします。
こんなの説明されなかったら絶対理解出来ないです。
以下の画面が
以下のようになりました。
これがHDRIが適用された状態なんでしょうか。
HDRIはよく理解していません。
後で調べる事にします。
<Render Setting>1:30
今度はRender Settingについてです。
Render Settingの設定を見ると
RendererにReal Timeがセットされています。
Viewの左上にあるButtonから
Path Tracedを選択します。
結果です。
Slot Machineの金属の部分に写っている反射のImageが前よりも正確になりました。
これで解決かと思ったらなんとこの後、RTX Real Timeに戻してしまいました。
うーん。
ReflectionのMax Roughnessの値が0.3にSetされています。
これはMaterialのRoughnessの値が0.3以上の場合は0.3に補正されて計算するという意味だそうです。
この値を1に近づければ近づけるほど、計算Costは高くなりますがMaterialの本物感は増します。
0.96した場合の結果です。
またPath Tracedに設定を変更しました。
どうやらこの値だけ説明したかったみたいです。
今度はDoom LightのColor Temperatureの値について解説しています。
この値を上げると暖かいLightの色になるそうです。
値を5000にした場合です。
うん。
確かに温かみのある色になりました。
以下のIntensityとExposureについても解説していましたが、
正直、あんまり要領を得ない解説でした。
今度はRender SettingのPost Processingの設定です。
この部分はほとんど説明無しでこんな項目があります。とだけ言って終わっていました。
この辺はUEのPost Processingから推測できるでしょう。
これでLightingの設定はお終いでした。
あれ?
Directional Lightとかの設定はしないの?
<Camera Settings>4:25
今度はCameraの設定です。
これは、ここ2,3カ月UEで重点的に勉強した内容なので、UEとOmniverse Createでどう違うのかと言う点で非常に興味があります。
以下のように机と本を追加しました。
Viewportの左上にあるProspectiveをClickしてCameraを選択し、
Create Camera Viewを選択します。
Stage Panelを見るとCameraが追加されています。
Cameraを選択します。
Lensの項の設定です。
Focal Lengthの値はDefaultでは18に設定されてますが、MovieやTVのような画面に変更したい場合は、35~70程度の値に変更します。
以下にFocal Lengthの値を35にした場合の結果を示します。
Apertureの設定を変更したい場合は、F-Stopの値を変更します。
Apertureについては2024-06-17のBlogで勉強していて以下のようにまとめられていました。
要はLensを通してCameraに入る光の量の調整です。
F-Stopの値が大きくなる程、Cameraに入る光の量が減ります。
2024-06-17のBlogではApertureについてCo-pilotにも質問していて以下の回答を得ていました。
こんな回答をいきなり得る事が出来るとなると、なんか世の中の勉強の半分くらいは無駄になりそうな気がします。
特に2番目の回答である、F-stopの値が大きい場合、背景がBlurになる傾向がある。なんてほとんどProのCameramanのセリフです。
これ一つで周りからProと見なされるでしょう。
Focus Distanceについてです。
これは画面内のどのObjectにFocusを合わせているのかの設定だそうです。
Focus Distanceの値が128.1の今の状態では以下のようなFocusの結果になっています。
ただしこれは、F-stopの値を0.1に設定したからBlurがはっきり見えるのであって
F-Stopの値を3.8に変更すると以下のようにBlurは無くなります。
マジか。
これが知りたかった。
これってUEでも同じでしょう。
良い事勉強しました。
今度はCamera01を選択しました。
これって別なCameraを生成したって事でしょうか?
Focal DistanceとF-Stopの値を変更して以下のような画面を生成しました。
凄いけど、なんかCG感があります。
具体的なApertureとFocal Distanceの値の設定方法は分かりませんでした。
なんか画面を見ながら値を変更していましたが、何を基準に値を弄っているのかは不明です。
Tutorialでは、
ここでESC Keyを押してSceneを全部Deselectします。
と言っています。
これ全く意味が分かりません。
あ、分かりました。
以下に示した様にStage Panelを見ると
どのObjectも選択されていません。
この状態にするのにESC Keyを押した様です。
今度はDome Lightを選択して、以下のGizmoを表示しています。
このGizmoを操って光の向きを操作しています。
このGizmoはDome Lightを選択したら自動で表示されるんでしょうか?
今度はこのSceneのScreenshotの取り方を説明しています。
EditからPreferenceを選択します。
以下のようにPreferenceのTabが追加されます。
Capture Screenshotを選択して設定を調整します。
ScreenshotのResolutionの設定は
Viewportの左上の歯車のIconをClickして、
以下のBoxを表示し
Render Resolutionで調整します。
何とここでProjectのSaveの仕方を説明していました。
USD fileに色々な種類がありますが、それぞれのTypeの特長はこの後のTutorialで説明するそうです。
うーん。
これは勉強になります。
<Fixing Thumbnail Issue>9:20
以下のようなUSDが生成されました。
ここでThumbnailに使用されている画像はSaveした時のViewportの画面だそうです。
あれ、Screenshotの話はどうなってしまったんでしょうか?
と思ったら以下の方法でScreenshotを取りました。
以下に示したBoxをEditから開きます。
そしてCapture Screenshotを選択します。
<Hiding Screenshot>10:27
生成されたScreenshotを開きました。
何とLightのIconが写っています。
これは大失敗です。
この問題を直すには、以下の目のIconからShow By Typeを選択してLightsのCheckを外します。
Screenshotをこの設定で取り直しました。
今度はLightのIconが消えています。
こういう、細かいTechniqueって調べてもすぐには分からない事が多いです。
でも生成AIだと簡単に解答見つけてくれそうです。
Copilotに聞いてみます。
以下の回答を得ました。
まず最初のやり方です。
Omniverse CreateにはBuilt-inのScreenshotがあるからそれを利用したらLightのIconが消えるよ。って事でしょうか。
これは間違っています。
ただこの設定方法はTutorialの説明とは違うので、新しい知識と言う点では勉強にはなりました。
質問の仕方にも問題があったかもしれません。
以下のように質問したので
Omniverse Createに付属のScreenshotを使用した場合とはっきりと述べてはいません。
このせいでCopilotはOmniverse Createに付属のScreenshotを使用したら。と回答したのかもしれません。
もう一つ別なやり方も紹介されていました。
Lightをdisableするか消してしまえと言っています。
これしたらIconだけでなくLightそのものが消えてしまいます。
このCopilotの回答は役に立たないですね。
まあ、質問の仕方をもっと工夫したら別かもしれませんが、CopilotでもこのLightのIconをViewport上で表示しない方法は回答しませんでした。
かなり貴重な情報という事です。
以上でした。
今週のOmniverseの勉強は以上です。
来週は実際に試してみます。
5. Gaeaの勉強
5.1 Gaea2.0のTutorialを作成する
5.1.1 PowerPointを作成する
ぱっと見でGaea2.0のTutorialである事が分かるように見た目を完全に変更しました。
今週はInstallのやり方を説明します。
Lectureの内容です。
Gaea2.0ではこの後PowerPointで一々説明せず、直接Gaeaでやってみせます。
最後にまとめを行います。
Thumbnailです。
これならGaea1とGaea2の違いがはっきり分かるでしょう。
5.1.2 Window11の画面を録画する
普通に撮影したら、結構個人情報がガッツリ写ってしまっています。
DaVinci Resolveでモザイクをかけました。
以下にやり方をまとめます。
Mosaicを追加したいVideo Sequenceを選択します。
その状態でColorに移動します。
以下のような画面が右端にあります。
01を右Clickします。
Add Nodeを選択してAdd Serialを選択します。
01の後に言う名前のNodeが生成されました。
02にMosaic BlurをDrag and Dropします。
02にFxのIconが追加されました。
Previewを見ると
Mosaicが掛かっています。
ここからMosaicを部分的に掛けます。
Windowから以下に示したSquareを選択します。
Preview画面に四角が表示されました。
この四角内だけMosaicが掛かる様になりました。
以下のようにZoomする事で、ひじょうに小さい部分だけMosaicをかける事も出来ます。
5.2 Gaea To Unrealの新情報
5.2.1 Gaea2Unrealについて
How To Install Gaea To Unreal Plugin [5]にGaea2UnrealのPluginのInstallの方法が紹介されていました。
これを選択すると
Homepageには有料版を購入した人だけに送られるE-mailを介さなくてもGaea2UnrealをDownload出来るそうです。
うーん。
良い事知った。
後、このTutorialでGaeaのDiscordの情報によると、こうだあーだ。と言っていました。
やっぱり最新の情報を得るためにはGaeaのDiscordを読む必要があるみたいです。
5.2.2 Homepageのまとめ
一応、今公式に公開されているGaea2.0の情報を整理します。
QuadSpinner社のHomepageに載ってる情報を以下に整理します。
Homepageに移動すると以下のTabがあります。
GaeaがDefaultでは選択されています。
<Gaea>
Gaeaから見ていきます。
以下の項目がありました。
それぞれの項目を見てみます。
<<Simulations>>
以下の機能が紹介されていました。
これらはNodeでしょうか?
Water systemとかはNode単体ではなさそうですが、ここに紹介されている機能は全部、Simulationして計算結果を出していますね。
そういうのをまとめて紹介しているみたいです。
これって一番最初に報告すべき内容なのかな?って感じです。
<<Construction>>
以下の項目がありました。
この項の目的は直ぐに理解出来ました。
私の分析ではGaeaではTerrainは以下の3つの手順で作成します。
- Terrainを作成
- 色を追加
- Build
この最初の「Terrainを作成する」も更に以下の手順で構成されています。
- 粗削りな地形を作成
- 表面のDetailを追加
- 時間経過(Erosionの追加)
この最初の粗削りな地形を作成するために使用するNode(もしくはNodes)がここの項目で紹介されているNodeです。
つまり最初の粗削りな地形を作成するために使用するNodeです。
<<Surfaces>>
ここは先程のTerrainを作成するの「2. 表面のDetailを追加」を作成するために必要なNodeを紹介しています。
<<Colorization>>
ここは先程の工程の「2. 色を追加」を作成するための説明をしています。
<<Build + Export>>
これはBuildについての項目です。
なんか公式のHomepageが私のGaeaの作成方法とほとんど同じやり方で分類しています。
ただここで書かれている内容は有料版の機能に関してでした。
<<Non-Destructive>>
Intuitive Graph、Non-Destructive、ProceduralmそしてArtist-Friendlyが項目でありました。
この項には以下のCiteが紹介されていますね。
ClickしたらYouTube Channelに飛びました。
30分もある動画です。
これは後で見る事にします。
<<Bridges>>
これはUnreal EngineとHoudiniのPluginの紹介です。
<<Education>>
ここは教育機関がGaeaを教える時に料金が安くなる話です。
もう少し深く読み込みたいですが、それは来週にします。
6. Houdiniの勉強
6.1 先週の復習
先週、何を勉強したのか覚えていません。
復習します。
以下の事を勉強していました。
- PolyFrameノードの機能
- ProceduralなWallを作成するために必要な最低限の基礎
- 「PointからLineを生成して面を作成し、その面から立体を作成する」ために必要な手順
- 「PointからLineを生成して面を作成し、その面から立体を作成する」ために必要なNodeの調査
先週のBlogの最後に以下のように書いていました。
じゃやってみますか。
6.2「PointからLineを生成して面を作成し、その面から立体を作成する」を実際にやってみる
先週までで作成した以下の結果を利用してやる事にします。
Convertlineノードを追加してLineを切断します。
以下のようになりました。
17個のPrimitiveが出来ました。
For-Each Primitiveノードを追加してそれぞれのPrimitiveに対して作業出来るようにします。
Foreach_Begin1ノードを可視化しました。
LineノードとCopyToPointノードを使用してこのPrimitiveを以下のような形状に変化させます。
以下のように繋げました。
Line1ノードの設定です。
Line1ノードのみの結果です。
これを上記のようにCopyToPointノードにつなげると以下のようになりました。
今度はSkinノードを使用してこの2つのPrimitiveの間に面を生成します。
Skin1ノードの設定はDefaultのままです。
結果です。
おお、面が出来てます。
Normal Vectorが下向くですが、今はこれでも良いでしょう。
今度はこの面をExtrudeして立体にするためにPolyExtrudeノードを追加します。
結果です。
はい。
何も変化していません。
うーん。
PolyExtrudeノードの機能について調べる事にします。
2023-12-10のBlogを読むと、
Distanceノードの値を変更していました。
この値を変更してみます。
Distanceに1を入れると
Boxが生成されました。
Distanceの値に以下に示した様な計算を使用して
Brickの高さに対応出来るような実装にしていましたが、
取りあえずDistanceの値は1でやってみます。
Polyextrude1ノードの結果をForeach_end1ノードに繋ぎます。
Foreach_end1ノードの結果を可視化します。
おお、Brickが並んでいます。
ここまでやってForEachPrimitiveノードの機能とVolumeを作成するための機能は別だという事に気が付きました。
この2つは分けて勉強する事にします。
6.3 Volumeを生成する
立体を生成するために必要な最低限の実装を以下にまとめました。
これで立体を作成するための実装を勉強していきます。
ちなみに上記の実装は以下のようなVolumeを生成しています。
LineノードとCopyToPointノードは既に勉強したので、SkinノードとPolyExtrudeノードについて調査します。
<Skinノード>
Skinノードは以下のような状態から
以下のような面を生成します。
これって存在する全てのPointを繋いでPolygonを生成しているんでしょうか?
以下のような実装を組んで
以下のような構造のLineを作成しました。
これをSkinノードに繋いでみます。
結果です。
これを見ると、Primitiveの番号で繋いでいるように見えます。
0と1、1と2,そして2と3が繋がって新しい3つの面が生成されています。
以下のHelp Iconを押して
以下のWindowを開きます。
軽く読んでみます。
最初、ばっと説明がありますが、何言ってるのか分かりません。
次にParameterの説明がありました。
Defaultでは以下のParameterが使用されていました。
使用されているParameterだけ調べる事にします。
Connectivityです。
どうやってSkinの表面を生成するかを指定しているそうです。
以下の種類がありました。
それぞれの値を試してみます。
Rowsです。
これはSkinが出来ませんでした。
Columnsです。
これもSkinは生成されません。
線の向きがRowsと逆ですね。
Rows And Columnsです。
これはRowsとColumnsが両方表示されています。
しかしSkinは生成されていません。
Trianglesです。
やっとSkinが生成されました。
TriangleのSkinが生成されています。
Quadrilateralsです。
四角の面でSkinが生成されているます。
Defaultはこれがセットされています。
Alternative Trianglesです。
Triangleと同じに見えます。
Reverse Trianglesです。
三角形を作成するために入れる四角形の対角線が逆になっています。
これらの値はSkinをどうやって生成するかを指定しているようです。
Skinの形状とかの指定はしてないですね。
V Wrapです。
どっちの方向がV Directionなのか分かりません。
V WrapをOnにすると以下のようになりました。
Skinです。
Skinの機能には“How boundary curves are ignored.”と書かれています。
ここでいうBoundaryとはPrimitiveの事でしょうか?
以下の3つの値がありました。
All PrimitivesがDefaultです。
Groups of N Primitivesをセットしました。
以下のようになりました。
うーん。
よく分かりません。
Skip Nth Primitivesをセットします。
あ、Nの値に2がセットされていました。
2つ目のPrimitivesをSkipしたって事でしょうか。
Primitiveは以下のように配置されています。
0は1をSkipして2と繋がっています。
1は2をSkipして3と繋がっています。
2は3をSkipしています。
そういう事みたいです。
先程のGroups of N Primitivesの意味も判明しました。
Nが2の時は0と1でSkinを作成します。1と2の間にはSkinは作成しません。次に3と4の間でSkinを作成します。
Nが3の時は0と1と3でSkinを作成します。3と4の間にはSkinは作成しません。
Nが1の時はどのGroupともSkinは作成しません。
はい。
こんな感じでした。
Output Polygonsです。
以下のように説明されていました。
うーん。
よく分からないのでCheckを外してみます。
なんと一枚のMeshで生成されるようになりました。
これにCheckが入っているとInputされたPrimitivesに基づいてMeshを生成するみたいです。
何となく理解しました。
Exampleが一杯ありました。
SkinBasicだけ見てみます。
SOPってどんな意味なんでしょうか?
Copilot先生に聞いてみます。
うーん。
Geometry Layerの下のLayerって事でしょうか?
以下の2つの例がありました。
Skin With One Inputの方から見ていきます。
以下のような実装でした。
まずCircle1ノードです。
以下のような地形を作成します。
Copy1ノードです。
以下のようになりました。
ふーん。
これの作成方法がまず分かりません。
まあ良いです。
Skinノードに繋げました。
結果です。
うーん。
何となくどうやってSkinを貼ったのか分かりました。
Skinノードの設定を見てみます。
Defaultと同じです。
Circleの時点でPointとPrimitivesを表示させると以下のようになっていました。
成程ね。
SkinノードがDefaultの設定だったらどうやってSkinを作成するのか、何となく理解しました。
今回はこれくらいで十分です。
<PolyExtrudeノード>
PolyExtrudeノードについて調べます。
以下のParameterらは一番分かり易いのでこれからやります。
Distanceは当然どこまでExtrudeするかを指定します。
1の時はこうですが、
2だとこうなります。
Insetです。
Default値は0です。
数字を上げると以下のように先が細くなりました。
逆に数字を下げる(0以下にする)と
先が太くなりました。
Twistです。
捻じれます。
そのままです。
Divisionです。
1から2に上げてみました。
分割が出来て2つになりました。
数字を上げると分割数が増えました。
取りあえずこれだけ理解したら今回は十分です。
6.4 今週の作業のまとめと来週の課題
今週は「PointからLineを生成して面を作成し、その面から立体を作成する」の中から一個のVolumeを作成する方法を中心に勉強しました。
一個のVolumeを作成するのに必要なNodeで今回、新しく勉強したのは、
- Skinノード
- Polyextrudeノード
の2つです。
来週は複数のVolumeを生成する方法を勉強します。
そしてそのために必要なNodeとして以下の2つのNodeの勉強もします。
- Convertlineノード
- For-Each Primitiveノード
以上です。
7. UEFNの勉強
7.1 先週の復習
先週のBlogを読み直すと以下の内容を勉強すると書いていました。
最後の「Debug Draw ClassのCodeを読んで理解出来るようにする」を行おうとしてUEFNを開いてNPC_BehaviorのCodeを確認したら、ErrorになってBuild出来なくなりました。
これは先々週、UEFNがMaintenance中でUEFNからVerseのCodeを開けないので直接Visual Studio Codeから開いて編集したからです。
ので以下に示した様に新しいNPC_BehaviorのVerse Fileを作成しました。
これに 2024-07-14のBlog で実装したCreate Custom NPC Behavior [6]をやる事になったんですが、それを始めようとしたところで終わっていました。
となると今週の作業は、
先週作成したmy_second_npc_behaviorでCreate Custom NPC Behavior [6]の実装を行う。
になりますね。
7.2 Create Custom NPC Behavior [6]の実装をする
2024-07-14のBlogのまとめに基づいてやって行きます。
NPC_Behaviorを作成したらBuildしろって書いてありました。
これってこのProjectにあるすべてのVerseをBuildするんですよね。
前回ErrorになったVerseのFileも一緒にBuildされてErrorになってしまうじゃないですか。
これをされるためには
- そのVerseのFileを消すか
- 別のProjectを作成するか、
- Revision Controlでかなり前のProjectまで遡ってSaveし直す必要があります。
を行う必要があります。
取りあえずBuildを試してから考えます。
うん。
Errorになってるのか?
何も出て来ません。
よく分からないのでこのままやって行きます。
NPC_Character_Definitionの設定を行います。
これは先週やりました。
NPC_Character_DefinitionをLevel上に配置します。
2024-07-14のBlogを読むとここで
と書かれていますが、
今のProjectのOutlinerを見るとNPC_Spawnerの記載は無いです。
うーん。
仕方ない。
NPC_Character_Definitionから新しいClassをもう一回作成します。
設定は以下のようになっています。
これをLevel上に配置しました。
今度はOutlinerに
が生成されています。
うん。
出来た。
ここでGame PlayをしてNPCが動く事を確認します。
動いていました。
なんと2024-07-14のBlogでやったのはこれだけでした。
この後はNPC_BehaviorのCodeを読む事に専念しています。
7.3 Blogの復習をする
2024-07-14のBlogから今まで何を勉強したのか全く覚えていませんので復習します。
ここから公式Siteの Create Custom NPC Behavior [6]を勉強しています。
そして以下のNavigatableの項目に来たところで
Defaultで実装されている事に気が付きます。
そしてLeashableの項目に来ます。
そこで
となりました。
ここでこの週の勉強は終わっています。
この週かnpc_behavior.verseのDefaultで生成されるCodeを勉強しています。
確かにDefaultで生成されているCodeの意味が分からなかったら次を繋げる事が出来ないので、DefaultのCodeを理解する事は大事ですが、なんかもっと重要な理由があった気がします。
しかしその内容はここには書いてないです。
一応、Codeを最後まで読んで理解出来た部分について解説していました。
この週はUEFNの勉強はしていませんでした。
2024-07-22のBlogの最後に以下のように書いてあるので
DefaultのCodeをもっと深く理解するため読み直していました。
単に読み直すのではなく、分からない部分を調べながら読み直しています。
Debug_Draw_channel Classについて調べて終わっていました。
先週のBlogの最後にClassからObjectを生成する方法を復習する。と書いてあったので
それをやっています。
<先週のBlog>
そして先週のBlogでは2024-08-18のBlogを読み直した結果、以下の事をやる必要がある。
となりました。
やっと全体の流れが見えました。
7.4 全体の流れを整理します
2024-07-14のBlogから先週まで、何が目的でこのような勉強をしてきたのかの全体の流れが理解出来たので、それを整理します。
まず、最初で最大の目的は、
Verse_Deviceの代わりにNPC Behaviorを使用してVerseのCodeが書けるようにする。
です。
今まで勉強してきたPi equals Three氏のTutorialでは全部Verse_Deviceを使用してCodeを書いています。NPCを生成する時もです。
そこでNPCに関してVerseのCodeを書く時は、NPC Behaviorを使用してVerseのCodeが書けるようにこの勉強を始めました。
更に言うと、Pi equals Three氏のTutorialはたまに勉強するには良いですが、全面的に頼るのは危険な気がしてきたのもあります。
Pi equals Three氏のTutorialは適切な距離を保って適切に利用するようにしないとこっちの身が危なくなりそうな気がしてきたわけです。
それで最初に選んだTutorialが公式SiteにあったCreate Custom NPC Behavior [6]です。
Create Custom NPC Behavior [6]の勉強を始めたら、最初の2項目のCodeはDefaultで書かれていました。
Defaultで書かれているCodeはそれ以外にも沢山あり、これはDefaultで書かれているCodeの意味を理解するのが先だ。となりました。
で、DefaultのCodeを理解しようとしたら、なんとClassの作成方法などのもっとも基本的な内容すら覚えてない事に気が付きました。
これを急いで復習しました。
ここまでが先週までの内容になります。
Classの作成方法などの復習が終わったので、次の作業はDefaultのCodeの続きを読む事になります。
以下のDebug_Draw Classから子クラスを生成しているCodeから読む事になります。
これを今週はやる事にします。
7.5 Codeの続きを読む
次のCodeです。
これはNPCが向く方向を示すためのArrowが腰から発生するため、それを頭に移すためにはどれくらいZ軸方向に移動させる必要があるかを指定するための値を指定するためのConstantを生成しています。
今、GameをPlayしてもNPCの頭からArrowは表示されません。
何故、こんなConstantがDefaultで存在しているんでしょうか?
On Begin()関数です。
この中の実装を見ていきます。
Agentを得て、そのAgentからCharacterを得ています。
更にそのCharacterからNavigableとFocusも得ています。
この辺の実装は定型文です。
NavigatableとFocusについてはCreate Custom NPC Behavior [6]の解説を読み直します。
Navigatableです。
WordのSpell CheckだとNavigatableはMisspellingで正しいSpellはNavigableだそうです。
ここではUEFNの公式Siteの通りに書いていきます。
Navigatableを使用する事でCharacterを移動させる事が出来るそうです。
Characterを移動させたかったらNavigatableを使用すれば良い訳です。
Focusです。
Characterにある方向に向かせるための関数です。
この後のCodeも軽く読んで大体の内容は理解しましたが、今ここでまとめるのはちょっときつすぎます。
以下から下のCodeは来週、まとめる事にします。
<追記>
NavigatableやFocusはCharacterのMethodであるはずです。
それだけ確認しようとしたら結構、深い内容になったのでここに記録しておく事にします。
まずCharacter Classを探しました。
以下のCharacters module [7]から
NavigatableやFocusを探したんですがかすりもしません。
仕方ないのでCopilot先生に聞いてみました。
ここではNavigatableについて直接聞くのではなくて、実際のCodeで使用されている
GetNavigatableについて質問しました。
すると以下のところで
GetNavigatableについてのReferenceが紹介されていました。
そこに飛ぶと
はい。
GetNavigatableのSiteに辿り着く事が出来ました。
(InCharacter:fort_character).GetNavigatable extension [8]です。
これ見るとそもそも
AI ModuleにあるExtensionです。
にもかかわらず、Characterを頭に取る必要があります。
こんなCodeの書き方知らないです。
うーん。
Verseの勉強はまだまだ先は長いです。
8. DirectX12の勉強
8.1 Lötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]を勉強する
8.1.1 先週の課題をやる
先週のBlogに以下のように書いていました。
<Present()関数>
SwapChainにあるPresent()関数について調べます。
まずCopilot先生に聞いてみましょう。
うん。
これは大体想像の通りの返答です。
以下のParameterがあると言っています。
それぞれのParameterについては以下のようになっています。
先週のBlogでは以下のような設定になっていました。
公式SiteのIDXGISwapChain::Present method (dxgi.h) [9]も見てみます。
最初のParameterであるSyncIntervalの説明です。
1だとVertical Blankを一回挟んでからSynchronizeするのか。
他のTutorialの勉強ではPresent()関数の値に何をSetしたのか一応調べます。
2023-08-21のBlogで勉強していました。
このBlogは以下に示した電子銃の勉強をした回でした。
「DirectX 12の魔導書」の「3.3.6 Swap Chainを動作させる」の「画面のSwap」でPresent()関数を実装しています。
「DirectX 12の魔導書」の「3.3.6 Swap Chainを動作させる」の「画面のSwap」を読み直します。
二番目のParameterについて追加の情報がありました。
0以外の値を使用する時は、テスト用出力やステレオをモノラル表示にする場合だそうです。
次はこれです。
<BufferとCommand Queueの関係>
これは何度も勉強はしています。
Blogを遡って何と書いているか調べる事にします。
まずこれです。
2022-11-06のBlogで勉強しています。
一年半以上前の話か。時間が経つのは速いです。
2023-03-06のBlogにCommand ListとBufferの関係の考察が載っていました。
ここではCommand Queueの生成について勉強していて、その中で以下に示した様にD3D12_COMMAND_QUEUE_DESC型のStructを生成する必要があります。
このStructのMemberの一つにあるTypeに使用されているD3D12_COMMAND_LIST_TYPE_DIRECTの機能は以下のように説明されています。
ここでCommand Bufferが出て来ます。
つまりCommand ListとBufferの関係がここで説明されている訳です。
で、以下のように解釈しています。
成程。
今度はCopilot先生に質問してみます。
Command BufferとCommand Listは同じ。とはっきり返答してきました。
うん。
納得。
しかし、そうなると以下に示した先週の解釈がオカシイ可能性がありますね。
もしかしたらこれはCommand Queueを何回もFlushしているのではなくて、Command Queueの中にあるCommand ListをFlushしているのではないでしょうか。
Command Queueの中には2つのCommand ListがあるのでそれぞれをFlushしている訳です。
Codeを見て確認します。
うーん。
Fenceを呼び出しています。
Fenceって何かを止める機能だった気がしますが。
あ、思い出した。GPUの数字とFenceの数字が同じかどうかを確認するんだ。
でもこれでCommand ListをFlush出来るの?
うーん。
多分ですが、Command Queue内にあるCommand Listは全部実行してしまったんではないでしょうか。
つまりGPU側から参照されるBufferは既に無くなった状態になった訳です。
この辺で止めておきます。
今週のLötwig Fusel氏のD3D12 Beginners Tutorial [D3D12Ez]の勉強はここまでです。
来週から次のTutorialであるResizing the SwapChain | D3D12 Beginners Tutorial [D3D12Ez] [10]の勉強を始めます。
8.2 「DirectX 12の魔導書」を勉強する
8.2.1 「ShaderにUV情報を追加する」を実装する
Layout設定にUV情報を追加します。
しました。
これでTexture情報がShader側にPassされるようになったので、Shader側のCodeを書き換えていきます。
PassされたUV情報をVertex Shaderで受け取るために、Vertex ShaderのBasicVS()関数のParameterにFloat2 uv:TEXCOORDを追加します。
しました。
ここで私のCodeにはSV_POSITIONがありますが、教科書の例でもSample Codeの例でもこれが消されています。
そもそもこのSV_POSITIONの意味が不明です。
これは後で調べます。
SV_POSITIONを消します。
Vertex ShaderとPixel Shaderのやり取りを行うためのStructを生成します。
#include “BasicShaderHeader.hlsli”をBasicVertexShader.hlslとBasicPixelShader.hlslに追加します。
Sample Codeでは“BasicShaderHeader.hlsli”は"BasicType.hlsli"と言う名前になっています。
のでここでは"BasicType.hlsli"で統一します。
Basic Vertex Shaderに"BasicType.hlsli"追加しました。
Basic Pixel Shaderにも"BasicType.hlsli"を追加しました。
今度はBasicType.hlsliを作成します。
しました。
作成したBasicType.hlsliに以下の実装を追加しました。
BasicTypeという名前のStructを作成しています。
教科書ではOutputと言う名前でしたが、Sample CodeではBasicTypeと言う名前になっていました。
ここではSample Codeの名前と同じにします。
更にBasic Vertex Shaderの実装を以下のように書き換えました。
うーん。
これはFloat4で返していたのをBasicTypeに変更しただけですね。
Basic Pixel Shaderの実装も以下のように変更しました。
Sample CodeのPixel ShaderはTexture2DとかSamplerStateとかを使用してもっと複雑なCodeを書いていますが、教科書のCodeは上記のようになっています。
ここは教科書のCodeに準じて実装しました。
これで完成です。
Testします。
以下のようになりました。
うーん。
青くないです。
Codeを見直したらBの値は0にしていました。
という事は出来ています。
UVの値がCPU側からVertex ShaderにPassされ更にPixel Shader側にPassされている事が確認出来ました。
9. まとめと感想
なし
10. 参照(Reference)
[1] hawaiifilmschool. (2023, November 21). Quick look at levels, sublevels, and level visibility in Unreal Engine [Video]. YouTube. https://www.youtube.com/watch?v=qgORzAhjg_0
[2] Jeremy Howard. (2022, July 21). Practical Deep Learning for Coders: Lesson 1 [Video]. YouTube. https://www.youtube.com/watch?v=8SF_h3xF3cE
[3] Jeremy Howard. (2022, July 21). Lesson 2: Practical Deep Learning for Coders 2022 [Video]. YouTube. https://www.youtube.com/watch?v=F4tvM4Vb3A0
[4] Jhoward. (2022, August 15). Is it a bird? Creating a model from your own data. Kaggle. https://www.kaggle.com/code/jhoward/is-it-a-bird-creating-a-model-from-your-own-data
[5] kiwivi. (2024, July 9). How to install GaEA to Unreal Plugin [Video]. YouTube. https://www.youtube.com/watch?v=ehpY8sNGbWI
[6] NPC Character Definitions. (n.d.). Epic Dev. https://dev.epicgames.com/documentation/en-us/uefn/npc-character-definitions-in-unreal-editor-for-fortnite
[7] Characters module. (n.d.). Epic Dev. https://dev.epicgames.com/documentation/en-us/uefn/verse-api/fortnitedotcom/characters
[8] (InCharacter:Fort_character).GetNavigatable extension. (n.d.). Epic Dev. https://dev.epicgames.com/documentation/en-us/uefn/verse-api/fortnitedotcom/ai/getnavigatable
[9] Stevewhims. (2024, January 26). IDXGISwapChain::Present (dxgi.h) - Win32 apps. Microsoft Learn. https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-present
[10] Lötwig Fusel. (2023, June 21). Resizing the SwapChain | D3D12 Beginners Tutorial [D3D12EZ] [Video]. YouTube. https://www.youtube.com/watch?v=QOT_OzPJl6c