HEXA BLOG

その他

HEXA BLOGその他2016.11.22

TAとUE4カメラ

  はじめてまして、Ritaro です。

こちらに記事を書くのはこれが最初になります。

今後とも、よろしくお願い致します。

 

 さて、わたくしのお仕事に関することをご紹介致しましょう。

職種として、名刺にも書かせて頂いている名称は ”テクニカル アーティスト”;通称 TA  になります。

 

TAには2通りの職歴から成る方が多く、

1つはプログラマーがグラフィック回りのサポートをする事を通じて、

もう1つはグラフィッカーがツールや技術サポートをする事を通じて、

です。

わたくしは後者でして、もとは…

というか今でも 3Dアーティストである、ということには変わりはありません。

 

後者の特徴としては、

キャラクター作成やリギングやモーションキャプチャーとその編集等を 業務として携わっていたりするので、

アニメーションに詳しかったりします。

また、複数の3D制作ソフト(DCCツールと言う)やミドルウェアを扱う経験があったりします。

具体的にはMayaだけでなくMotionBuilderやMaxやSoftiamgeを知っていたり、

UnityやUnrealEngineなど複数のミドルウェアを扱っていたりします。

スクリプティングもVBS,JScript,C#,MEL,Python,MaxScript,OpenMayaなど 色々携わります。

 

開発上の問題点を解く上で色々な引き出しを持っている、

ということが 技術サポート を期待される原点になります。

 

では、最初からそんなに多くの事を知っていたのか・・・と言うと、もちろんそんなことはないです。

仕事柄徐々に覚えて言った、という点はあります。

・・・でも、それだけでは無いのも事実です。

常日頃の自らの切磋琢磨があるはずです。

そのことが開発業務を日々支えていき、技量になり おもしろい創意工夫が生まれたりします。

 

ちょっと具体的な、面白い対処法、でもあったら『おお、使えるかも

 ・・って思うようなものを1つご紹介してみましょう。

 


 

「UnrealEngine(UE4)にMayaで設定したカメラのアニメーションを持って来たい!」

 

という時、移動・回転・縮尺は当然簡単に(?)インポート出来ます。

(MayaとUE4は軸向きが異なる為、ちょっとコツが要ります)

ではその他のデータ、焦点距離・ビューアングル・アパーチャはどうでしょうか。

カメラは、その画像の見た目を決める訳ですからその他のデータもとても重要です。

 

UE4にはFBX形式でデータをインポート出来るのは分っているとして、 アニメーションがスケルタルでないとインポートしてくれません。 そこで、残りの3つのデータは任意に作成したジョイントの移動XYZの値のアニメーションとして 持って来てコピペ対応にする、としましょう。

少し間接的な方法ですが、重要なのは必要とするアニメーションキーを持って来れる事にあります。

 で、Mayaをご存知な方は、Mayaのカメラってビューアングルって設定値はスクリプトから 取れますが、

アニメーションは焦点距離から計算する、・・と、式が必要になりますね。

 こんなアプローチでどうぞ。

 

選択されたカメラからアパーチャが取れます。

import maya.cmds as cmds 
import math


selected_camera = cmds.ls(selection=True)[0] 
aperture = cmds.getAttr(selected_camera + '.hfa')

選択されたカメラのシェイプから焦点距離が取れます。

selected_camera_shape = cmds.listRelatives(selected_camera)[0]
focalLength = cmds.getAttr(selected_camera_shape + '.focalLength')

その2つからビューアングルが計算出来ます。

c_fov = aperture * 0.5 / (focalLength * 0.03937) 
fov = 2.0 * math.atan(c_fov) / 3.14159 * 180.0

で、アパーチャってあまりアニメーションさせないと考えます。

つまりそのカットではアパーチャは固定値で良いとします。

焦点距離はMayaからキーアニメーションを用意出来るので、 そのキーアニメーションをビューアングル用に複製して キーが打ってある値毎に上記計算をしてビューアングルのアニメーションカーブを作成します。

これらを任意に作成した1つのジョイントの移動X,Y,Z値にアニメーションとして設定して FBXで出力します。  

  ・・というようなツールをこしらえる TA の Ritaro でした。

 

   <ツールは自己責任でお使いください> (GUIとFBX出力部分は記載しておりません)

import maya.cmds as cmds
import math

selected_camera = cmds.ls(selection=True)[0]
selected_camera_shape = cmds.listRelatives(selected_camera)[0]

c_aperture = cmds.getAttr(selected_camera + '.hfa')
c_fl = cmds.getAttr(selected_camera_shape + '.focalLength')

cmds.select(clear=True)
joint_name = cmds.joint(name='Maya_VeiwAngle',p=(0, 0, 0) )

cmds.select(clear=True)
fl_list = cmds.listConnections(selected_camera_shape +'.focalLength',source=True)

if fl_list != None:
    cmds.select(selected_camera_shape,r=True)
    cmds.selectKey(fl_list[0], keyframe=True, add=True)
    cmds.currentTime( 0 )
    cmds.copyKey()
    cmds.pasteKey(joint_name, attribute='translateX',option='insert',copies=1,connect=True)
    cmds.pasteKey(joint_name, attribute='translateZ',option='insert',copies=1,connect=True)
else:
    cmds.setKeyframe(joint_name + '.translateX',time=(0,0),value=c_fl)
    cmds.setKeyframe(joint_name + '.translateZ',time=(0,0),value=c_fl)


cmds.setKeyframe(joint_name + '.translateY',time=(0,0),value=c_aperture)

cmds.select(clear=True)
cmds.select(joint_name,r=True)
cmds.selectKey(joint_name + '_translateZ',keyframe=True,add=True)
joint_f_curve_keys = cmds.keyframe(query=True,keyframeCount=True)
joint_f_curve_data = cmds.keyframe(joint_name + '_translateZ',query=True,valueChange=True,timeChange=True);

count = 0
for i in range(joint_f_curve_keys):
    jc_time = joint_f_curve_data[count]
    jc_value = joint_f_curve_data[count + 1]
    count = count + 2
    c_fov1 = c_aperture * 0.5 / (jc_value * 0.03937)
    c_fov = 2.0 * math.atan(c_fov1) / 3.14159 * 180.0
    cmds.setKeyframe(joint_name + '.translateZ',time=(jc_time,jc_time),value=c_fov)

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE 

NEWS