Rhino view to blender camera exporter

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