前言
最近工作中经常遇到外包回来的相机的枢轴点变化,甚至所有值归零后枢轴点也不在世界中心的情况,这种相机动画导入引擎就会出现和maya中相机对不上的情况,这里记录一下解决方法.
过程
基本思路就是计算出原有相机中心点的世界坐标位置,然后用一个新相机继承原有相机的动画,最后烘焙关键帧即可.
- 打开maya的节点编辑器,将原相机和新相机显示在图表上
- 首先我们忽略相机的旋转,我这里用一个球体代替,在节点编辑器中Transform节点给我们提供了Rotate Pivot但是,这个枢轴点是局部空间的(即:相机中心到枢轴点的向量),好在Transform节点也为我们提供了用于将局部空间变换为世界空间的矩阵,这里我们用节点PointMatrixMult(这个节点可能需要开启插件matrixNodes.mll才能找到),把这个局部坐标和世界变换矩阵相乘,即可得到枢轴点的世界空间坐标.
- 这样我们就找到了相机枢轴点的世界空间坐标,.因为我们之前说过相机的局部空间坐标是相机中心位置到相机枢轴点之间的向量,此时用相机枢轴点的坐标减去这个向量就可以得到,这里我们使用节点PlusMinusAverage并将Operation调整为Subtract来计算点和向量之间的减法.
- 可以看到此时小球已经和相机的中心点重合了,但需要注意此时我们的相机是不带旋转值的,如果我们此时对相机进行旋转,可以看到,相机的中心点在旋转后产生了位移.
- 这时,我们可以利用一个向量来帮助我们计算相机旋转后的中心点的位置,即相机在不旋转时,枢轴点指向相机中心点的向量,然后我们旋转这个向量,再使用相机枢轴点的坐标加上旋转后的向量即可得到相机旋转后中心点的位置.继续使用PlusMinusAverage来计算枢轴点指向相机中心点的向量,使用ComposeMatrix节点创建旋转矩阵,再次使用PointMatrixMult来计算旋转后的向量
- 需要注意的这次的PointMatrixMult需要勾选Vector Muitiply(不过目前的情况不勾选也没影响),这样我们就得到了旋转后枢轴点指向相机中心点的向量,最后用枢轴点的坐标加上这个向量即可同时还需要将老相机的旋转值传递给新相机.