色々調整して気づいたんですがー
うーん
nearClipPlaneを動かすと ずれちゃいますね。
translate値に対して、nearClipPlane移動時のスケール比が考慮されてないのでずれちゃうわけですね。
なので、それを考慮した構造にしようかと思います。
構造修正
scaleSpaceで空間をスケールして、移動値に見た目上スケールが掛かってるようにします。
plateCtrlで移動を行い、 resolutionGateのサイズ合わせはここのスケールで行います。
これらをjointで作ることで、inverseScaleを発生させ 移動値のスケールとresolutionGateサイズの制御を切り離します。
それに伴い、出力カメラへのコネクションも修正しました。
スクリプトも修正
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の移動にも対応できました・





