安装说明

将 install.mel 拖拽到 maya 视窗当中,当前的工具架会多出一个 摄像机 图标按钮
点击 图标按钮 即可打开 窗口

窗口

使用说明

单帧测试中有两个按钮

  1. 第一个按钮 选择摄像机 切换视角范围显示 可以切换摄像机的视角显示

  2. 第二个按钮 选择摄像机 获取视角内的物体 可以获取视角内的物体

获取视角内的物体

获取数据

  1. 填写起始帧和结束帧可以限定数据获取范围
  2. 选择摄像机,点击 获取时间范围内的摄像机视角数据 按钮才可以进行下一步的操作

获取数据

json数据输入输出

  1. 有了数据之后就可以以json的形式将数据输出和输入。

获取数据

json数据记录了每一帧摄像机视角内的物体

切分场景

上面两个按钮为可选操作,对切分场景没有影响

  1. 遍历物体设置可视关键帧 可选按钮 - 根据上述的数据给镜头可视数据设置 visibility 属性的关键帧
  2. 遍历物体设置Arnold渲染可视 可选按钮 - 与上一个按钮相似,设置渲染参数中的 primary visibility 属性的关键帧

  1. 切分阈值,用于过滤切分范围的峰值大小,气氛阈值越大,推荐切分范围越少。
  2. 推荐切分范围 - 会自动生成切分范围的数组。
  3. 根据情况需要修改切分范围的数组
    注意:
  • 按照python数组的格式
  • 数组至少有两个元素 - 如果有重复元素会自动去重再判断
  • 数组中的元素必须为整数数字
  1. 自动切分场景会选择导出路径,然后根据切分范围自动将场景切分导出视角内可见的物体。

自动切分范围分析

  自动切分,通过获取的数据计算出每一帧出现的物体数量,通过求导(曲线加速度)可以判断出物体在时间范围内出现的极小峰。极小峰的帧就是切分断点。

求导曲线

  上图第一条曲线为 在时间范围物体出现数量的曲线
  第二条线为 第一条曲线的求导曲线
  可以看到求导曲线在前后帧不为零的时间上对应了原曲线的峰值位置。
  将求导曲线中由正变负的点筛选出去,就可以获得极小峰的点。

  数据曲线在 visualize_test 文件夹的 keyframe_display_num 测试文件中


2019-7-16 更新

面板显示优化

面板UI优化

添加了缩放系数

  调整缩放系数可以复制摄像机并缩放摄像机的范围

添加了缩放系数

摄像机缩放分析

  根据摄像机的fov farClipPlane nearClipPlane 计算摄像机视锥的八个顶点位置。
  计算公式在 OpenMaya2.0 的文档中的 MFnCamera getViewParameters 中

getViewParameters

  尽管 OpenMaya2.0 也提供了 getFilmFrustumCorners 方法,但是我却一直获取空数组,而且这个函数在 Maya 2015 是不支持的。
  于是我在 github 上找脚本,发现了另一个大神用 OpenMaya 写的计算方法。
  原理是一样的,我参照它的写法用PyMel实现了

PyMel 实现

  然而按照这种方法获取的坐标是 object 空间的,
  还需要将摄像机的坐标控件计算进去。
  位移坐标还好说,直接让位移向量相加即可,但是旋转变换的新坐标要如何计算出来,还真的难住我了。
  尽管这个问题其实可以用约束解决的,但是我想要更加代码的方式计算出结果。
  功夫不负有心人,只要获取到摄像机的矩阵然后让坐标向量相乘就可以了。
  计算出8个点的坐标之后,只要将8个点求平均值就是视锥内的中心位置了。

实现效果

  有了中心点就可以用 cmds.scale 命令进行缩放了。

总结

  最后这个工具其实没什么用,因为渲染过滤场景要考虑的问题远比这样简单可视过滤来得复杂
  如果单纯将物体排除到场景外,那样就无法渲染出镜头之外的阴影、灯光元素,这样会出问题的
  但是如果保留的话,其实从渲染器的层面并没有太多的优化,内存不够还是不够的。