モデルとビューポートの正接とビューの最大化方法について

3975 ワード

先週グループで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 $*

そして最も重要なのは透視図を得ることであり、時間があれば2つを統合することができるかどうかを見ることができる.