Focal lengthで画角を指定したV-Ray Physical Cameraからfovを取得するテストスクリプト。

VRayCameraFOV

Mayaのカメラなら以下のようにfilmWidthとfocalLengthから計算できますが、MaxのV-Ray Cameraでは被写体までの距離が必要です。

def angleOfView(filmWidth,focalLength):
    angle = 2 * math.atan(float(filmWidth) / (2*float(focalLength)))
    angle = math.degrees(angle)
    return angle

Angle of viewの「Derivation of the angle-of-view formula」が参考になります。

import MaxPlus
import math
 
def angleOfView(filmWidth,focalLength):
    angle = 2 * math.atan(float(filmWidth) / (2*float(focalLength)))
    angle = math.degrees(angle)
    return angle
 
def angleOfViewVrayCamera(filmWidth,focalLength,distance):
    focalLengthWithMagFactor = distance * focalLength / (distance - focalLength)
    angle = angleOfView(filmWidth,focalLengthWithMagFactor)
    return angle
 
def getVRayCameraFocusDistance(node):
    objPBlock = node.Object.ParameterBlock
    distance = 0.0
    if objPBlock.targeted.Value and (not objPBlock.specify_focus.Value):
        targetNode = node.GetTarget()
        vec = targetNode.GetWorldPosition() - node.GetWorldPosition()
        distance = vec.GetLength()
    elif (not objPBlock.targeted.Value) and (not objPBlock.specify_focus.Value):
        distance = objPBlock.target_distance.Value
    elif (not objPBlock.targeted.Value) and objPBlock.specify_focus.Value:
        distance = objPBlock.focus_distance.Value
    return distance
 
def getVRayCameraFOV(node):
    objPBlock = node.Object.ParameterBlock
    fov = 0.0
    if objPBlock.specify_fov.Value == True:
        fov = objPBlock.fov.Value
    else:
        fov = angleOfViewVrayCamera(
            objPBlock.film_width.Value,
            objPBlock.focal_length.Value,
            getVRayCameraFocusDistance(node))
    return fov
    
if __name__ == '__main__':
    if MaxPlus.SelectionManager.GetCount() != 0:
        selNode = MaxPlus.SelectionManager.GetNode(0)
        if selNode.Object.GetClassName() == 'VRayPhysicalCamera':
            print getVRayCameraFOV(selNode)
        else:
            print "Selection is not V-Ray Camera."
    else:
        print "Select V-Ray Camera."

はじめてPythonAPIを使ってみました、Maxの中にPythonエディタが搭載されてるわけでは無いんですね。APIリファレンスの情報量も少ないなー。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です