モデルとビューポートの正接とビューの最大化方法について
3975 ワード
先週グループでMAXでビューポートとモデルの切り方について聞いてみました.ありがとうございます.昕は答えをあげた.
しかし、この方法は透視図の視点では実現できない.
またヘルプドキュメントを調べました.最大化を試みる方法(ショートカットキーZを押す効果に相当)をシミュレートする方法が見つかった.
この方法では最大エッジ正接はできないが,もう問題を解決できる.
そして最も重要なのは透視図を得ることであり、時間があれば2つを統合することができるかどうかを見ることができる.
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つを統合することができるかどうかを見ることができる.