Mayaカメラデータunityインストール

16,415 views

Published on

UniteJapan 2013での講演資料です。
Mayaのカメラ設定をUnityにインポートするTipsをまとめてあります。
サンプルファイルは以下にアップされていますので、合わせてご利用ください。
https://dl.dropboxusercontent.com/u/6488074/POSTBOX/UniteJapan/mayaUnity130415.zip

0 Comments
28 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
16,415
On SlideShare
0
From Embeds
0
Number of Embeds
3,277
Actions
Shares
0
Downloads
79
Comments
0
Likes
28
Embeds 0
No embeds

No notes for slide

Mayaカメラデータunityインストール

  1. 1. Mayaカメラ設定をUnityにインポートするTipsUnity Technologies Japan 合同会社コミュニティエバンジェリスト小林 信行
  2. 2. このセッションについてMayaのカメラの位置、回転、ニアおよびファークリッピングプレーン、FOVをUnityに移すためのHow-Toです。本セッションでは、このような作業をしたい場合の基本的な考え方をご紹介します。多分、同じような方法で様々な値をMayaから引き渡すことができますので、皆さんも研究してみてください。面白いTipsを発見した方は、ぜひfacebookの『Unityユーザー助け合い所』のほうにご報告を!
  3. 3. このセッションについて本セッションの関連データは以下にアップしてあります。http://d.pr/lLDx
  4. 4. このセッションでお話すること一言で説明しちゃいますと、「MayaからUnityに直接カメラパスは引き渡せないので、カメラパス等のアニメーションデータを焼き付けたロケータを代わりにUnityに引き渡してやり、Unity側ではロケータが持っているアニメーションデータをメインカメラに引き渡すスクリプトを作成しアタッチします」ということだけなのですが、3つ問題があります。• FOV(MayaだとAOV?)がキーが打てるアトリビュート として存在してない• なので、そもそもMayaでアニメーションキーが打てない• だから、ドリブンキーとかも使えない→どうする?
  5. 5. このセッションでお話すること答えを言ってしまうと、• FOVは、焦点距離(focalLength)と垂直画角(verticalFilmAperture)から計算してもとめる• Maya側のFOVのキーは、焦点距離にキーを打つ• ロケータに、Mayaメインカメラの必要なアトリビュートを MELで転送し、シミュレーションベイクして、FBX形式で取り出すこれで終了です。後は具体的なやり方になります。
  6. 6. サンプルシーン:Maya上でのシーンビュー
  7. 7. サンプルシーン:Maya上でのカメラビュー
  8. 8. サンプルシーン:Unity上でのカメラビュー
  9. 9. Maya側での作業
  10. 10. カメラにアニメーションをつける● 以下、Mayaのカメラ名をMain_Camera、  カメラシェイプをMain_CameraShapeとする● アトリビュートエディタよりカメラシェイプ内のFit Resolution Gateを  Verticalにしておく● カメラのアニメーションで主に使用するキー ● カメラのチャンネルボックス内の    Translate X/Y/Z、Rotate X/Y/Z、Focal Length ● 「FOV変更」を記録する時には、Focal Lengthにキーを打ちます ● MayaのAngle of Viewは内部計算値なので、キーは打てないので注意
  11. 11. カメラにアニメーションをつける
  12. 12. ロケータを作成する● Create>Locator からロケータを作成する● ロケータ名をlocator_Cameraにするコンストレインまで終わった状態
  13. 13. ロケータをカメラにコンストレインする● PointとOrientで、ロケータの位置と回転をカメラに  コンストレインする● Main_Camera→locator_Cameraの順に選択して、  Constrain>Point□、Constrain>Orient□でコンストレインする● オプションでMaintain offsetはチェックアウトしておく● PointとOrientで2回コンストレインをおこなう● 結果、locator_Cameraの位置と回転にカメラと同じ値が入る (ボックスが青くなる)
  14. 14. ロケータのスケールX値にニアクリッピングプレーンを転送する● locator_CameraのチャンネルボックスよりScale Xを選択し、チャンネルボックスのメニューよりEdit>Expressionを選択する● Expression Editorが立ち上がるので、Expressionの欄にScale X用のMELをコピペする。Scale Xには、ニアクリッププレーンを納める// ScaleXの処理// 使用する変数の宣言float $ncp;// nearClipPlaneを取得$ncp = `getAttrMain_CameraShape.nearClipPlane`;// カメラのscaleXにnearClipPlaneを納めるsetAttr locator_Camera.scaleX $ncp;
  15. 15. ロケータのスケールY値にファークリッピングプレーンを転送する● 同じく、Scale Yを選択し、Expressionを追加する。Scale Yには、ファークリッププレーンを納める// ScaleYの処理// 使用する変数の宣言float $fcp;// farClipPlaneを取得$fcp = `getAttr Main_CameraShape.farClipPlane`;// カメラのscaleXにfarClipPlaneを納めるsetAttr locator_Camera.scaleY $fcp;
  16. 16. ロケータのスケールZ値にUnity互換のFOVを計算し、転送する● 最後にScale Zを選択し、Expressionを追加する。Scale Zには、FOVを納める// ScaleZの処理// 使用する変数の宣言float $fl;float $vfa;float $FoV;// シェイプノードから焦点距離を取得$fl = `getAttr Main_CameraShape.focalLength`;// シェイプノードから垂直画角を取得$vfa = `getAttr Main_CameraShape.verticalFilmAperture`;// 垂直画角と焦点距離からFOVを計算する$FoV = 2.0 * atan((0.5 * $vfa) / ($fl * 0.03937)) * 57.29578;// FOVをscaleZに納めるsetAttr locator_Camera.scaleZ $FoV;FOVの計算は以下のHPを参考にさせていただきました。http://hideapp.cocolog-nifty.com/blog/2012/12/mayafov-997f.html
  17. 17. ロケータの値をシミュレーションベイクする● locator_Cameraのチャンネルボックスより、Translate X∼Scale Zまで選択する● Edit>Keys>Bake Simulationsより全キーをシミュレーションベイクする● もしFカーブを最適化したいなら、グラフエディタを開き、Translate X∼Scale Zまで選択した  後で、グラフエディタのメニューよりCurves>Simplify Curveで最適化するシミュレーションベイクが終了すると、全フレームにキーが打たれます。ボックス内は赤くなります
  18. 18. FBXで出力する● アニメーションしているオブジェクトおよびシーンオブジェクト等とは別に  locator_CameraのみFBXに出力する● locator_CameraのみのFBXをUnityではカメラオブジェクトのパスとして使用します● 例として、アニメーションしているボールをBall.fbx、床をFloor.fbx、  local_CameraをMayaCamera.fbxとして出力したものとします
  19. 19. Unity側での作業
  20. 20. FBXデータの取り込み● カメラパスをFBXで転送する場合には、MayaとUnity側でシーンのスケールを合わせておくことが重要● FBXをUnityのProjetctウィンドウにドロップし、ドロップしたFBXをInspactorで表示し、Modelボタンを押すと、Meshesの中にScale Factorという項目があります。もしMayaとUnityとでサイズが違う場合にはこの値を調整します。デフォルトでは0.01が入っています。 ● Maya上でMeter単位で作業している場合:FBXに変換する時に出力単位をCentimetersにして、    Unity上のScale Factorはデフォルトの0.01のままとします ● Maya上でCentimeter単位で作業している場合:FBXに変換する時に出力単位をCentimetersにして、Unity上のScale Factorは、1にします。● Scale Factorを調整した後で、ProjectウィンドウからFBXモデルをHierarchyにドロップします。するとMaya上と同じスケールでモデルが表示されます。● Ball.fbx、Floor.fbxを配置したシーンに、MayaCamera.fbxを配置します。この状態でMayaCameraを選択してプレイすると、ギズモが動くことが確認できると思います。
  21. 21. FBXデータの取り込みデフォルト値 Maya上でCentimeter単位で作業している場合には、FBXの出力単位をCentimetersに設定した上で、読み込み時にこちらの値を1にしますMaya上でMeter単位で作業している場合には、FBXの出力単位をCentimetersに設定して出力すると、デフォルト値のままでMaya上のサイズとUnity上のサイズが一致します。
  22. 22. UnityのMain CameraをMayaCameraの子にする● Hierarchyウィンドウで、UnityのMain CameraをMayaCameraオブジェクトの子にします● Main Cameraのローカル座標を以下のようにします ● Position(x,y,z) = (0,0,0)、Rotation(x,y,z)= (0,180,0)、Scale(x,y,z)=(1,1,1) ● Y軸のみ180度回転させるのは、MayaとUnityで座標系が左右異なるからです● この時点で、カメラの位置と回転に関してはMayaのシーンと同じになります。UnityのMain CameraをMayaCameraオブジェクトの子にするY軸周りに180度回転すると、UnityとMayaのカメラの向きが一致する
  23. 23. MayaCameraにスクリプトをアタッチする● MayaCameraオブジェクトにMayaCameraConverterスクリプトを添付します。  このスクリプトは、MayaCameraのScale座標に入っている、ニアクリッププレーン、ファークリッププレーン、FOVの値をUnityのMain Cameraに転送するものです。using UnityEngine;using System.Collections;public class MayaCameraConverter : MonoBehaviour {Camera _camera;void Awake (){_camera = GetComponentInChildren<Camera>();}void LateUpdate (){ _camera.nearClipPlane = transform.localScale.x; _camera.farClipPlane = transform.localScale.y; _camera.fieldOfView = transform.localScale.z;}}
  24. 24. ご静聴ありがとうございました!

×