代号小一

看不到子标题【表情】

导航

关于模型与视口相切与视图最大化的方法

上周在群里问了一下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 $*

而且最重要的是得到的是透视图,有时间再看看两个可以整合起来不.

posted on 2015-05-21 15:25  代号小一  阅读(458)  评论(0编辑  收藏  举报