Maya LTでモデリングした3DデータをMax7で使うぞい #max7 #MayaLT #Jitter

Maya LT を使ってモデリングしたい。

3Dプリンター持っていたり、VJで3Dモデル使ってみようと思って、Blenderを勉強してみようと思ったんですが、操作が難しすぎて挫折していました。そんな中、最近UnityやUnreal Engineのようなゲーム開発環境向けにMaya LTというソフトが比較的お手頃な価格で出ておました。ポリゴン書き出し数やレンダリングの制限があるようなのですが、Blenderよりは分かりやすい操作で、Maxで使うオブジェクトを作るにも丁度良さそうだったので使ってみる事に。

モデルを用意

 

スクリーンショット 2015-03-22 21.34.56 モデルを用意して、FBXで書き出し。

FBXをDAEに変換したい

Maya LTでつくったモデルは、FBX / OBJ / Maya LTフォーマットで書き出せます。一方、Maxのjit.gl.modelが対応しているフォーマットは、DAEとOBJです。それならOBJで書き出し読込すれば良さそうですが、頂点カラーの設定がどうにも読み込まれ無かったりで、使えませんでした。続いて、プランBとしてFBXをDAEに変換を試してみました。 スクリーンショット 2015-03-22 21.22.22 FBX→DAE変換は、AutoDesk公式でFBX Converterというアプリケーションがでております。これにMaya LTで書きだしたFBXをドラッグ&ドロップで読み込ませ、”Destination format”で”DAE Collada”を選択しエクスポートで変換完了。

MaxでDAEの読込表示

スクリーンショット 2015-03-22 22.08.13 jit.world(Max7からjit.gl系のセッティングが楽になりましたね)、jit.gl.model、jit.gl.handleを繋いで書きだしたDAEを読込むと。 

スクリーンショット 2015-03-22 23.04.21

表示できました。jit.gl.modelの@modeがdisplaylistかimmediateにしないと、Maya LTで設定した頂点カラーが描画されないので注意です。

おまけ:Maya LTでフェースに色をつける


頂点カラーでモデルに色を塗った場合、色の境界は自動的に補間されてなだらかに繋がってしまいます。それを防ぐために、フェース単位で色を塗る方法がありました。

Continue reading


jit.gl.model / jit.gl.shader を使って初音ミク(はちゅねみく)さんをメッシュに分解するエフェクト #jitter #maxmsp #glsl

メッシュ分解

スクリーンショット 2014-08-08 00.18.16ジオメトリシェーダを使ったエフェクトのテストです。メッシュが法線ベクトルの方向に飛んでいきます。Tell Your Worldで、もっとカッコよく使われていましたね。

Before はちゅねみくさん

スクリーンショット 2014-08-07 23.35.04

After はちゅねみくさん

スクリーンショット 2014-08-07 23.35.23モデルは、note.xさんで配布されているものを利用させて頂いております。実は、この処理は無理にシェーダでやらなくても、jit.genとjit.gl.mesh等々を使えば、CPU上でできたりします。

Before ちび初音ミク

スクリーンショット 2014-08-07 23.34.23

After ちび初音ミク

スクリーンショット 2014-08-07 23.34.26あれっデブミクさんになってしまった・・・メッシュが分解されて飛ぶ処理だと思っていたのですが、分解されてない?!処理を見なおさなければ。モデルは、モデモデさんで配布されているのを使わせて頂きました!

ジオメトリシェーダ

スクリーンショット 2014-08-07 23.41.14この画像では、元のはちゅねみくさんのモデルデータを保持しつつ、分解したトライアングルも描画しています。ジオメトリシェーダを使ってGPU上でメッシュの数を2倍にして表示するとできます。この処理はジオメトリシェーダらしいエフェクトと言えるかもしれません。

インタラクティブに音に反応


せっかくMax上で動作しているので、音に合わせてインタラクティブに変化させてみました。

JSX / GLSLコード

	<param name="size" type="float" default="0." />
	<language name="glsl" version="1.2">
		<bind param="tex0" program="fp" />
		<bind param="size" program="gp" />

Maxのためのパラメーター、バインドの指定です。size変数でメッシュの位置を制御しています。tex0は、jit.gl.textureから渡されるテクスチャです。jit.gl.modelにjit.gl.shaderを適応した場合に、テクスチャをjit.gl.textureで別途設定してあげる必要があります。

Vertex Shader

 #version 120

 varying vec2 VTexCoord0;
 varying vec3 VEyeNormal;
 varying vec3 VEyeVertex;

 void main()
 {
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
   VTexCoord0 = vec2(gl_TextureMatrix[0]*gl_MultiTexCoord0);
   VEyeNormal = vec3(gl_ModelViewMatrix * vec4(gl_Normal, 0.0));
   VEyeVertex = vec3(gl_ModelViewMatrix * gl_Vertex);
 }

ほとんどジオメトリシェーダのための下準備しかしてないですね。

Geometry Shader

 #version 120
 #extension GL_EXT_geometry_shader4 : enable

uniform float size;

 //VARYING
 varying in vec2 VTexCoord0[3];   //[3] because this makes a triangle
 varying in vec3 VEyeNormal[3];
 varying in vec3 VEyeVertex[3];
 
 //GLOBALFUNCTION
 void main()
 {
   int i;
   vec3 newVertex;
   
   /*
   //Pass through the original vertex   
   for(i=0; i<gl_VerticesIn; i++)
   {
     gl_Position = gl_PositionIn[i];
     gl_TexCoord[0].st = VTexCoord0[i];
     EmitVertex();
   }
   EndPrimitive();
   */
   
   //Push the vertex out a little using the normal
   for(i=0; i<gl_VerticesIn; i++)
   {
     newVertex = VEyeNormal[i] * size + VEyeVertex[i];
     gl_Position = gl_ProjectionMatrix * vec4(newVertex, 1.0);
     gl_TexCoord[0].st = VTexCoord0[i];
     EmitVertex();
   }
   EndPrimitive();
}

三角形プリミティブを受け取って、各頂点を法線方向にずらしてプリミティブを描画しています。なのでメッシュに分割するエフェクトじゃなかった(笑)ネギミクさんは法線ベクトルの値がプリミティブに垂直だから分解されているようです。コメントアウトされている所では、元のプリミティブを描画できます。

Fragment Shader

#version 120

uniform sampler2DRect tex0;

void main()
{
  vec4 texel = texture2DRect(tex0, gl_TexCoord[0].st);
  gl_FragColor = texel;
}

テクスチャを引っ張ってきて色を付けているだけです。

おまけ ジオメトリシェーダ エフェクト その2

スクリーンショット 2014-08-07 17.20.20
ジオメトリシェーダにtriangleで入ってきたプリミティブをline_stripに変換するとこんな表現も簡単にできます。


jit.gl.model / jit.gl.shader を使って初音ミク(はちゅねみく)さんのテクスチャをいじる #jitter #maxmsp #glsl

Cycling74 Maxでもミクさん出してみたい!(今更感も凄いですが)

スクリーンショット 2014-08-07 03.05.19

jit.gl.model TIPS

  • はちゅねみくのモデルは、こちらで配布されているCollada(.dae)をダウンロード
  • jit.gl.modelに対してreadでobjを読んだら、問題なくモデルロードされた
  • テクスチャ画像(miku.png)をMaxのパスへ入れておかないと読み込まれないので注意
  • jit.gl.modelへ@textureを使って、jit.gl.textureに読み込ませたテクスチャを複数指定する事も可能
  • @shader アトリビュートで jit.gl.shaderがバインドできるので、シェーダ使える

シェーダによってマテリアルを変更

スクリーンショット 2014-08-07 02.55.10
スクリーンショット 2014-08-07 02.55.22元のテクスチャを全く使わないシェーダを割り当てるとこうなっちゃいますね。@smooth_shadingってGLSLではどう書くんだろう。

シェーダによる複数テクスチャ合成

スクリーンショット 2014-08-07 02.51.22雪ミクさん・・・?

スクリーンショット 2014-08-07 02.51.14炎のミクさん。静止画なので分かりづらいですが、動画テクスチャです。Maxは動画テクスチャの扱いやすさはピカイチらしいです。Vertex ShaderやGeometry Shaderを使って頂点やプリミティブをいじいじすると、音に合わせた表現とかはしやすそうですね。あとMMDのモデルを出してダンスなんかも試してみたいです。

GLSL / テッセレーションについて(余談)

  • いまGLSLのライティングやプロシージャルの処理を小分けのファイルに書いちゃってます。ゲーム制作や動画制作では重ねがけすると思うんだけど、どうしてるんだろう?Maxだと1オブジェクト描画に対しては基本的に1つのjit.gl.shaderしかバインドできないみたいだし。そうするとGLSLを関数化してライブラリにする必要がでてくると思うのだけど、方法がわからない。OpenGL SuperBible: Comprehensive Tutorial and Reference (4th Edition)には、書いてなかった。
  • ジオメトリシェーダを使ってテッセレーションを試してみたい。最近のGPUだとテッセレーション用のシェーダを使うらしいのですが、原理的にはGLSL1.2でもジオメトリシェーダを使ってできそう。Pixarはローポリゴンデータをレンダリング時にGPU上でテッセレーションしまくってハイポリにしているそうです。OpenSubDivというオープンソースライブラリも公開していてすげえ。