--Projection and camera view selection for camera matching and image modelling --contact me for any queries, bugs or requests Aeron Miles: aeronmiles@yahoo.co.uk --check out my blog: http://cgvector.wordpress.com/ scriptsDir = getDir #userMacros getMacros = getFiles (scriptsDir + "\Aeron-projectorMcr.mcr") for f in getMacros do ( deletefile f ) camy_list macroScript projectorMcr category:"Aeron" tooltip: "projector v0.93b3b" Icon:#("Aeron",2) ( fn camy_list = ( global cam_array = (for o in cameras collect o) global cam_tar = (for o in cam_array where classof o == TargetObject collect o) global cam_list = (for o in cam_array where finditem cam_tar o == 0 collect o.name) makeuniquearray cam_list ) camy_list() fn projection_fit = ( try ( sel_bitmap_ratio = sel_bitmap.width / sel_bitmap.height as float length_o = ((projector.projection_dist.value/sin(180 - (90+(sel_cam.fov/2)))) * (sin(sel_cam.fov/2)) * 2) / getRendImageAspect() sel_projection.baseObject.length = length_o sel_projection.baseObject.width = length_o * sel_bitmap_ratio ) catch() ) if projectorFloaterTest != undefined and projectorFloaterTest.open == true then ( persistent global floater_pos = projectorFloaterTest.pos closeRolloutFloater projectorFloaterTest ) else ( Sel = $ if sel != undefined do ( max modify mode for i in sel do ( try( modPanel.setCurrentObject $.baseObject SubLvl = subobjectlevel ) catch() ) ) rollout projector "projector" width:220 height:600 ( button SelBitmap "Select Bitmap" pos:[10,5] width:100 height:20 button CreateProjection "Create Projection" pos:[120,5] width:90 height:20 spinner projection_dist "" pos:[20,55] width:80 height:16 range:[0,100000,500] label Dist "Projection Distance:" pos:[15,40] width:100 height:14 GroupBox group_settings "Settings" pos:[10,27] width:200 height:120 spinner scale_spinner "" pos:[115,55] width:80 height:16 range:[0.0001,1000,100] label pro_scale "Projection scale:" pos:[115,40] width:85 height:14 label focal_length "Focal Length:" pos:[15,73] width:85 height:14 label focal_mm "mm:" pos:[115,73] width:85 height:14 label offset "Offset:" pos:[15,109] width:85 height:14 spinner focal "" pos:[20,90] width:80 height:16 range:[0,10000,45] spinner offset_x_spinner "" pos:[20,125] width:40 height:16 range:[-10000,10000,0] spinner offset_y_spinner "" pos:[60,125] width:40 height:16 range:[-10000,10000,0] button focal_24mm "24" pos:[115,88] width:18 height:18 button focal_50mm "50" pos:[155,88] width:18 height:18 button focal_35mm "35" pos:[135,88] width:18 height:18 button focal_85mm "85" pos:[175,88] width:18 height:18 button mirror_bt "<>" pos:[115,110] width:18 height:18 button remove_cam "x" pos:[190,150] width:18 height:18 button r90 "R 90" pos:[135,110] width:27 height:18 button SelCam "Select Cam" pos:[130,150] width:57 height:18 --button help "?" pos:[180,120] width:18 height:18 listbox camy "Cameras:" pos:[10,153] width:200 height:30 items:cam_list global selname = undefined global sel_bitmap = undefined on SelBitmap pressed do ( escapeEnable = false if sel_bitmap == undefined then ( global sel_bitmap = selectBitMap() if sel_bitmap != undefined do ( global selname = getfilenamefile sel_bitmap.filename SelBitmap.text = selname ) ) else ( sel_initial = sel_bitmap global sel_bitmap = selectBitMap() if sel_bitmap != undefined then ( global selname = getfilenamefile sel_bitmap.filename SelBitmap.text = selname ) else ( sel_bitmap = sel_initial ) ) ) on SelCam pressed do ( try(select sel_cam)catch() ) on CreateProjection pressed do ( with redraw off ( --create layer if LayerManager.getLayerFromName "*projector" == undefined do layermanager.newLayerFromName "*projector" --variables projection_dist_value = projector.projection_dist.value scale_val = (projector.scale_spinner.value / 100) prolayer = LayerManager.getLayerFromName "*projector" --try ( --create camera global sel_cam =Freecamera() --fov:45 pos:[0,0,projection_dist_value] isSelected:on sel_cam.name = ("PCam_" + selname) sel_cam.FOV = viewport.getFOV() sel_cam.transform = inverse (viewport.getTM()) viewport.setCamera sel_cam --create projection plane plane length:(sel_bitmap.height*0.01) width:(sel_bitmap.width*0.01) isSelected:on $.lengthsegs = 1 $.widthsegs = 1 scale $ [scale_val,scale_val,scale_val] $.name = ("PCam_" + selname + "_Projection") global sel_projection = $ sel_projection.primaryVisibility = false sel_projection.receiveShadows = false sel_projection.castShadows = false sel_projection.showFrozenInGray = false sel_projection.motionBlurOn = false freeze sel_projection sel_projection.rotation = sel_cam.rotation sel_projection.pos = sel_cam.pos sel_projection.parent = sel_cam in coordsys local move sel_projection [0,0,-projection_dist_value] projection_fit() prolayer.addNode sel_cam prolayer.addNode sel_projection --assign material to projection plane mat = bitmaptexture () mat.bitmap = sel_bitmap projection_mat = standardMaterial name: (selname + "_mat") diffusemap:mat selfIllumAmount:100 showInViewport:true sel_projection.material = projection_mat --add to listbox camy_list() projector.camy.items = cam_list ) --catch() ) ) on projection_dist changed val do ( try( in coordsys parent sel_projection.pos.z = -projector.projection_dist.value projection_fit() ) catch() ) on scale_spinner changed val do ( try(sel_projection.scale = ([projector.scale_spinner.value,projector.scale_spinner.value,projector.scale_spinner.value]/100))catch() ) on focal changed val do ( try(sel_cam.fov = (CameraFOV.MMtoFOV projector.focal.value))catch() projection_fit() ) on offset_x_spinner changed val do ( try(sel_projection.material.maps[2].coords.u_Offset = (projector.offset_x_spinner.value/100))catch() ) on offset_y_spinner changed val do ( try(sel_projection.material.maps[2].coords.v_Offset = (projector.offset_y_spinner.value/100))catch() ) on focal_24mm pressed do ( try( projector.focal.value = 24 sel_cam.fov = (CameraFOV.MMtoFOV 24) projection_fit() ) catch() ) on focal_50mm pressed do ( try( projector.focal.value = 50 sel_cam.fov = (CameraFOV.MMtoFOV 50) projection_fit() ) catch() ) on focal_35mm pressed do ( try( projector.focal.value = 35 sel_cam.fov = (CameraFOV.MMtoFOV 35) projection_fit() ) catch() ) on focal_85mm pressed do ( try( projector.focal.value = 85 sel_cam.fov = (CameraFOV.MMtoFOV 85) projection_fit() ) catch() ) on mirror_bt pressed do ( try(sel_projection.material.maps[2].coords.u_tiling = (sel_projection.material.maps[2].coords.u_tiling *-1))catch() ) on r90 pressed do ( try(in coordsys local rotate sel_projection -90 [0,0,1])catch() ) on remove_cam pressed do ( try(delete (getNodeByName projector.camy.selected))catch() try(delete (getNodeByName (projector.camy.selected + "_Projection")))catch() camy_list() projector.camy.items = cam_list ) on camy selected nameIndex do ( Sel = $ with redraw off ( unHideSel = $*_Projection select unHideSel unhide selection select (getNodeByName projector.camy.selected) global sel_cam = $ try(select (getNodeByName (projector.camy.selected + "_Projection")))catch() global sel_projection = $ try(select Sel)catch() projector.projection_dist.value = distance sel_cam sel_projection projector.focal.value = CameraFOV.FOVtoMM sel_cam.fov projector.scale_spinner.value = (sel_projection.scale.x * 100) projector.offset_x_spinner.value = (sel_projection.material.maps[2].coords.u_Offset * 100) projector.offset_y_spinner.value = (sel_projection.material.maps[2].coords.v_Offset * 100) ) ) on camy doubleClicked itm do ( with redraw off ( Select (getNodeByName camy.selected) global sel_cam = $ max vpt camera HideSel = $*_Projection try ( hide HideSel select (getNodeByName (camy.selected + "_Projection")) unhide $ )catch() if sel != undefined do ( --try(select sel modpanel.setCurrentObject $.baseobject subobjectlevel = SubLvl)catch() select Sel try ( modPanel.setCurrentObject $.baseObject subobjectlevel = SubLvl ) catch() projector.projection_dist.value = distance sel_cam sel_projection projector.focal.value = CameraFOV.FOVtoMM sel_cam.fov projector.scale_spinner.value = (sel_projection.scale.x * 100) projector.offset_x_spinner.value = (sel_projection.material.maps[2].coords.u_Offset * 100) projector.offset_y_spinner.value = (sel_projection.material.maps[2].coords.v_Offset * 100) ) ) ) ) projectorFloater = newRolloutFloater "projector v0.93b" 230 450 persistent global projectorFloaterTest = projectorFloater if floater_pos != undefined then ( projectorFloater.pos = floater_pos ) addRollout projector projectorFloater try ( projector.projection_dist.value = distance sel_cam sel_projection projector.focal.value = sel_cam.fov projector.scale_spinner.value = (sel_projection.scale.x * 100) projector.offset_x_spinner.value = (sel_projection.material.maps[2].coords.u_Offset * 100) projector.offset_y_spinner.value = (sel_projection.material.maps[2].coords.v_Offset * 100) ) catch() ) )