1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

mayaのカメラをなんとかしたい5 ~2Dカメラアニメーション~ 改

1
Last updated at Posted at 2025-12-15

色々調整して気づいたんですがー

うーん

image.png

image.png

nearClipPlaneを動かすと ずれちゃいますね。

translate値に対して、nearClipPlane移動時のスケール比が考慮されてないのでずれちゃうわけですね。

なので、それを考慮した構造にしようかと思います。

構造修正

image.png

scaleSpaceで空間をスケールして、移動値に見た目上スケールが掛かってるようにします。
plateCtrlで移動を行い、 resolutionGateのサイズ合わせはここのスケールで行います。

これらをjointで作ることで、inverseScaleを発生させ 移動値のスケールとresolutionGateサイズの制御を切り離します。

それに伴い、出力カメラへのコネクションも修正しました。

image.png

スクリプトも修正

import maya.cmds as cmds
import maya.api.OpenMaya as om2

def getResGateSize(cameraName,resolutionW,resolutionH):

    sourceCamDAG = om2.MGlobal.getSelectionListByName(cameraName).getDagPath(0)
    sourceCamFn = om2.MFnCamera(sourceCamDAG)

    if cmds.getAttr(cameraName + ".filmFit") == 1:
        deviceAspectRatio = resolutionH / resolutionW
        sourceResH = sourceCamFn.horizontalFilmAperture * deviceAspectRatio
        sourceResW = sourceCamFn.horizontalFilmAperture

        
    elif cmds.getAttr(cameraName + ".filmFit") == 2:
        deviceAspectRatio = resolutionW / resolutionH 
        sourceResH = sourceCamFn.verticalFilmAperture 
        sourceResW = sourceCamFn.verticalFilmAperture * deviceAspectRatio

    return sourceResW*25.4,sourceResH*25.4

def addCameraProxyPos(cameraName):
    camProxy = cameraName + "_proxy"

    if cmds.objExists(camProxy) == False:
        cmds.createNode("transform",name = camProxy)	
        cmds.parentConstraint(cameraName,camProxy)
        
    return camProxy
                 
def addNearClipPos(cameraName):
    camProxy = addCameraProxyPos(cameraName)
    nearClipPoint = cameraName + "_nearClipPos"
    
    if cmds.objExists(nearClipPoint) == False:
        nearClipPoint = cmds.createNode("transform",name = nearClipPoint)
        cmds.parent(nearClipPoint,camProxy,r = True)		
        
        rev = cmds.createNode("floatMath")
        cmds.setAttr(rev + ".operation",2)
        cmds.setAttr(rev + ".floatB",-1)
        
        cmds.connectAttr(cameraName + ".nearClipPlane",rev+".floatA" )
        cmds.connectAttr(rev + ".outFloat",nearClipPoint+".tz" )

    return nearClipPoint

def connectClipCamera(destCamera,lengthRatio,planeCtrl,scaleSpace):

    cmds.connectAttr(planeCtrl + ".rz" , destCamera + ".filmRollValue")

    ##postScale
    invPostScale = cmds.createNode("floatMath")
    cmds.setAttr(invPostScale+ ".floatA", 1.0)
    cmds.connectAttr(planeCtrl + ".sz", invPostScale + ".floatB")
    cmds.setAttr(invPostScale + ".operation",3)
    cmds.connectAttr(invPostScale + ".outFloat",destCamera + ".postScale")

    ##filmOffsetV
    transYConv = cmds.createNode("floatMath")
    cmds.setAttr(transYConv + ".operation",3)
    cmds.connectAttr(planeCtrl + ".ty",transYConv + ".floatA")
    cmds.connectAttr(lengthRatio + ".outFloat",transYConv + ".floatB")

    transYScale = cmds.createNode("floatMath")
    cmds.setAttr(transYScale + ".operation",2)
    cmds.connectAttr(scaleSpace + ".sy",transYScale + ".floatA")
    cmds.connectAttr(transYConv + ".outFloat",transYScale + ".floatB")
    
    transYConvUnit = cmds.createNode("floatMath")
    cmds.setAttr(transYConvUnit + ".operation",3)
    cmds.setAttr(transYConvUnit + ".floatB",25.4)
    cmds.connectAttr(transYScale + ".outFloat",transYConvUnit + ".floatA")
    cmds.connectAttr(transYConvUnit + ".outFloat",destCamera + ".verticalFilmOffset")

    ##filmOffsetH
    transXConv = cmds.createNode("floatMath")
    cmds.setAttr(transXConv + ".operation",3)
    cmds.connectAttr(planeCtrl + ".tx",transXConv + ".floatA")
    cmds.connectAttr(lengthRatio + ".outFloat",transXConv + ".floatB")

    transXScale = cmds.createNode("floatMath")
    cmds.setAttr(transXScale + ".operation",2)
    cmds.connectAttr(scaleSpace + ".sx",transXScale + ".floatA")
    cmds.connectAttr(transXConv + ".outFloat",transXScale + ".floatB")

    transXConvUnit = cmds.createNode("floatMath")
    cmds.setAttr(transXConvUnit + ".operation",3)
    cmds.setAttr(transXConvUnit + ".floatB",25.4)
    cmds.connectAttr(transXScale + ".outFloat",transXConvUnit + ".floatA")

    cmds.connectAttr(transXConvUnit + ".outFloat",destCamera + ".horizontalFilmOffset")
    
    cmds.setAttr(planeCtrl + ".tz",l = True)
    cmds.setAttr(planeCtrl + ".rx",l = True)
    cmds.setAttr(planeCtrl + ".ry",l = True)
    cmds.setAttr(planeCtrl + ".sx",l = True)
    cmds.setAttr(planeCtrl + ".sy",l = True)

    cmds.setAttr(resGatePlane + ".t",l = True)
    cmds.setAttr(resGatePlane + ".r",l = True)
    cmds.setAttr(resGatePlane + ".s",l = True)       

def addClipFrame(cameraName,defaultResolution):
    resolutionW = defaultResolution[0]
    resolutionH =  defaultResolution[1]

    sourceResW,sourceResH = getResGateSize(cameraName,resolutionW,resolutionH)
    nearClipPoint = addNearClipPos(cameraName)

    scaleSpace = cmds.createNode("joint",name = cameraName + "_scaleSpace")
    planeCtrl = cmds.createNode("joint",name = cameraName + "_planeCtrl")
    cmds.setAttr(scaleSpace + ".drawStyle",2)
    cmds.setAttr(planeCtrl + ".drawStyle",2)
    
    cmds.parent(planeCtrl,scaleSpace,a=True)
    cmds.parent(scaleSpace,nearClipPoint,r=True)
    
    resGatePlane = cmds.polyPlane(axis = [0,0,1],sx = 1,sy = 1,ch =False,name = cameraName + "_resGateplane")[0]
    cmds.setAttr(resGatePlane + ".template",1)


    cmds.parent(resGatePlane,planeCtrl,r=True)
    
    lengthRatio = cmds.createNode("floatMath")
    cmds.connectAttr(cameraName + ".nearClipPlane",lengthRatio + ".floatA")
    cmds.connectAttr(cameraName + ".focalLength",lengthRatio + ".floatB")
    cmds.setAttr(lengthRatio + ".operation",3)

    outRezGateW = cmds.createNode("floatMath")
    outRezGateH = cmds.createNode("floatMath")

    cmds.setAttr(outRezGateW + ".operation",2)
    cmds.setAttr(outRezGateH + ".operation",2)
    cmds.connectAttr(lengthRatio + ".outFloat",outRezGateW + ".floatA")
    cmds.connectAttr(lengthRatio + ".outFloat",outRezGateH + ".floatA")

    cmds.setAttr(outRezGateW + ".floatB",sourceResW)
    cmds.setAttr(outRezGateH + ".floatB",sourceResH)

    cmds.connectAttr(outRezGateW + ".outFloat",scaleSpace + ".sx")
    cmds.connectAttr(outRezGateH + ".outFloat",scaleSpace + ".sy")
    
    cmds.connectAttr(outRezGateW + ".outFloat",planeCtrl + ".sx")
    cmds.connectAttr(outRezGateH + ".outFloat",planeCtrl + ".sy")
    
    cmds.connectAttr(planeCtrl + ".sz",resGatePlane + ".sx")
    cmds.connectAttr(planeCtrl + ".sz",resGatePlane + ".sy")
    cmds.connectAttr(planeCtrl + ".sz",resGatePlane + ".sz")



    return resGatePlane,lengthRatio,planeCtrl,scaleSpace

def create2DCamera(sourceCamera,replace = True):
    if cmds.listRelatives(sourceCamera,type = "camera") == None:
        return
        
    cameraName = sourceCamera.split(":")[-1]
    destCamera = cameraName + "_2D"
    parent = cmds.createNode("transform", name = destCamera + "_parent")    
    
    if cmds.objExists(destCamera):
        if replace:
            cmds.delete(destCamera)
            cmds.delete(parent)
        else:
            return destCamera
    
    if cmds.objExists(destCamera) == False:
        nodes = cmds.duplicate(sourceCamera)
        cmds.refresh()
        cmds.rename(nodes[0], destCamera)
        
        cmds.parentConstraint(sourceCamera,parent,mo =False)
        cmds.parent(destCamera,parent,a=True)
        # cmds.setAttr(parent + ".sx",-1.0)
        
        connectAttrs = ["focalLength","nearClipPlane","farClipPlane"]
        
        for attr in connectAttrs:
            cmds.connectAttr(sourceCamera + "." + attr,destCamera + "." + attr)

    return destCamera


select = cmds.ls(sl =True)
target = select[0]
destCamera = create2DCamera(target)
defaultResolution = [960,540]
resGatePlane,lengthRatio,planeCtrl,scaleSpace = addClipFrame(target,defaultResolution)
connectClipCamera(destCamera,lengthRatio,planeCtrl,scaleSpace)

ひとまずは nearClipPlaneの移動にも対応できました・

image.png

image.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?