def wrangle_camera(obj, wrangler, now): node = wrangle_node_parm(obj, 'camera_node', now) if node is not None: output_cam_xform(obj, node.directive_type, now) return node.type_and_paramset paramset = ParamSet() window = obj.getCameraScreenWindow(wrangler, now) parm_selection = { 'projection' : SohoPBRT('projection', 'string', ['perspective'], False), 'focal' : SohoPBRT('focal', 'float', [50], False), 'focalunits' : SohoPBRT('focalunits', 'string', ['mm'], False), 'aperture' : SohoPBRT('aperture', 'float', [41.4214], False), 'orthowidth' : SohoPBRT('orthowidth', 'float', [2], False), 'res' : SohoPBRT('res', 'integer', [1280, 720], False), 'aspect' : SohoPBRT('aspect', 'float', [1], False), 'fstop' : SohoPBRT('fstop', 'float', [5.6], False), 'focaldistance' : SohoPBRT('focus', 'float', [5], False, key='focaldistance'), 'pbrt_dof' : SohoPBRT('pbrt_dof', 'integer', [0], False), } parms = obj.evaluate(parm_selection, now) aspect = parms['aspect'].Value[0] aspectfix = aspect * float(parms['res'].Value[0]) / float(parms['res'].Value[1]) projection = parms['projection'].Value[0] if parms['pbrt_dof'].Value[0]: paramset.add(parms['focaldistance'].to_pbrt()) # to convert from f-stop to lens radius # FStop = FocalLength / (Radius * 2) # Radius = FocalLength/(FStop * 2) focal = parms['focal'].Value[0] fstop = parms['fstop'].Value[0] units = parms['focalunits'].Value[0] focal = soho.houdiniUnitLength(focal, units) lens_radius = focal/(fstop*2.0) paramset.add(PBRTParam('float', 'lensradius', lens_radius)) if projection == 'perspective': projection_name = 'perspective' focal = parms['focal'].Value[0] aperture = parms['aperture'].Value[0] fov = 2.0 * focal / aperture fov = 2.0 * math.degrees(math.atan2(1.0, fov)) paramset.add(PBRTParam('float', 'fov', [fov])) screen = [(window[0] - 0.5) * 2.0, (window[1] - 0.5) * 2.0, (window[2] - 0.5) * 2.0 / aspectfix, (window[3] - 0.5) * 2.0 / aspectfix] paramset.add(PBRTParam('float', 'screenwindow', screen)) elif projection == 'ortho': projection_name = 'orthographic' width = parms['orthowidth'].Value[0] screen = [(window[0] - 0.5) * width, (window[1] - 0.5) * width, (window[2] - 0.5) * width / aspectfix, (window[3] - 0.5) * width / aspectfix] paramset.add(PBRTParam('float', 'screenwindow', screen)) elif projection == 'sphere': projection_name = 'environment' else: soho.error('Camera projection setting of %s not supported by PBRT' % projection) output_cam_xform(obj, projection_name, now) return (projection_name, paramset)
def wrangle_camera(obj, wrangler, now): node = wrangle_node_parm(obj, "camera_node", now) if node is not None: output_cam_xform(obj, node.directive_type, now) return node.type_and_paramset paramset = ParamSet() window = obj.getCameraScreenWindow(wrangler, now) parm_selection = { "projection": SohoPBRT("projection", "string", ["perspective"], False), "focal": SohoPBRT("focal", "float", [50], False), "focalunits": SohoPBRT("focalunits", "string", ["mm"], False), "aperture": SohoPBRT("aperture", "float", [41.4214], False), "orthowidth": SohoPBRT("orthowidth", "float", [2], False), "res": SohoPBRT("res", "integer", [1280, 720], False), "aspect": SohoPBRT("aspect", "float", [1], False), "fstop": SohoPBRT("fstop", "float", [5.6], False), "focaldistance": SohoPBRT("focus", "float", [5], False, key="focaldistance"), "pbrt_dof": SohoPBRT("pbrt_dof", "integer", [0], False), } parms = obj.evaluate(parm_selection, now) aspect = parms["aspect"].Value[0] aspectfix = aspect * float(parms["res"].Value[0]) / float(parms["res"].Value[1]) projection = parms["projection"].Value[0] if parms["pbrt_dof"].Value[0]: paramset.add(parms["focaldistance"].to_pbrt()) # to convert from f-stop to lens radius # FStop = FocalLength / (Radius * 2) # Radius = FocalLength/(FStop * 2) focal = parms["focal"].Value[0] fstop = parms["fstop"].Value[0] units = parms["focalunits"].Value[0] focal = soho.houdiniUnitLength(focal, units) lens_radius = focal / (fstop * 2.0) paramset.add(PBRTParam("float", "lensradius", lens_radius)) if projection == "perspective": projection_name = "perspective" focal = parms["focal"].Value[0] aperture = parms["aperture"].Value[0] fov = 2.0 * focal / aperture fov = 2.0 * math.degrees(math.atan2(1.0, fov)) paramset.add(PBRTParam("float", "fov", [fov])) screen = [ (window[0] - 0.5) * 2.0, (window[1] - 0.5) * 2.0, (window[2] - 0.5) * 2.0 / aspectfix, (window[3] - 0.5) * 2.0 / aspectfix, ] paramset.add(PBRTParam("float", "screenwindow", screen)) elif projection == "ortho": projection_name = "orthographic" width = parms["orthowidth"].Value[0] screen = [ (window[0] - 0.5) * width, (window[1] - 0.5) * width, (window[2] - 0.5) * width / aspectfix, (window[3] - 0.5) * width / aspectfix, ] paramset.add(PBRTParam("float", "screenwindow", screen)) elif projection == "sphere": projection_name = "environment" else: soho.error("Camera projection setting of %s not supported by PBRT" % projection) output_cam_xform(obj, projection_name, now) return (projection_name, paramset)