zoukankan      html  css  js  c++  java
  • 关于模型与视口相切与视图最大化的方法

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

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

  • 相关阅读:
    poj 3261 Milk Patterns 后缀数组+二分
    poj 2774 Long Long Message(后缀数组入门题)
    hdu 5719 Arrange
    hdu 5720 Wool
    DROP TABLE 恢复
    MySQL数据库改名的三种方法
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    MySQL常用SQL语句优化
    EXPLAIN 命令详解
    mysql sql语句大全
  • 原文地址:https://www.cnblogs.com/3dxy/p/4519851.html
Copyright © 2011-2022 走看看