ResolutionGateの表示を切り替えるスクリプト

     タイトルの通り、ResolutionGateをトグルで切り替えるスクリプトです。

     今までも同じようなスクリプトを作ってはいたのですが、今回はResolutionGateのOverscanをレンダリング解像度とビューポートのサイズに合わせてフィットしてくれるように改良したものです。



     ResolutionGate表示時に、ビューポートの縦横比とレンダリング解像度に合わせてOverscanを自動調整します。
    resolutionGate_01.jpg
    resolutionGate_02.jpg
     MELの場合、ビューポートの解像度を取れなかったので今までこの機能を断念してたのですが、PythonではAPIにアクセスできるために実現できました!(MELでもあるのかな? あったらスイマセン)

     PythonAPIでロケータを作成した場合は、動作が遅すぎて話にならん! とか自分の不勉強っぷりを晒しちゃってましたが、こうやって簡単なツールを作成するときにアクセスできる領域が広がった事の恩恵をあらためて実感しました。
     こいつは便利だ! APIもっと勉強してかんとなぁ。

    import pymel.core as pm
    import maya.OpenMayaUI as OpenMayaUI
    
    def setResolutionGate( value=None, panel=None, overscan=None, overscanScale=1.0 ):
    	if panel == None:
    		panel = pm.getPanel( wf=True )
    	if not pm.modelPanel( panel, ex=True ):
    		return
    
    	# Get active camera.-------------------------------------------------------
    	cam = pm.ui.ModelPanel( panel ).getCamera()
    	cam = pm.ls( cam )[0]
    	camShape = cam.getShape( type='camera' )
    	if camShape == None:
    		return
    	# -------------------------------------------------------------------------
    
    	# Set resolution gate.-----------------------------------------------------
    	# Toggle switch for resolution gate if value variable is None.
    	isDisplayResolution = camShape.getDisplayResolution()
    	if value == None:
    		value = ( isDisplayResolution == 0 )
    	camShape.setDisplayResolution( value )
    
    	if isDisplayResolution:
    		camShape.setOverscan( 1.0 )
    		return
    	# -------------------------------------------------------------------------
    
    	if overscan != None:
    		camShape.setOverscan( overscan )
    		return
    
    	# Getting camera aspect ratio.---------------------------------------------
    	view = OpenMayaUI.M3dView()
    	OpenMayaUI.M3dView().getM3dViewFromModelPanel( panel, view )
    	width = view.portWidth()
    	height = view.portHeight()
    
    	camAspectRatio = float(width) / float(height)
    	# -------------------------------------------------------------------------
    
    
    	# -------------------------------------------------------------------------
    	res = pm.nodetypes.Resolution( 'defaultResolution' )
    	rWidth = res.getAttr( 'width' )
    	rHeight = res.getAttr( 'height' )
    	resAspectRatio = float(rWidth) / float(rHeight)
    	# -------------------------------------------------------------------------
    
    	# -------------------------------------------------------------------------
    	if camAspectRatio < resAspectRatio:
    		overscan = overscanScale
    	else:
    		overscan = (camAspectRatio / resAspectRatio) * overscanScale
    	camShape.setOverscan( overscan )
    	# -------------------------------------------------------------------------
    
    

     ビューポートの縦横の大きさはOpenMayaUIのM3dViewを使用しています。現在カレントになってるパネルの名前からM3dViewのインスタンスを作成し、そのインスタンスのportWidthとportHeightメソッドで縦横の大きさを取得。
     同様にdefaultResolutionノードからレンダリング解像度を取得し、それぞれを
    横ピクセル / 縦ピクセル
    
     でアスペクト比を取得し、レンダリングアスペクト比がビューポートアスペクト比より小さい場合(レンダリング解像度の方が縦長の場合)
    ビューポートアスペクト比 / レンダリングアスペクト比
    
    で算出した値を、カメラのoverscanアトリビュートにぶち込んでます。


     もっと早くにAPIを勉強しとくんだった! しかしAPIとMELが入り乱れて凄いなぁw
    Python恐るべし
    スポンサーサイト

    コメントの投稿

    非公開コメント

    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココのメールアドレスからご連絡できますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR