mayaのカメラをなんとかしたい2 ~vartical を horizontal へ~

mayaのカメラでちょっと困ったことがありまして、
fitResolutionGateが　horizontal だったり　verticalだったり　混ざっちゃってることがあります。

混ざっててもまぁ良いのですが、揃ってるとかなりありがたいので揃えたいのですがー

horizontal　から vertical へ切り替えると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/84eba6d6-a795-0311-1559-d7e95362c9bf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/52b5f532-fda7-79bd-7fcc-2d32b127eb6b.png)

まぁこうなります。

どうなってる？
--

fitResolutionGate つまり、filmGateに対してresolutionGateをどのように定義するかですね。

horizontalは　filmGateの横辺 = resolutionGateの横辺　と定義し、
resolutionGateの比率を元にresolutionGateの横辺から縦辺を定義する。

verticalはその逆ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/174e8ec4-cf65-1079-1e14-85391f8ba447.png)

どうしよう？
--

horizontal -> vertical　で考えてみます。

resolutionGateのサイズを維持したままにできればいいのですが、
filmGateのサイズは変更したくないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/a0e3abac-2cd9-4b33-ef08-2ff3f69e834c.png)


となるとー postScaleでなんとか出来るでしょうか？

細かい数字はわかりませんが、目合わせでやるとこんな感じですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/f54a1c89-d160-924c-86e9-4e70706d5286.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/064a8148-1e7a-cd0c-4663-0e2176340c06.png)

となると

特定の平面上で

- horizontal時のresolutionGateサイズを取得
- horizontalからverticalに変更
- vertical時のresolutionGateサイズを取得
- h : v の比率を出す
- postscaleに設定

でやってみます。

実装
--

今回は

OpenMaya.MFnCamera.getRenderingFrustum

これを使用してみます。

> Returns the rendering frustum (left, right, bottom and top) for the camera.
This is the frustum that the maya renderer uses.

とのことです。
v -> h もまぁ同じ感じでとりあえずやってみます。

```python
import maya.cmds as cmds
import maya.api.OpenMaya as om

def getDagNode(target):    
    try:
        sellist = om.MGlobal.getSelectionListByName(target)
        return sellist.getDagPath(0)
    except:
        return None

def convertFilmFitToPostScale(target):
    deviceAspectRatio = cmds.getAttr("defaultResolution.deviceAspectRatio")
    targetCamDAG = getDagNode(target)
    targetCamFn = om.MFnCamera(targetCamDAG)

    sourceCamRenderSize = targetCamFn.getRenderingFrustum(deviceAspectRatio)

    if cmds.getAttr(target + ".filmFit") == 1:
        cmds.setAttr(target + ".filmFit",2)
        
    elif cmds.getAttr(target + ".filmFit") == 2:
        cmds.setAttr(target + ".filmFit",1)

    targetCamRenderSize = targetCamFn.getRenderingFrustum(deviceAspectRatio)

    ##(left, right, bottom and top)
    sourceCamRenderHight = sourceCamRenderSize[3] - sourceCamRenderSize[2]    
    sourceCamRenderWidth = sourceCamRenderSize[1] - sourceCamRenderSize[0]     
         
    targetCamRenderHight = targetCamRenderSize[3] - targetCamRenderSize[2]
    targetCamRenderWidth = targetCamRenderSize[1] - targetCamRenderSize[0]

    postScale = 1.0
    if cmds.getAttr(target + ".filmFit") == 2:
        postScale = targetCamRenderHight / sourceCamRenderHight
        
    elif cmds.getAttr(target + ".filmFit") == 1:
        postScale = targetCamRenderWidth / sourceCamRenderWidth
    
    cmds.setAttr(target + ".postScale", cmds.getAttr(target + ".postScale") * postScale)
    
```


horizontal の状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/c061f044-181a-dc28-3e70-145f95c5d3e5.png)

1回スクリプトを実行します。

```pyton
convertFilmFitToPostScale("persp1")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/bb925858-4d63-3599-5d73-c1068e8ddbc5.png)

ん～一致してる・・・ような気がします。

もう1回スクリプトを実行します。

```pyton
convertFilmFitToPostScale("persp1")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/fbe9fc1c-e2e3-eedc-6057-82ba292f4dce.png)

元に戻ったような気がします。

正しく確認するにはレンダリングして重ねてみない事には判らなそうですね。

レンダリングしてみたところ、ぴったりと合ってました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/6e1f789a-9321-ac76-2025-73defe0d0dc6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/137de622-d631-8262-2763-b3323580bffc.png)

で、postScaleをFocalLengthに変換すればカメラを出力できますね。