mirror of
https://github.com/alicevision/Meshroom.git
synced 2025-07-26 13:07:33 +02:00
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...
153 lines
No EOL
5 KiB
Python
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() |