BlogKLabは、多くのスマートフォン向けゲームを開発・提供しています。スマートフォン向けゲームの開発と運用は、Webソーシャルゲームと比べて格段に複雑で、またコンシューマゲーム開発とも異なったノウハウが求められる領域もあります。このブログでは、KLabのゲーム開発・運用の中で培われた様々な技術や挑戦とそのノウハウについて、広く紹介していきます。Surface〜※この記事ではgitのタグ「v2.75」から生成したブランチ上でコードリーディングしています。前回まではタグ「v2.74」でコードリーディングしていましたが、今回からは「v2.75」を使います。Surfaceについて追いかけていこうと思います。Surfaceモディファイアは私がBlenderを学び始めてから最初に触れたモディファイアです。私はアーティストではないので立派な作品が作れる訳ではないのですが、ゲーム開発の際にテスト用のモデルを作るときやスカルプトの元となるメッシュを作るとき等、個人的には最も使用頻度の高いモディファイアです。Surfaceってなに??です。(ゲーム開発のテスト用として作ったモデルより)まずはキーワード検索それではコードリーディングを始めます。それっぽいキーワードで検索して読む場所の狙いをつけていきます。これくらいなら1つずつ見ていけますね。こんなenum値が見つかりました。基本的なモディファイアとして据えられているようですね。このenum値の定義がある事は覚えておく事にします。「Subdivision(Any)Surface」を検索しても頂点の位置を計算しているような関数がヒットしませんでした。SurfaceモディファイアのApplyボタンを押したときの挙動から追いかけていく事にします。Applyボタンにマウスカーソルを当て、Pythonコードを表示します。このPythonコードと同じように「modifier_apply(」で検索すればヒントになるかもしれません。files今回もうまく絞り込めたようです。//マスクは今回関係ないと思うこんな感じです。mode)を細かく調べていきましょう。ステップ実行ED_object_modifier_apply関数の先頭部分にブレイクポイントを張ってApplyボタンを押します。するとちゃんとこの関数を通ることが確認できます。ここで引数のModifierDataというのが気になるので定義に飛んでみます。すると先ほど登場したenum値「ModifierType」のすぐ近くに定義されていました。mode;にはenum値「ModifierType」「ModifierMode」がそれぞれ入りそうですね。Surfaceモディファイアを示す「eModifierType_Subsurf」の値は1です。Surfaceモディファイアを示すModifierDataであることが確認できます。ここからメッシュを形作るための計算をしている場所を目指していきたいと思います。ここから先は紛らわしい名前の関数はないのであまり迷いなくステップインしていけます。flags)という関数までたどり着きました。この関数はDerivedMesh型のポインタを引数として受け取り、同じ型のポインタを返す関数です。引数の方が変形前のメッシュ、戻り値の方が変形後のメッシュなのだと予想できます。*)result;}となっているので、dmとresultsの頂点数を比較してみると確認できるでしょう。*dm)にたどり着きました。Surfaceの計算を行っているようです。この「CCG」ってなんだろう??引数の型「CCGSubSurf」で検索してみましょう。するとhttp://minormatter.com/zr/software/ccgsubsurfにたどり着きます。Library」CCGとはこの事だったのですね。Surfaceライブラリだそうです。この記事の執筆時点ではv0.01がダウンロードできるようで、.h/.cファイル1つずつのシンプルなものになっています。Blender2.75にはこのライブラリが組み込まれているようですね。2015の中に「OpenSubdiv」の導入があります。Surfaceの処理が可能になるようですね。Surfaceモディファイアが高速に処理できるようになる事が期待できそうです。