Meshroom/meshroom/nodes/blender/scripts/camera_support.py
Solal Depardieu 8299cabf28 [nodes] Change in export animated cams and improving blender node
The returns in ExportAnimatedCamera didn't include the path toward the undistorted images so I added it.

The Blender Rendition nodes can now (among other things) diplay cloud of points. The code is cleaned up and only the background image sequence remains to be implemented...
2021-07-23 13:11:16 +02:00

153 lines
No EOL
5 KiB
Python

import bpy
import bmesh
import os
import mathutils
import math
import sys # to get command line args
import argparse # to parse options for us and print a nice help message
from math import radians
def main():
argv = sys.argv
if "--" not in argv:
argv = [] # as if no args are passed
else:
argv = argv[argv.index("--") + 1:] # get all args after "--"
# When --help or no args are given, print this help
usage_text = (
"Run blender in background mode with this script:"
" blender --background --python " + __file__ + " -- [options]"
)
parser = argparse.ArgumentParser(description=usage_text)
parser.add_argument(
"--sfMData", dest="SFM_Data", metavar='FILE', required=True,
help="These info carry the cloud point we need.",
)
parser.add_argument(
"--sfMCameraPath", dest="SFM_cam_path", metavar='FILE', required=True,
help="This text will be used to render an image",
)
parser.add_argument(
"--undistortedImages", dest="undisto_images", metavar='FILE', required=True,
help="Save the generated file to the specified path",
)
parser.add_argument(
"--outputPath", dest="output_path", metavar='FILE', required=True,
help="Render an image to the specified path",
)
args = parser.parse_args(argv)
if not argv:
parser.print_help()
return
if not args.SFM_cam_path:
print("Error: --SFM_cam_path argument not given, aborting.")
parser.print_help()
return
if not args.undisto_images:
print("Error: --undisto_images argument not given, aborting.")
parser.print_help()
return
if not args.output_path:
print("Error: --output_path argument not given, aborting.")
parser.print_help()
return
print(args.SFM_cam_path)
#Clear Current Scene
try:
for objects in bpy.data.objects:
bpy.data.objects.remove(objects)
except:
print("Error: While clearing current scene")
#Place the particle cube
cube = bpy.data.meshes['Cube']
objectsCube = bpy.data.objects.new(name="Cube", object_data=cube)
objectsCube.scale = mathutils.Vector((0.3, 0.3, 0.3))
objectsCube.location = mathutils.Vector((0, -2.0, -1000))
bpy.context.scene.collection.objects.link(objectsCube)
# import Undistorted Images
undis_imgs = []
try:
files = os.listdir(args.undisto_images)
for f in files :
if f.endswith(".exr") :
undis_imgs.append({"name":f})
except:
print("Error: while importing the undistorted images.")
#import abc (Animated Camera)
cam_name = ""
try:
bpy.ops.wm.alembic_import(filepath=args.SFM_cam_path)
animated_cams = bpy.context.selected_editable_objects[:] #Contains ['animxform_RJBframe_SONY_ILCE-7M3', 'mvgCameras', 'mvgCamerasUndefined', 'mvgPointCloud', 'mvgCloud', 'mvgRoot']
for obj in animated_cams:
if obj.data and obj.data.type == 'PERSP':
bpy.context.scene.collection.objects.link(obj)
bpy.context.view_layer.objects.active = obj
bpy.context.scene.camera = obj
#bpy.ops.image.open(directory=args.undisto_images, files=undis_imgs, show_multiview=False)
obj.data.show_background_images = True
except:
print("Error: while importing the alembic file (Animated Camera).")
#import abc (Cloud Point)
try:
bpy.ops.wm.alembic_import(filepath=args.SFM_Data)
all_abc_info = bpy.context.selected_editable_objects[:] #Contains ['mvgCameras', 'mvgCamerasUndefined', 'mvgPointCloud', 'mvgCloud', 'mvgRoot']
for obj in all_abc_info:
if obj.name == 'mvgPointCloud.001':
bpy.context.scene.collection.objects.link(obj)
bpy.context.view_layer.objects.active = obj
obj.modifiers.new("ParticleSystem", "PARTICLE_SYSTEM")
particle_system = bpy.data.particles["ParticleSystem"]
particle_system.render_type = 'OBJECT'
particle_system.instance_object = bpy.data.objects["Cube"]
particle_system.emit_from = 'VERT'
particle_system.count = 4000 #Modulation of numbers in the node
particle_system.frame_end = 1.0
particle_system.use_emit_random = False
particle_system.particle_size = 0.02
particle_system.physics_type = 'NO'
except:
print("Error: while importing the alembic file (Cloud Point).")
## Starts the rendering and launchs it with a blender animator player
try:
bpy.context.scene.render.image_settings.file_format = 'FFMPEG'
bpy.context.scene.render.filepath = args.output_path + '/render.mkv'
bpy.ops.render.render(animation=True)
bpy.ops.render.play_rendered_anim()
except:
print("Error: while rendering the scene.")
if __name__ == "__main__":
main()