4

我需要在影片剪辑上实现锥形效果,同时使其与某些指导线对齐。例如,如果我的影片剪辑看起来像这样

在此处输入图像描述

改造后应该是这样的

在此处输入图像描述

使影片剪辑的形状保持对称且高度不变。顶部边缘的长度保持不变。控制两侧的角度也很好,但首先我希望它是 45 度,如上图所示。

到目前为止我尝试过的是这个

var m3D:Matrix3D = new Matrix3D();
m3D.appendRotation(-45, Vector3D.X_AXIS);
myMC.transform.matrix3D = m3D;

我玩了很长时间,来回添加翻译但没有结果。这也不起作用

var mcX:Number = myMC.x;
var mcY:Number = myMC.y;
var mcW:Number = myMC.width;
var mcH:Number = myMC.height;
m3D.appendTranslation(-(mcX + mcW/2), -mcY, 0);
m3D.appendRotation(-45, Vector3D.X_AXIS);
m3D.appendTranslation(mcX + mcW/2, mcY, 0);

我确实找到了DistortImage类,但该许可证用于非商业用途,而且它似乎不适用于本机的电影剪辑。一个类似的课程看起来很有希望,但到源代码的链接已经失效。

4

2 回答 2

1

Flash 使用具有视点、投影平面和 的简单平截头体模型focal length,即从视点到投影平面的距离。

在此处输入图像描述

还有fieldOfView,但它应该不重要,因为它的含义似乎被focalLength覆盖。

矩形图形正好位于投影平面上,因此其上边缘的中点位于投影中心。为了达到这个效果,矩形被旋转了一些angle

在此处输入图像描述 在此处输入图像描述

focal length问题是, and的值应该是什么anglenew height并且new bottom width满足某些给定的效果所需的值?或者从数学上讲:

鉴于:

  • 一个截头锥体focal length
  • 一个带有width和的矩形,该矩形height固定在 的投影平面 (z=0) 上,因此矩形上边缘的中点正好位于截锥体的投影中心
  • 矩形旋转并投影到投影平面后所需的new heightnew bottom width

未知数被发现并应用于透视投影以获得所需的new heightand new bottom width

  • focal length截锥体的
  • angle旋转的

拿了一支铅笔、一张纸和 Maple(数学软件),自己解决了。

var newBottomWidth:Number = 1000; // or any other value
var newHeight:Number = myMC.height; // or any other value

// the computational part
var oldWidth:Number = myMC.width;
var oldHeight:Number = myMC.height;
var eqRoot:Number = -Math.sqrt(newBottomWidth*newBottomWidth*oldHeight*oldHeight - newHeight*newHeight*oldWidth*oldWidth);
var focalLength:Number = Math.abs(eqRoot/(newBottomWidth - oldWidth));
var angle:Number = Math.atan2(eqRoot/(newBottomWidth*oldHeight), newHeight*oldWidth/(newBottomWidth*oldHeight));
var angleDeg:Number = angle*180/Math.PI;

myMC.parent.transform.perspectiveProjection = new PerspectiveProjection();
myMC.parent.transform.perspectiveProjection.projectionCenter = new Point(myMC.x + myMC.width/2, myMC.y);
myMC.parent.transform.perspectiveProjection.focalLength = focalLength;

var m3D:Matrix3D = new Matrix3D();
m3D.appendRotation(angleDeg, Vector3D.X_AXIS);
myMC.transform.matrix3D = m3D;

更多信息:

于 2013-03-22T15:02:59.447 回答
0

您需要正确添加预先翻译然后翻译后,例如如果您选择的中心点(应该围绕哪个旋转)在(cx,cy),您添加翻译-cx,-cy然后旋转然后向后翻译。

m3D.appendTranslation(-1*cx,-1*cy,0);
m3D.appendRotation(-45, Vector3D.X_AXIS);
m3D.appendTranslation(cx,cy,0);
于 2013-03-20T12:38:57.483 回答