Mayaカメラ設定を
UnityにインポートするTips
Unity Technologies Japan 合同会社
コミュニティエバンジェリスト
小林 信行
このセッションについて
Mayaのカメラの位置、回転、ニアおよびファー
クリッピングプレーン、FOVをUnityに移すため
のHow-Toです。
本セッションでは、このような作業をしたい場合の
基本的な考え方をご紹介します。多分、同じような
方法で様々な値をMayaから引き渡すことができます
ので、皆さんも研究してみてください。
面白いTipsを発見した方は、ぜひfacebookの
『Unityユーザー助け合い所』のほうにご報告を!
このセッションについて
本セッションの関連データは以下にアップして
あります。
http://d.pr/lLDx
このセッションでお話すること
一言で説明しちゃいますと、
「MayaからUnityに直接カメラパスは引き渡せないので、カメラパス等の
アニメーションデータを焼き付けたロケータを代わりにUnityに引き渡して
やり、Unity側ではロケータが持っているアニメーションデータをメイン
カメラに引き渡すスクリプトを作成しアタッチします」
ということだけなのですが、3つ問題があります。
• FOV(MayaだとAOV?)がキーが打てるアトリビュート
 として存在してない
• なので、そもそもMayaでアニメーションキーが打てない
• だから、ドリブンキーとかも使えない
→どうする?
このセッションでお話すること
答えを言ってしまうと、
• FOVは、焦点距離(focalLength)と垂直画角(verticalFilmAperture)
から計算してもとめる
• Maya側のFOVのキーは、焦点距離にキーを打つ
• ロケータに、Mayaメインカメラの必要なアトリビュートを
 MELで転送し、シミュレーションベイクして、FBX形式で取り出す
これで終了です。後は具体的なやり方になります。
サンプルシーン:Maya上でのシーンビュー
サンプルシーン:Maya上でのカメラビュー
サンプルシーン:Unity上でのカメラビュー
Maya側での作業
カメラにアニメーションをつける
●
 以下、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は内部計算値なので、キーは打てないので注意
カメラにアニメーションをつける
ロケータを作成する
●
 Create>Locator からロケータを作成する
●
 ロケータ名をlocator_Cameraにする
コンストレインまで
終わった状態
ロケータをカメラにコンストレインする
●
 PointとOrientで、ロケータの位置と回転をカメラに
  コンストレインする
●
 Main_Camera→locator_Cameraの順に選択して、
  Constrain>Point□、Constrain>Orient□でコンストレインする
●
 オプションでMaintain offsetはチェックアウトしておく
●
 PointとOrientで2回コンストレインをおこなう
●
 結果、locator_Cameraの位置と回転にカメラと同じ値が入る
 (ボックスが青くなる)
ロケータのスケールX値にニアクリッピングプレーンを転送する
●
 locator_CameraのチャンネルボックスよりScale Xを選択し、
チャンネルボックスのメニューよりEdit>Expressionを選択する
●
 Expression Editorが立ち上がるので、Expressionの欄にScale X用のMELを
コピペする。Scale Xには、ニアクリッププレーンを納める
// ScaleXの処理
// 使用する変数の宣言
float $ncp;
// nearClipPlaneを取得
$ncp = `getAttr
Main_CameraShape.nearClipPlane`;
// カメラのscaleXにnearClipPlaneを納める
setAttr locator_Camera.scaleX $ncp;
ロケータのスケールY値にファークリッピングプレーンを転送する
●
 同じく、Scale Yを選択し、Expressionを追加する。
Scale Yには、ファークリッププレーンを納める
// ScaleYの処理
// 使用する変数の宣言
float $fcp;
// farClipPlaneを取得
$fcp = `getAttr Main_CameraShape.farClipPlane`;
// カメラのscaleXにfarClipPlaneを納める
setAttr locator_Camera.scaleY $fcp;
ロケータのスケール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
ロケータの値をシミュレーションベイクする
●
 locator_Cameraのチャンネルボックスより、Translate X∼Scale Zまで選択する
●
 Edit>Keys>Bake Simulationsより全キーをシミュレーションベイクする
●
 もしFカーブを最適化したいなら、グラフエディタを開き、Translate X∼Scale Zまで選択した
  後で、グラフエディタのメニューよりCurves>Simplify Curveで最適化する
シミュレーションベイクが終了すると、
全フレームにキーが打たれます。
ボックス内は
赤くなります
FBXで出力する
●
 アニメーションしているオブジェクトおよびシーンオブジェクト等とは別に
  locator_CameraのみFBXに出力する
●
 locator_CameraのみのFBXをUnityではカメラオブジェクトのパスとして使用します
●
 例として、アニメーションしているボールをBall.fbx、床をFloor.fbx、
  local_CameraをMayaCamera.fbxとして出力したものとします
Unity側での作業
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を選択してプレイすると、ギズモが動くことが確認できると思います。
FBXデータの取り込み
デフォルト値 Maya上でCentimeter単位で作業している
場合には、FBXの出力単位をCentimeters
に設定した上で、読み込み時にこちらの
値を1にします
Maya上でMeter単位で作業している場合には、FBX
の出力単位をCentimetersに設定して出力すると、
デフォルト値のままでMaya上のサイズとUnity上の
サイズが一致します。
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のカメラの向きが一致する
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;
}
}
ご静聴ありがとう
ございました!

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