MotionBuilder Switch To Camera Tool

I was working with a scene that had A LOT of cameras, multiple cameras per character. Jumping between all of them while I worked was a annoying so I wrote a quick script/tool that helped me handle dealing with all that.
The “Switch To Camera Tool” is a very simple script. It lists all cameras within your scene, the list can be filtered by name or you can it can omit the orthographic camera by a check of a box. As the default orthographic cameras can already be easily switched to via dedicated short cut keys I thought a omission feature would be nice.
The UI has check boxes that allow you to easily display elements to each camera (time code, safe frames, grid, etc.). The tool will remember which display elements you have set up for each camera and if you need to add or remove a camera to your scene there is a “Refresh Camera List”.
Above is a quick demo of the tool in action.
I’ve posted the code for the script below and you can find the tool here if you don’t want to do that pesky copy and paste. 🙂
import pyfbsdk as fb import pyfbsdk_additions as fba ##Create A List Of All Cameras In The Scene def GenerateCamList(): ##Clean Out The Drop Down List And Generate A New List delMe = DrpDwn_CamList.Items for i in DrpDwn_CamList.Items[:]: if i in delMe: DrpDwn_CamList.Items.remove(i) for cam in fb.FBSystem().Scene.Cameras: DrpDwn_CamList.Items.append(cam.LongName) ##Filter Out Orthographic Cameras If Then "Filter Out Orthagraphic Cameras" Check Box Is Active if btnFilterCamList.State == 1: orthoCams = ("Producer Front", "Producer Back", "Producer Right", "Producer Left", "Producer Top", "Producer Bottom") for i in DrpDwn_CamList.Items[:]: if i in orthoCams: DrpDwn_CamList.Items.remove(i) ##Filter Camera List By User Defined Name if efilterCamByString.Text != "": ##Create A Data List data = DrpDwn_CamList.Items ##Create An Empty Filter List filterData = [] for i in data: if efilterCamByString.Text.lower() in i.lower(): ##Add Items To Filter List Based On The String Provided In The UI Field filterData.extend([i]) ##Generate The Filtered List DrpDwn_CamList.Items.removeAll() for i in filterData: DrpDwn_CamList.Items.append(str(i)) ##Filter Out Orthagraphic Cameras Check Box def btnFilterCamList_CallBack(control, event): GenerateCamList() ##Switch Viewer Camera To The Selected Drop Down Item def CameraList_CallBack(control, event): try: cameraName = DrpDwn_CamList.Items[DrpDwn_CamList.ItemIndex] for cam in fb.FBSystem().Scene.Cameras: if cam.LongName == cameraName: fb.FBApplication().SwitchViewerCamera(cam) global camtool_CurrentCam camtool_CurrentCam = cam btnViewCameraInterest.State = camtool_CurrentCam.ViewCameraInterest btnViewNearFarPlane.State = camtool_CurrentCam.ViewNearFarPlane = btnViewNearFarPlane.State btnViewShowName.State = camtool_CurrentCam.ViewShowName btnViewShowGrid.State = camtool_CurrentCam.ViewShowGrid btnViewShowAxis.State = camtool_CurrentCam.ViewShowAxis btnViewShowTimeCode.State = camtool_CurrentCam.ViewShowTimeCode btnViewOpticalCenter.State = camtool_CurrentCam.ViewOpticalCenter btnDisplaySafeArea.State = camtool_CurrentCam.PropertyList.Find("DisplaySafeArea").Data btnViewCameraInterest.Enabled = True btnViewNearFarPlane.Enabled = True btnViewShowName.Enabled = True btnViewShowGrid.Enabled = True btnViewShowAxis.Enabled = True btnViewShowTimeCode.Enabled = True btnViewOpticalCenter.Enabled = True btnDisplaySafeArea.Enabled = True DrpDwn_SafeFrame.Enabled = btnDisplaySafeArea.State return camtool_CurrentCam except: pass ##Filter By Drop Down List By Name (As The User Types The List Will Be Updated) def efilterCamByString_Callback(control, event): GenerateCamList() def UpDateCamDisplay(): try: camtool_CurrentCam.ViewCameraInterest = btnViewCameraInterest.State camtool_CurrentCam.ViewNearFarPlane = btnViewNearFarPlane.State camtool_CurrentCam.ViewShowName = btnViewShowName.State camtool_CurrentCam.ViewShowGrid = btnViewShowGrid.State camtool_CurrentCam.ViewShowAxis = btnViewShowAxis.State camtool_CurrentCam.ViewShowTimeCode = btnViewShowTimeCode.State camtool_CurrentCam.ViewOpticalCenter = btnViewOpticalCenter.State camtool_CurrentCam.PropertyList.Find("DisplaySafeArea").Data = btnDisplaySafeArea.State ##Enable Safe Frame Area Drop Down Menu DrpDwn_SafeFrame.Enabled = btnDisplaySafeArea.State if camtool_CurrentCam.SafeAreaMode == "kFBSafeAreaSquare": DrpDwn_SafeFrame.ItemIndex = 0 if camtool_CurrentCam.SafeAreaMode == "kFBSafeAreaRound": DrpDwn_SafeFrame.ItemIndex = 1 except: pass ##Camera Display Options def CameraDislay_CallBack(control, event): UpDateCamDisplay() ##Change Safe Frame Area Visual def Change_SafeFrameArea(): if DrpDwn_SafeFrame.Items[DrpDwn_SafeFrame.ItemIndex] == "Square Safe Area": try: camtool_CurrentCam.SafeAreaMode = fb.FBCameraSafeAreaMode.kFBSafeAreaSquare except: pass if DrpDwn_SafeFrame.Items[DrpDwn_SafeFrame.ItemIndex] == "Round Safe Area": try: camtool_CurrentCam.SafeAreaMode = fb.FBCameraSafeAreaMode.kFBSafeAreaRound except: pass ##Set Safe Frame Area Drop Down Menu def DrpDwn_SafeFrame_CallBack(control, event): Change_SafeFrameArea() ##Refresh Camera List Button def RefreshCamList_CallBack(control, event): GenerateCamList() ''' UI Layout ''' def PopulateTool(t): ##Camera Drop Down List------------------------------------------------------------------------------ CamList = fb.FBLabel() x = fb.FBAddRegionParam(5,fb.FBAttachType.kFBAttachNone,"") y = fb.FBAddRegionParam(5,fb.FBAttachType.kFBAttachNone,"") w = fb.FBAddRegionParam(290,fb.FBAttachType.kFBAttachNone,"") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("CamList","CamList", x, y, w, h) t.SetControl("CamList", CamList) CamList.Caption = "Camera List:" CamList.ReadOnly = True CamList.Style = fb.FBTextStyle.kFBTextStyleBold CamList.Justify = fb.FBTextJustify.kFBTextJustifyCenter global DrpDwn_CamList DrpDwn_CamList = fb.FBList() x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachLeft,"CamList") y = fb.FBAddRegionParam(5,fb.FBAttachType.kFBAttachBottom,"CamList") w = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachRight,"CamList") h = fb.FBAddRegionParam(120,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("DrpDwn_CamList","DrpDwn_CamList", x, y, w, h) t.SetControl("DrpDwn_CamList", DrpDwn_CamList) DrpDwn_CamList.ItemIndex = -1 DrpDwn_CamList.MultiSelect = False DrpDwn_CamList.ExtendedSelect = False DrpDwn_CamList.Style = fb.FBListStyle.kFBVerticalList for cam in fb.FBSystem().Scene.Cameras: DrpDwn_CamList.Items.append(cam.LongName) DrpDwn_CamList.OnChange.Add(CameraList_CallBack) ##Filter Orthographic And Perspective Cameras global btnFilterCamList btnFilterCamList = fb.FBButton() x = fb.FBAddRegionParam(10,fb.FBAttachType.kFBAttachRight,"DrpDwn_CamList") y = fb.FBAddRegionParam(-20,fb.FBAttachType.kFBAttachTop,"DrpDwn_CamList") w = fb.FBAddRegionParam(185,fb.FBAttachType.kFBAttachNone,"") h = fb.FBAddRegionParam(35,fb.FBAttachType.kFBAttachNone,"DrpDwn_CamList") t.AddRegion("btnFilterCamList","btnFilterCamList", x, y, w, h) t.SetControl("btnFilterCamList", btnFilterCamList) btnFilterCamList.Caption = "Filter Out Orthographic Cameras" btnFilterCamList.Style = fb.FBButtonStyle.kFBCheckbox btnFilterCamList.State = 0 btnFilterCamList.Justify = fb.FBTextJustify.kFBTextJustifyCenter btnFilterCamList.Look = fb.FBButtonLook.kFBLookNormal btnFilterCamList.OnClick.Add(btnFilterCamList_CallBack) ##Filter By String FilterCamByName = fb.FBLabel() x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachLeft,"DrpDwn_CamList") y = fb.FBAddRegionParam(10,fb.FBAttachType.kFBAttachBottom,"DrpDwn_CamList") w = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachRight,"DrpDwn_CamList") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("FilterCamByName","FilterCamByName", x, y, w, h) t.SetControl("FilterCamByName", FilterCamByName) FilterCamByName.Caption = "Filter Camer List By Name:" FilterCamByName.ReadOnly = True FilterCamByName.Style = fb.FBTextStyle.kFBTextStyleBold FilterCamByName.Justify = fb.FBTextJustify.kFBTextJustifyCenter global efilterCamByString efilterCamByString = fb.FBEdit() x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachLeft,"FilterCamByName") y = fb.FBAddRegionParam(5,fb.FBAttachType.kFBAttachBottom,"FilterCamByName") w = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachRight,"FilterCamByName") h = fb.FBAddRegionParam(25,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("efilterCamByString","efilterCamByString", x, y, w, h) t.SetControl("efilterCamByString", efilterCamByString) efilterCamByString.OnChange.Add(efilterCamByString_Callback) CamDisplay = fb.FBLabel() x = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachLeft,"btnFilterCamList") y = fb.FBAddRegionParam(1,fb.FBAttachType.kFBAttachBottom,"btnFilterCamList") w = fb.FBAddRegionParam(100,fb.FBAttachType.kFBAttachNone,"") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("CamDisplay","CamDisplay", x, y, w, h) t.SetControl("CamDisplay", CamDisplay) CamDisplay.Caption = "Display:" CamDisplay.ReadOnly = True CamDisplay.Style = fb.FBTextStyle.kFBTextStyleBold CamDisplay.Justify = fb.FBTextJustify.kFBTextJustifyLeft ##Display Check Boxes global btnViewCameraInterest btnViewCameraInterest = fb.FBButton() x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachLeft,"CamDisplay") y = fb.FBAddRegionParam(2,fb.FBAttachType.kFBAttachBottom,"CamDisplay") w = fb.FBAddRegionParam(110,fb.FBAttachType.kFBAttachNone,"") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("btnViewCameraInterest","btnViewCameraInterest", x, y, w, h) t.SetControl("btnViewCameraInterest", btnViewCameraInterest) btnViewCameraInterest.Caption = "Camera Interest" btnViewCameraInterest.Style = fb.FBButtonStyle.kFBCheckbox btnViewCameraInterest.Enabled = False btnViewCameraInterest.State = 0 btnViewCameraInterest.Justify = fb.FBTextJustify.kFBTextJustifyCenter btnViewCameraInterest.Look = fb.FBButtonLook.kFBLookNormal btnViewCameraInterest.OnClick.Add(CameraDislay_CallBack) global btnViewNearFarPlane btnViewNearFarPlane = fb.FBButton() x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachLeft,"btnViewCameraInterest") y = fb.FBAddRegionParam(2,fb.FBAttachType.kFBAttachBottom,"btnViewCameraInterest") w = fb.FBAddRegionParam(140,fb.FBAttachType.kFBAttachNone,"") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("btnViewNearFarPlane","btnViewNearFarPlane", x, y, w, h) t.SetControl("btnViewNearFarPlane", btnViewNearFarPlane) btnViewNearFarPlane.Caption = "Camera Near/Far Plane" btnViewNearFarPlane.Style = fb.FBButtonStyle.kFBCheckbox btnViewNearFarPlane.Enabled = False btnViewNearFarPlane.State = 0 btnViewNearFarPlane.Justify = fb.FBTextJustify.kFBTextJustifyCenter btnViewNearFarPlane.Look = fb.FBButtonLook.kFBLookNormal btnViewNearFarPlane.OnClick.Add(CameraDislay_CallBack) global btnViewShowName btnViewShowName = fb.FBButton() x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachLeft,"btnViewNearFarPlane") y = fb.FBAddRegionParam(2,fb.FBAttachType.kFBAttachBottom,"btnViewNearFarPlane") w = fb.FBAddRegionParam(95,fb.FBAttachType.kFBAttachNone,"") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("btnViewShowName","btnViewShowName", x, y, w, h) t.SetControl("btnViewShowName", btnViewShowName) btnViewShowName.Caption = "Camera Label" btnViewShowName.Style = fb.FBButtonStyle.kFBCheckbox btnViewShowName.Enabled = False btnViewShowName.State = 1 btnViewShowName.Justify = fb.FBTextJustify.kFBTextJustifyCenter btnViewShowName.Look = fb.FBButtonLook.kFBLookNormal btnViewShowName.OnClick.Add(CameraDislay_CallBack) global btnViewShowGrid btnViewShowGrid = fb.FBButton() x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachLeft,"btnViewShowName") y = fb.FBAddRegionParam(2,fb.FBAttachType.kFBAttachBottom,"btnViewShowName") w = fb.FBAddRegionParam(50,fb.FBAttachType.kFBAttachNone,"") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("btnViewShowGrid","btnViewShowGrid", x, y, w, h) t.SetControl("btnViewShowGrid", btnViewShowGrid) btnViewShowGrid.Caption = "Grid" btnViewShowGrid.Style = fb.FBButtonStyle.kFBCheckbox btnViewShowGrid.Enabled = False btnViewShowGrid.State = 1 btnViewShowGrid.Justify = fb.FBTextJustify.kFBTextJustifyCenter btnViewShowGrid.Look = fb.FBButtonLook.kFBLookNormal btnViewShowGrid.OnClick.Add(CameraDislay_CallBack) global btnViewShowAxis btnViewShowAxis = fb.FBButton() x = fb.FBAddRegionParam(40,fb.FBAttachType.kFBAttachRight,"btnViewShowGrid") y = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachTop,"btnViewShowGrid") w = fb.FBAddRegionParam(50,fb.FBAttachType.kFBAttachNone,"") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("btnViewShowAxis","btnViewShowAxis", x, y, w, h) t.SetControl("btnViewShowAxis", btnViewShowAxis) btnViewShowAxis.Caption = "Axis" btnViewShowAxis.Style = fb.FBButtonStyle.kFBCheckbox btnViewShowAxis.Enabled = False btnViewShowAxis.State = 0 btnViewShowAxis.Justify = fb.FBTextJustify.kFBTextJustifyCenter btnViewShowAxis.Look = fb.FBButtonLook.kFBLookNormal btnViewShowAxis.OnClick.Add(CameraDislay_CallBack) global btnViewShowTimeCode btnViewShowTimeCode = fb.FBButton() x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachLeft,"btnViewShowGrid") y = fb.FBAddRegionParam(2,fb.FBAttachType.kFBAttachBottom,"btnViewShowGrid") w = fb.FBAddRegionParam(80,fb.FBAttachType.kFBAttachNone,"") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("btnViewShowTimeCode","btnViewShowTimeCode", x, y, w, h) t.SetControl("btnViewShowTimeCode", btnViewShowTimeCode) btnViewShowTimeCode.Caption = "Time Code" btnViewShowTimeCode.Style = fb.FBButtonStyle.kFBCheckbox btnViewShowTimeCode.Enabled = False btnViewShowTimeCode.State = 0 btnViewShowTimeCode.Justify = fb.FBTextJustify.kFBTextJustifyCenter btnViewShowTimeCode.Look = fb.FBButtonLook.kFBLookNormal btnViewShowTimeCode.OnClick.Add(CameraDislay_CallBack) global btnViewOpticalCenter btnViewOpticalCenter = fb.FBButton() x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachLeft,"btnViewShowAxis") y = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachTop,"btnViewShowTimeCode") w = fb.FBAddRegionParam(60,fb.FBAttachType.kFBAttachNone,"") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("btnViewOpticalCenter","btnViewOpticalCenter", x, y, w, h) t.SetControl("btnViewOpticalCenter", btnViewOpticalCenter) btnViewOpticalCenter.Caption = "Center" btnViewOpticalCenter.Style = fb.FBButtonStyle.kFBCheckbox btnViewOpticalCenter.Enabled = False btnViewOpticalCenter.State = 0 btnViewOpticalCenter.Justify = fb.FBTextJustify.kFBTextJustifyCenter btnViewOpticalCenter.Look = fb.FBButtonLook.kFBLookNormal btnViewOpticalCenter.OnClick.Add(CameraDislay_CallBack) global btnDisplaySafeArea btnDisplaySafeArea = fb.FBButton() x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachLeft,"btnViewShowTimeCode") y = fb.FBAddRegionParam(2,fb.FBAttachType.kFBAttachBottom,"btnViewShowTimeCode") w = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("btnDisplaySafeArea","btnDisplaySafeArea", x, y, w, h) t.SetControl("btnDisplaySafeArea", btnDisplaySafeArea) btnDisplaySafeArea.Caption = "" btnDisplaySafeArea.Style = fb.FBButtonStyle.kFBCheckbox btnDisplaySafeArea.Enabled = False btnDisplaySafeArea.State = 0 btnDisplaySafeArea.Justify = fb.FBTextJustify.kFBTextJustifyCenter btnDisplaySafeArea.Look = fb.FBButtonLook.kFBLookNormal btnDisplaySafeArea.OnClick.Add(CameraDislay_CallBack) global DrpDwn_SafeFrame DrpDwn_SafeFrame = fb.FBList() x = fb.FBAddRegionParam(2,fb.FBAttachType.kFBAttachRight,"btnDisplaySafeArea") y = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachTop,"btnDisplaySafeArea") w = fb.FBAddRegionParam(155,fb.FBAttachType.kFBAttachRight,"CamList") h = fb.FBAddRegionParam(20,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("DrpDwn_SafeFrame","DrpDwn_SafeFrame", x, y, w, h) t.SetControl("DrpDwn_SafeFrame", DrpDwn_SafeFrame) DrpDwn_SafeFrame.ItemIndex = 0 DrpDwn_SafeFrame.MultiSelect = False DrpDwn_SafeFrame.ExtendedSelect = False DrpDwn_SafeFrame.Enabled = False DrpDwn_SafeFrame.Style = fb.FBListStyle.kFBDropDownList safeFrameList = ["Square Safe Area", "Round Safe Area"] for i in safeFrameList: DrpDwn_SafeFrame.Items.append(i) DrpDwn_SafeFrame.OnChange.Add(DrpDwn_SafeFrame_CallBack) btnRefreshCamList = fb.FBButton() x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachLeft,"btnDisplaySafeArea") y = fb.FBAddRegionParam(15,fb.FBAttachType.kFBAttachBottom,"btnDisplaySafeArea") w = fb.FBAddRegionParam(40,fb.FBAttachType.kFBAttachRight,"DrpDwn_SafeFrame") h = fb.FBAddRegionParam(40,fb.FBAttachType.kFBAttachNone,"") t.AddRegion("btnRefreshCamList","btnRefreshCamList", x, y, w, h) t.SetControl("btnRefreshCamList", btnRefreshCamList) btnRefreshCamList.Caption = "Refresh Camera List" btnRefreshCamList.Style = fb.FBButtonStyle.kFBPushButton btnRefreshCamList.Justify = fb.FBTextJustify.kFBTextJustifyCenter btnRefreshCamList.Look = fb.FBButtonLook.kFBLookNormal btnRefreshCamList.OnClick.Add(RefreshCamList_CallBack) def CreateTool(): global t t = fba.FBCreateUniqueTool("Swtich To Camera Tool") t.MinSizeX = t.MaxSizeX = 495 t.MinSizeY = t.MaxSizeY = 250 PopulateTool(t) fb.ShowTool(t) CreateTool()This was a very quick tool to create, the fun part was figuring out how to filter the list and how to get the tool to read the settings from the cameras upon selection - that was a happy little surprise feature that came about through accident (to some degree).
As always, I hope this helps. 🙂
Thanks Vic! Nice little tool. Your blog has been helping me a lot learning mobu scripting lately. What’s up with you? Where are you working now? If you ever come to Berlin let me know, I’ll buy you a beer 🙂
Thanks Alex, I hope it helps people.
I’m still at Ubi Montreal – 10 consecutive years now (plus an extra 3 years prior to 2006). Right now I’m just learning as much as I can with MotionbBilder, Python, Animation for AI, Game Development and I have this urge to jump on the Blender bandwagon as it seems like a lot of people are having a lot of fun with it. 🙂
Visiting Berlin would be wonderful, my wife has mentioned visiting Germany many a times. If you’re every in Montreal let me know. I’ll take you out for pints and poutine, lol – everyone tries poutine after enough pints. 😉