Hi,
When I export file in fbx format to blender, I get unexpected results for the views; 9/10 times the view/camera is messed up, not sure what causes it but here’s a quick solution that I found very useful.
Here’s the rhino part:
import Rhino
import pickle
import os
# Get the current document
doc = Rhino.RhinoDoc.ActiveDoc
# Get the named views
named_views = doc.NamedViews
name_of_named_views = [i.Name for i in named_views]
# Extracting needed data
vp = [i.Viewport for i in named_views]
camera_angle = [i.GetCameraAngles() for i in vp]
camera_up_vec = [i.CameraUp for i in vp]
camera_location = [i.CameraLocation for i in vp]
camera_direction = [i.CameraDirection for i in vp]
camera_pt_location = []
for i in camera_location:
camera_pt_location.append([round(i.X, 3), round(i.Y,3), round(i.Z,3)])
camera_normal_vec = []
for i in camera_direction:
i = i.ToString()
i = i.split(",")
i = [round(float(n),3) for n in i]
camera_normal_vec.append(i)
camera_up_vec2 = []
for i in camera_up_vec:
i = i.ToString()
i = i.split(",")
i = [round(float(n),3) for n in i]
camera_up_vec2.append(i)
# Pack data into dictionary
dictionary = {"names":name_of_named_views, "location":camera_pt_location, "direction": camera_normal_vec, "camera_up":camera_up_vec2, "angle":camera_angle}
# Specify the path and name of the new folder
docs_folder = os.path.join(os.path.expanduser("~"), "Documents")
new_folder_path = docs_folder + "/CCMP"
# Create the folder
try:
os.mkdir(new_folder_path)
except FileExistsError:
pass
except OSError as e:
print(f"Error creating folder: {e}")
new_file_path = new_folder_path + "/rhino_camera_export.pkl"
with open(new_file_path, "wb") as f:
pickle.dump(dictionary, f)
Here’s the blender part:
import bpy
import pickle
import os
from mathutils import Vector
#import math
new_collection = bpy.data.collections.new("Rhino_Cams")
bpy.context.scene.collection.children.link(new_collection)
def look_at_vector(obj_camera, direction_vector):
direction = direction_vector.normalized()
rot_quat = direction.to_track_quat('Z', 'Y')
obj_camera.rotation_euler = rot_quat.to_euler()
docs_folder = os.path.join(os.path.expanduser("~"), "Documents")
new_file_path = docs_folder + "/CCMP" + "/rhino_camera_export.pkl"
with open(new_file_path, "rb") as f:
loaded = pickle.load(f)
print(loaded.get("names"))
counter = -1
for dname in loaded.get("names"):
dname = "rhino-cam: " + dname
counter += 1
# Create a new camera
camera_data = bpy.data.cameras.new(name= dname)
sname = dname + " object"
camera_object = bpy.data.objects.new(sname, camera_data)
# Link camera object to the scene
new_collection.objects.link(camera_object)
# Set the camera location
camera_object.location = tuple(loaded.get("location")[counter])
DDDDD = [i*-1 for i in loaded.get("direction")[counter]]
direction_vector = Vector(tuple(DDDDD))
# Point the camera in the direction of the vector
look_at_vector(camera_object, direction_vector)
bpy.context.scene.camera = camera_object
# Adjust camera settings if needed
camera_object.data.angle = (loaded.get("angle")[counter][3] * 2)
print(f"Camera {dname} created successfully!")
first you run the rhino script with rhino’s script editor, the script creates .pkl file in Documents/CCMP folder which contains the views data, then you run the blender script in blender text editor, the file read and camera are made.
notices:
1- it assumes all views are perspective, so if you have orthographic view you must change the camera to ortho manually inside blender
2- i think this script only works for windows
3- it doesn’t get the viewport views, it only gets the “named view” views
anyone who wants to improve the script is very welcome