Blender

2017年度Blender講習会総括

どうも、初投稿です。

KCSでは今年の4月から5月に掛けて新入生向けの講習会を多数開きました。この講習会は、ある意味KCSの目玉ですので、しっかりとやっていかねば。責任感割と重大でした。

反省も兼ねて今年の講習会の総括を行います。

 

講習会について

講習会は概ね以下のような流れに沿って行いました

  1. 簡単な動物(ペンギン)のモデリング
  2. テクスチャペイントやマテリアルの編集
  3. レンダリング設定など

うねうね

(製作途中図)

Blenderは特にモデリング作業において、覚えるべき操作やショートカットが沢山あるのでまずはそこに重点を置いて講習会を行うようにしました。講習会は教室を借りて行うことが多いため、教室前方にある白板などを活用しました。反省としてはやはり、いちいちテキストを参照していてはどうしても効率が悪くなってしまいがちですので早見表のようなものを作った方が良いという点です。

中間期間はめっきり人が減ってしましましたが残った人に対して以下のような講習を行いました

  1. 人体モデリングの手法
  2. メッシュの流れ(トポロジー)を意識したモデリング

人体モデリングは独学でやるにはかなり敷居の高い分野だと個人的には感じております。そのため、そのイロハを教えることができたのはとても良かったです。来年度も継続して行っていきたいものです。

 

Blender講習会は毎週火曜日に行いました。最初は10人程度集まっておりましたが、どうも放課後ということで都合の付きづらいことが多いらしく参加者全員集まるという機会はほとんどありませんでした。また、五月中旬は中間試験のためめっきり数を減らしました。こればかりは、毎年の傾向で対処の難しい課題ですね…。どうにかして改善していきたいですが。

講習会の内容としては、自作のテキストを使って簡単なシーンを作ってレンダリングするというものでした。テキストこそ70ページを超える内容でしたが正直伝えたいことは3割程度しか載せられませんでした。時間と語彙力が沢山ほしい次第です。

講習会の形式としては、軽く講義を行ったあと、各自の自習を行う形式でした。少人数の講習会であったため、TAの手が足りないといった事態は避けられましたが、テキストの内容をもっとわかりやすく書いていれば、質問も減ると感じたのでフィードバックとして改善していきたいです。

 

また、KCSでは内部のSNSとしてSlackを活用しています。そこで、講習会で行った内容などを共有するなどしました。他愛のない談笑も行ったりしています。

談笑の図

上図…他愛のない談笑の一例

テキストについて

自作のテキストを用いました。このテキストは技術書典2への出展を兼ねていたため誤字誤植等が無いよう最大限細心の注意を払って制作を行いました。しかし、主に自分の知識不足が原因ですが様々な改善点などが見つかりました。人に教授する目的で自分の知識も向上できる、知識確認と向上の良い機会だとつくづく感じました。

また、個人的に所有していた以下の市販の本も参考資料として使用しました。

MikuMikuDanceキャラクターモデルメイキング講座―Pさんが教える3Dモデルの作り方

Blender 2.7ガイド&3DCG基本作品制作

講習会自体には関係ありませんが講習会途中に出版されたBlender標準テクニック ローポリキャラクター制作で学ぶ3DCGも非常に充実した内容で、今後の講習会に生かしていきたい内容が多い印象でした。(もっと早く出版されていれば…!)

その他

食事したいですね。1対1で話をした方が捗りますし。

 

関係ないですが、代表のお金で焼肉が食べたいです。

BlenderでXray目の再現

どうも、チョコです。多く知られているMultipassのやり方を(今更)理解したので共有したいと思います。

BlenderではMultipassのことをRenderLayerといい、Compositorで組み合わせができる。

ラムのモデルでデモしよう。

Screenshot (1226)

 

髪の毛の前に目を出したいので、まず目と髪の毛を別のオブジェクトにして、髪の毛をレイヤ2にする。

RenderLayerを2個作り、それぞれのマスクを設定する(Hairはレイヤ2しかレンダしない)。

Screenshot (1221)

これをレンダすると、髪の毛が消えた。さて、Compositorで合成しよう。InputNodeを2個使えば両方のRenderLayer画像が入手できる。

 

レイヤ1から目の部分を切り取りたいので、ObjectIDマスクで分離する(目のObjectID1にした)。

Screenshot (1224)

最後に、二つのレイヤをCombineZで合成し、さらに上から切り取った目をAlphaOverする。

Screenshot (1225)

完成。では。

 

ホラーゲーム作ります:テクスチャ・演出・D言語くん

バイオ7出ました。素晴らしくて泣いた。決して怖くて泣いたのではありません。

せっかくなので試しにホラーゲーム作ってみたい。ホラーゲームも一人称ゲームも作ったことないし。

早速モデル作りました。こんな感じです(Blender内です)
asdfasdf

これどっかで見たような。。って思ったあなた、友達になってください。
(がっこうぐらしですねはい)

でもこれテクスチャがないとあまり怖くないですね。SubstancePainterに移りましょう。(ここから宣伝)

まず古い校舎感を出すために、「Coarse cement」のレイヤーに「Fine cement」をかけて、マスクで削る壁を演出した。さらにその上にほこりを載せる。

Screenshot (683)

おお、いい感じ。(これにはあらかじめ分割したモデルをベースにノーマルなどをベークした(例の椅子のヤツです))

では、ちょっと血を入れます。物理エンジン(?!)が使えるので、HeavyLeakingやBurn効果(Diffuse色やSpecular, Glossinessをいじったもの)を使ってみよう。

血はDiffuse #770000 Specular #ff6666 Glossiness 0.3かな(だいたい)。旧い血痕はSpecular低めで。

particles

グロ。でも好き。

さて、これをUnityにエクスポートしよう。Export Textures押すとUnityのStandard Materialがすぐ使えるDiffuse, Specular, Normal, Height, Occlusionマップが生成される。これを適用してみよう。

普通の照明じゃ面白くないので、カメラについているSpotlightで照らそう。

Screenshot (727)

怖い怖いちょっと待ていい雰囲気じゃねぇか。ほんとのホラーゲームっぽいぞ。(ホラーゲームです)

 

他のアセット:

1.KCSxUnity本

Screenshot (693)

2.D言語くん Screenshot (719)

↑Sketchfabはいいぞ。

この感じでアセットを作ると超便利で速い!

 

(ネタばれしたら実際のプレイも怖くなくなるので、他のシーンのものは見せられません。お楽しみに。)

では。

Unityを拡張しよう!#2: 表面分割アルゴリズムの実装(Part 1)

どうも、チョコです。あけましておめでとうございます。

さて、今年初の記事です。わーい。
(もともと去年に完成させたいものですが、バグが出てきてそのまま年越えましたorz)

さて、今回は”Catmull-Clark 表面分割をUnityで使いたい!”と思ったので作ってみました。はいストップ。Catmull-Clarkは何ぞや。説明します。
Catmull-Clark Subdivision Surfaceとは、とあるメッシュを分割し、比較的に滑らかな四角ポリゴンからできたメッシュにするアルゴリズムです。

ニホンゴデハナシテ。

見ていただいた方が早いので、↓の通りピラミッド、キューブとn角はてなメッシュを表面分割させました。

screenshot-426

あらきれい。滑らかになってますね。
ちなみにBlenderではこのようにModifierを追加することで表面分割させられます。

screenshot-428

Catmull-Clark出てきましたね。

では、これをUnityに入れたいと思います。ちょっとまて。なんで入れるのかな。Blenderではもうこの機能ついてるのに??

答え:>>>アニメーションのためです!ボーンを付けてアニメーションさせたところ、Modifierは全部消されてしまいますボーンModifierの前に適用されます。じゃあそもそもボーンの後に表面分割する必要ある?って思ったあなたへ、下の図をご覧ください。

screenshot-434

足ですね。曲がるところに頂点がないことを確認してください。
でもちょっと頂点数少ないので、表面分割しましょう。

screenshot-422

円滑になりました。でも左の方はなんか不自然ですね。これは分割してからボーンを付けたせいですね。曲がるところに頂点が入ってしまいますので、これを2本のボーンだけでは数学的には右のような形にはできません。説明略。
右のほうを見ると頂点は全く同じで、ただボーンと分割の順番を逆にしただけできれいになります!!

疲れた。まだ本文に入っていない。まだちょっとありますので我慢してください。

では、このアルゴリズムをUnityに入れ(たいと思い)ます。Catmull-ClarkのWikipediaページをご覧いただくと、頂点の関係式は中学レベル以下ですね。記事書く必要ある??って思うかもしれません。こんなの3秒で書いてやる!とか、思いましたか?私か思いました。orz

さて問題:よく読むと、このアルゴリズムはN角形に対応しています。そこでUnityは、なんと、三角形(時には四角形)しかできないのです!!!

それだけではありません。メッシュを分割させるために、ボーンに変形された頂点位置が欲しいが、これも、なんと、シェーダー側でしか手に入れられないのです!!!(実はBakeMesh()関数もありますが、indexなどがめちゃくちゃかつ遅いのでやめました。)

ち。面倒なことになってきましたね。そもそも面のデータが取れないのに、どうやって実装するんだ。

あれあれ、この前も記事書きましたよ?この記事#2ですから、#1はどういう内容かな。
それはなんと、Unityにimportされないデータを読み取れるエディタースクリプトでした!!!!!パチパチパチ。
リンク張っておきます。

(ここからが実装の本文になりますが、正直いちいち説明するのがめんどいので手順だけ紹介します。詳しく知りたい人はGithubページへ)

まず、1で作ったスクリプトをEditorで呼ぶことにしました。.netでBlenderのexeを見つけて、それにアセットを入れて、同じフォルダーにデータを出力させました。こんな感じです。(.blend)の隣のn++ファイルが出力ファイル。

screenshot-429

これで面のデータが取れますので、これを表面分割アルゴリズムに突っ込みます。中学レベルの数学なので省略。
*ここでは、頂点を生成するアルゴリズムを実行しました。この関数はStart時点に一回だけ実行したいので、頂点関係をあらかじめバッファーに入れました。データ構造以下のようです。

screenshot-430

次に、変形された頂点の位置を読み込み、関係式に突っ込みたい。あれ、データが入手できない。ち。

シェーダーを使うしかないですね。では、どうやってシェーダーから頂点データを出力すればいいんだ?

やり方は2通りあります。テクスチャに書き込むか、ComputeBufferを使います。

テクスチャ使ったら、まあそれは簡単になりますし、一般のパソコンでも動くでしょうけど、分割したいメッシュ1体につき、カメラが一個増えます!!
仕方ない。ComputeBufferを使います。

待てよ、ComputeBufferつうのは、シェーダー語のRWStructuredBufferなので、行列のindexはどうするんだ??
indexは頂点のindexと同じなので、シェーダーが今レンダ―している頂点のindexを分かればよいのです!。。。どう渡すんだ?

答え:>>>UVマップを使います!!そもそも最終的にオリジナルメッシュは見えないので、UVを使っても問題ない!!

というわけでシェーダーはこんな風になります。

screenshot-431

さすがに長すぎますので、Part 2に続きます!戻ってくるぜ。

Unityを拡張しよう!#1: .Blendファイルを使いこなそう!

どうも、チョコです。

Unityで「これやりたい!」って思ったとき、機能不足でできないこと多いよね。拡張(エディタースクリプト)を書けばいいんだけど、そもそもアセットで使えるデータが限られているからできない。。。なんて思ったことあるかな。

今回はBlenderファイルをUnityで開いて、普通じゃ手に入れられない情報を抽出してみよう!

**この文書を読むにはUnity、C#、Pythonと英語(?)の前提知識が必要です。

Blenderを背景で開く

Blendファイルを読み取るためには、ユーザーが(当然ながら)Blenderを持っていないとできないので、まずBlenderの居場所を確認する。Windowsの場合は、RegistryEditorのSOFTWAREMicrosoftWindowsCurrentVersionUninstallキーにあります。

**注意:RegistryEditorをいじる時に注意してください。変なものいじったりしまうとOSが動かなくなる場合があります。

このキーの中にはすべてインストールされたプログラムが入っているので、Blenderのキーの存在を確認します。

screenshot-246

あった。ではここからBlender.exeの場所を出そう。

<br />
using (RegistryKey key = Registry.LocalMachine.OpenSubKey (registry_key)) {<br />
    foreach (string s in key.GetSubKeyNames()) {<br />
        using (RegistryKey key2 = key.OpenSubKey(s)) {<br />
            if ((string)key2.GetValue(&quot;DisplayName&quot;, &quot;&quot;) == &quot;Blender&quot;)<br />
                location = (string)key2.GetValue(&quot;InstallLocation&quot;, &quot;&quot;) + &quot;Blender.exe&quot;;<br />
         //なんかする<br />
        }<br />
    }<br />
}<br />

**細かい説明は省略させていただきます。(レポートまだ書いてないorz

BlenderでPythonスクリプトを実行

Blenderは、アッドオンやTextEditorでPythonスクリプトを実行し、シーン内のデータを編集したりできます。これを活かしてみよう。具体的には、Pythonを実行し、Unityのアセットフォルダになんか書き込もう。

まず、「System.Diagnostics.ProcessでBlenderを起動し、Pythonを実行して、自動で閉じる」のを背景でやってもらおう。Blender APIに書いてある通り–backgroundコマンドを送ります。
fileはアセットの中の.Blendのパス(例えば、F:/MyProject/Assets/Hoge.blend)。
**以下のコードはエディタースクリプトに入れます。やり方省略

<br />
Process.Start (location, file + &quot; &#8211;background&quot;);<br />

これでBlenderは背景起動された。コマンドみたいなものが起動されますね。

では、Pythonスクリプトを実行しよう。まずはこのスクリプトを実行してみよう。

<br />
Process.Start (location, file + &quot; &#8211;background &#8211;python &quot; + Application.dataPath + &quot;/Editor/hoge.py&quot;);<br />

そして、エディターフォルダに以下のhoge.pyを入れよう。

<br />
import bpy<br />
import sys<br />
class Hoge():<br />
 def execute(self):<br />
   print (&quot;hi&quot;)</p>
<p>if __name__ == &quot;__main__&quot;:<br />
 Hoge().execute()<br />

コマンドにhiが表示されたら勝ち。

次に、pythonスクリプトにパラメータを送ろう。 — のつぎに来るものがコマンドとしてパースされないので、pythonに使えばいいね。例えば、今のアセットフォルダの位置を渡してみよう。

<br />
Process.Start (location, file + &quot; &#8211;background &#8211;python &quot; + Application.dataPath + &quot;/Editor/ExportSS.py&quot; + &quot; &#8212; &quot; + new DirectoryInfo(file).Parent.FullName);<br />

**Python側では、sys.argv[sys.argv.index(“–“) + 1:]でパラメータ行列を取れます。

さて意味のあるものができるようになった。できることはさまざまあるが、例としてシーン内の「メッシュではないオブジェクト」の名前を出力してみよう。自明のコードは省略。

<br />
args = sys.argv[sys.argv.index(&quot;&#8211;&quot;) + 1:] #パラメータを取る<br />
scene = bpy.context.scene<br />
obj = bpy.context.active_object<br />
dir = args[0]<br />
name = args[1]</p>
<p>def execute(self):<br />
    if os.access(self.path, os.W_OK) is False:<br />
        print(&quot;permission denied : &quot; + self.dir)<br />
    return False<br />
    self.path = os.path.join(self.dir, self.name + &quot;.txt&quot;)<br />
    print (&quot;writing to: &quot; + self.path)</p>
<p>    with open(self.path, &quot;wb&quot;) as file:<br />
    for obj in self.scene.objects:<br />
        if obj.type != &#8216;MESH&#8217;:<br />
            self.write(file, obj.name + &quot;rn&quot;)<br />
    sys.exit() #自殺</p>
<p>def write (self, file, _str):<br />
    file.write(_str.encode())<br />

すると、.Blendファイルと同じ名前の.txtファイルができます。

以上、拡張機能でした。なんかやりたいときに使えるとうれしい。
では。

Blender Cycles “Lamborghini Gallardo LP570-4″作成 Part2:Material

こんにちは、画像の使いすぎでメディアを占領してしまい申し訳なくなってるmoumouです。
前回のモデリング編に続いて、Part2:マテリアル編を書いていきたいと思います。

応用が効きそうなことだけ書いているので、だんだんランボルギーニ関係なくなってます(笑)

 

このような流れで書いています。

  1. 全体の設計&モデリング編(+ドローン動画)
  2. マテリアル設定 (←今ここ)
  3. ライティング& 環境設定
  4. コンポジットによる実写合成

今回の目次

  1. フレネル効果
  2. バンプマップを利用したノード構成
  3. 綺麗な床のマテリアル

cyclesを扱ううえで知っておくと良いことを書いていきます。

続きを読む

Blender Cycles “Lamborghini Gallardo LP570-4″作成 Part1:Modeling (+ ドローン動画)

こんにちは、moumouです。

今更ですがBlender Cycles講習会、楽しんでもらえたみたいでよかったです。

今回は、みなさんご存じ超高級車”ランボルギーニ“をBlender Cyclesにて作成しました。

 

春休みには作り終えてたモデルなのですが、記事書くのがめんどかった,いや, ある程度長くなる記事だったので,  今更ですが連載記事として投稿したいと思います。

連載記事ということで、以下のような流れに分けて書いていきます。

  1. 全体の設計&モデリング編(←今ここ)
  2. マテリアル設定
  3. ライティング& 環境設定
  4. コンポジットによる実写合成

Blender経験者なら分かるように書いていくので、説明記事みたいになるかもしれません。

基本的に役に立ったことをメインで書いています。

今回の目次

今回のモデリング編は3ページの構成です。最後はオマケです。

このページ:  3Dモデル,モデリングの流れ
2ページ目: 小ネタ, モデリングの際に役立ったこと
3ページ目: ドローンお土産動画

 では早速、Part1.モデリング編を書いていきたいと思います。が、ぱっと見てさっと記事閉じる人向けに(笑)、まずはじめに今回作成した画像と3Dモデルをひとつ載せておきますね。

3Dモデル

↓が3Dモデルです。▶を押して約15秒後3Dモデルを見ることができます。マウス操作で360°回転,拡大できます。また、右下の設定ボタンでワイヤフレームを見たりMatCapで見たりできます。

Lamborghini gallardo lp570-4
by moumou
on Sketchfab

………………………….

続きを読む

Unityで使えるSkyboxを作る

こんにちは、Kishiです。今回はSkyboxを作ります。

  1. Blenderを開きます。
  2. UV球を作成します。大きさは中央の立方体よりもかなり大きくしてください。
  3. UV球を選択したまま編集モードからすべての面を選択してCtrl + Shift + Nですべての法線を内側へ向けます。あと、シェーディングから面をスムーズにします。
  4. 下図にシームをつけて展開します。UV図をエクスポートしたらお好きな空を描きます。
    kcs_skybox_6
  5. 描いた空をテクスチャとしてUV球に貼り付けます。
  6. 下図のようにランプの位置とエネルギを調節して太陽のようにします。
    kcs_skybox_2
  7. 中央の立方体を選択して下図のように設定します。
    kcs_skybox_0kcs_skybox_3
  8. F12でレンダリングします。そして、下図のようにお目当ての環境マップを保存します。(撮りなおしたいときは「環境マップをクリア」を選択してからF12)
    kcs_skybox_4

これで環境マップが手に入りました。そしていざUnityに持ってきてSkyboxのCubemapとして使おうとすると、ぐちゃぐちゃになってしまいます。

http://docs.unity3d.com/ja/current/Manual/class-Cubemap.html

このリンクからわかるように、Blenderで作られる環境マップの形のままではUnityでCubemapとして使えません。そこで、

https://github.com/TRSasasusu/blender_envmap_to_unity

このためのPythonスクリプトを作成しました。ライセンスはGPL v3ですが、このプログラム自体をあなたの制作物に含まない限り、その制作物にGPL v3は適用する必要はありません。(もちろん、適用したいならしてもかまいません)

使い方は簡単。ですがその前にPILをどうにかして手に入れます。(運が良ければ

<br />
$ easy_install pillow<br />

<br />
$ pip install PIL<br />

<br />
$ pip install Pillow<br />

で入るのですが、ダメなら

http://www.pythonware.com/products/pil/

で手に入れられます)

それから

<br />
$ python blender_envmap_to_unity.py hoge.png<br />

こうして完成した画像ファイルをUnityに持っていき、Texture TypeをCubemapにし、Fixup Edge Seamsにチェックを入れ、FormatをTruecolorにしてApply。そしてSkybox/Cubemapとしたマテリアルにこれを適用することで、ようやく自作Skyboxを作ることができます。
kcs_skybox_5

Blenderで環境マップを作るときに、UV球だけでなく山などもモデリングして立方体の周りにおいておけば、↑のような風景を作ることも可能です。