关于模型与视口相切与视图最大化的方法
上周在群里问了一下MAX里关于视口与模型相切的方法,感谢 .昕 给了答案.
fn focusoutline obj= ( if obj!=undefined do ( max zoomext sel all viewPt=(Inverse(getViewTM())).row4;targPt=obj.center c=Freecamera pos:viewpt c.type=#target;c.target.pos=targpt c.orthoProjection =true bb= nodeGetBoundingBox obj c.transform size = bb[2]-bb[1] newpos=(((bb[1]+bb[2])/2)*c.objecttransform) angle_w=2*atan((size[1]/2)/(distance viewpt targpt)) angle_l=2*atan((size[2]/2*(renderWidth*1.0)/renderHeight)/(distance viewpt targpt)) ra=(if angle_w>angle_l then angle_w else angle_l) c.fov=ra c.type=#free move c (newpos-targpt) c.type=#target c.target.pos=newpos ) ) focusoutline $
可是这个方法不可以在透视图视角下实现.
又查阅了一下帮助文档.找到了用来模拟试图最大化的方法(相当于按快捷键Z的效果).
虽然这个方法做不到最大边相切,但是已经能解决问题了.
fn ZE_Cam cam objs = ( local max2, fov, asp, v fn maxof vals = (local v=vals[1];for v1 in vals do (if v1 > v do v=v1);v) fov=0 asp=(renderWidth as float)/renderHeight in coordsys cam ( for obj in objs where obj != cam do ( if obj.min.z >=0 do continue v = maxof #((abs obj.max.x),(abs obj.min.x),(abs (obj.max.y*asp)),(abs (obj.min.y*asp))) fov = maxof #(fov,(2*atan(-v/obj.min.z))) ) ) cam.fov=fov ) cam=$camera01 ZE_Cam cam $*
而且最重要的是得到的是透视图,有时间再看看两个可以整合起来不.