Blenderでドーナツ作り(1) 肩慣らしと、チートシートの印刷
「ちょっと前に見つけたチュートリアルなんだけどね」
「Blenderで作ったこのドーナツがすごくいいなあと思ってたんだけど、冷静に考えるとこれチュートリアル動画なんだから、そのとおりにやれば自分でも作れるんじゃないの? って思ったんで、ちょっと作り始めてみた」
妹「なんか英語っぽいけど」
「part3までは日本語の字幕がついてる。たぶん誰か付けてくれたんだと思うけど。part4以降は自動字幕しかない。でもまあ動画だから、同じようにすれば大丈夫かなあと」
妹「たしかにBlenderやった方がいいかなと思うことは多々あるけど、英語はなあ」
「日本語にもよさそうな動画はあったし、そういうのいくつかピックアップはしてるんだけど、とりあえずこのドーナツが作りたいからこれをやる」
妹「そんなにドーナツ好きなんだ」
「別にそんなに好きではないんだけど、絵的になんか惹かれる物があるんだよ。あとは動画の難易度設定が初心者向けだったのもある。インストールした直後の人向け」
「とりあえず字幕のある3つ目の動画までをポンポンポンと。予想通りショートカットキーとか完全に忘れてるけど、前に日本語のチュートリアルを2本やってることもあって、だんだん思い出してきた」
「操作方法については、今回のチュートリアルのサイトからもダウンロードできるんだけど、これは日本語版がいいかと思っていい感じのやつを探して印刷。ただ左クリックで選択する設定に変えてるから、そこだけは表記が違うんだけど」
「あとはちょっと困ったのが日本語化の問題。とうぜんチュートリアル動画では英語設定になってる。ボタンの位置が一緒ならわかるだろうと思ってたけど、機能検索みたいな画面で、日本語にしてる時は日本語でしか検索できなくて、ちょっと困ったのでインターフェースも英語に設定した」
「マウスカーソルを合わせた時に出るTooltipsは、特に支障がなさそうだからこれだけ日本語にして、あとは英語という設定」
PPCelShaderを使って、とんびやあぶらあげに輪郭線をつける
僕が今も使っているUE4用のポストプロセス セルシェーダーを誰でも使える形でGitHubにて公開しました。Postprocess Materialとして適用すれば、誰でもすぐにこんな感じのセルシェーディングができます!自由にジャンジャン使ってください!!#UE4 #UE4Studyhttps://t.co/sHG4vbHR00 pic.twitter.com/gARF4jx1LB
— alwei (@aizen76) May 27, 2018
「アセットを入れるだけで使えて、自由に改造してもいいという、セルシェーディング用のポストプロセスマテリアルが公開されたんで、それをとんびのやつに入れてみていた」
「ダウンロードはGitHubから。日本人のalweiさんが作ってるやつで、説明も日本語になってる」
妹「それはありがたい。でも兄も前にそんなの作ってなかったっけ?」
「それは線だけのやつだったからね。色合いにはあまり興味がなかったからそのままに……このマテリアルは線も塗りも対応してて、かつパラメータで操作できるようになってるから便利」
「使うには、まずGitHubからダウンロードする。これがサンプルプロジェクトになってるから、開くとアニメ絵にされたグレーマンの群れが確認できる」
「このプロジェクトに自分のキャラのFBXとかを入れてみてもいいんだけど、自分のプロジェクトで使う時は、Contentsの中にあるPPCelShaderフォルダだけコピーすればOK」
妹「移行コマンドを使うの?」
「それでもいいけど、他のフォルダのとは関連性がないから、エクスプローラでコピーしても別に問題ない。ただUE4のバージョンが古いプロジェクトにコピーする場合はどうなるかわからないけど。今回はたまたま動作確認用に4.19で開いたとんびのプロジェクトがあったんで、それの中にコピーしてみた」
妹「そういえばダウンロードする時にバージョン設定はしなくてよかったの? SpriteStudioプラグインだとなんかタグをどうこうという」
「それは今のところmasterしかないから。将来的にはわからないけど、これはプラグインじゃなくてアセットだから、そんなにバージョンを気にする必要はないはず」
「で、自分のプロジェクトの中にあるポストプロセスボリュームに、ポストプロセスマテリアルを追加する。ボリュームがなかったら追加する。Infinite Extent設定にしておくと、カメラがどこにいっても対応できる」
適用後
適用前
「ポストプロセスマテリアルを入れるだけでこうなる」
「とんびと油揚げにも輪郭線がついてる。ブラーがかかっててよく見えないけど……」
妹「色も違うね、影がなくなるのかな?」
「そういうわけじゃなくて、指定した影の色が乗算されてる。ただ初期状態だとグレーで、そうするとどんなに光のないところでも真っ黒にはならない。若干暗くなるだけ。その方が輪郭線が見やすい。このへんの設定も変えられるので、例えば線を緑に、影を赤に設定すると……」
妹「気持ち悪!」
「まあこんな具合で色んなとこに影はある。影の色を濃い目にするとか、あと影の出方を調整するとかね」
「PPI_CelShaderはマテリアルインスタンスになってて、パラメータをすぐに変えられるようになってる。影の出方ならデフォルトは影のあるとことないとこが極端だけど、もう1つもっと緩やかに変化する画像もあるし、自作してもいい」
ForEachLoopによるコピーと参照の問題
つまり配列をForloopで渡したとき、Array Elementソケットから引っ張り出したやつは配列の中身のコピーになるっぽいのか。内部の値を編集するにはIndexだけ取り出して元の配列変数から参照Getする必要があると #UE4 pic.twitter.com/qzPGSr6Or9
— 大福 (@dfk_ohnuma) May 23, 2018
「先日ツイッターで見かけた問題なんだけど、ForEachLoopで色々やろうとする時、配列の中身が構造体だと、配列の中身に直接アクセスするんじゃなく、コピーされた物を操作することになる。まだUE4でこうなったことはないけど、他のプログラミング言語で同じようなことがあった」
妹「それの何が問題なの?」
「ForEachLoopで、中身を書き換えたいという時にちょっと困る。コピーされた物を変更しても、配列の中身には反映されない。勝手に書き換えないから安全という言い方もできるんだけど」
妹「でもアクターとかでそういうことやったことあるかも」
「アクターはActorクラスだから。別の変数にSETした場合の動作が、構造とか数字とかとちょっと違う。だから普通に使ってる分にはコピーされた物だと意識しなくてもいい。数字の時もたぶんそんなに気にならない。でも構造体は見た目クラスに似てるから、なんか出来そうで出来ないっていう、もどかしい感じになる」
Can foreach be pass-by-reference? - UE4 AnswerHub
「で、調べてたら英語の方でもこの問題について質問してる人がいた。この人はコピーされた物を編集した後で、Set Array Elmで配列に上書きしてて、これで動くけど、なんかもっといい方法ないの?っていう」
妹「あるの?」
「ForEachLoopはマクロだから、配列から普通にGETするんじゃなく、参照をGETするようなマクロを作ればいいんじゃないかと」
妹「参照……聞いたことがあるような」
imoue.hatenablog.com
imoue.hatenablog.com
「いちおう前にもやったんだけどね。ちゃんと説明しようと思うとむずかしいから、だいたいみんな勘で使ってるんだけど。要するにコピーじゃなくて、そこにあるデータそのものを(別のとこから)変更したい時に使う。何度も使うようならマクロを作る価値はありそう」
※追記
UnrealEngine4 Project "YoRoZu" 第十九回 YoRoZu_Flow "ForEachLoop (Ref)"の実装
このサイトに参照版のForEachLoopの実装例があります。
制作過程も載っていてわかりやすいです。