今日からインターン2週目に入ります
文字を自分の体の周りに自在に描く空書というコンテンツを作っています。
Unityで、メッシュを使って文字を書いているのですが、
そのメッシュの裏側を描画するために、shaderの勉強を少ししました。
もともとポリゴンの反面のみを描画するようにデフォルトでなっているのですが、
その機能をオフにします。そのためにはSubShader枠内にCull Offと記述すれば良いので、
以下のように挿入します。
Shader "Custome/test" { Properties { _Color ("Main Color", Color) = (0,0,0,1) _MainTex ("Base (RGB)", 2D) = "black" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200 Cull Off CGPROGRAM #pragma surface surf Lambert sampler2D _MainTex; fixed4 _Color; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG } Fallback "VertexLit" }
shaderは色々いじると奥深そうで、無駄に遊んでしまいました。
基本的にビルトインのshaderのソースを見ながらでしたが、面の描画色を変化させたり、描画位置を操ったりが意外にラクに出来ることに驚きました。
Kinect v2と連動して、手の位置でインクを描画するという基本的なところは動くようになりました。
Kinect v2からの入力はUnityのAsset Storeにある,
Kinect v2 with MS-SDK
https://www.assetstore.unity3d.com/jp/#!/content/18708
を使っています。Unity Proでなくても問題なく使えます.
これで手の3次元位置を取得して、毎サイクル、メッシュを動的にその位置に付け足しています。
手の位置は,このアセットのデモに付属しているCubemanControllerスクリプト内の手に相当するGameObjectから直接とってきているのですが、
同じアセットのKinectManagerスクリプトのGetJointPosition()とGetJointOrientation()でジョイントの位置姿勢を取得できます。
メッシュは断面が5角形のものをつなぎあわせています。
こんな感じです。
ただ、筆感がイマイチないのと、
文字を書きにくいこと、
そしてなにより、もともとあったリソースをキネクトに連動させただけ感がすごいので、
色々とブラッシュアップする必要があります。