Flash 使用具有视点、投影平面和 的简单平截头体模型focal length
,即从视点到投影平面的距离。
还有fieldOfView,但它应该不重要,因为它的含义似乎被focalLength覆盖。
矩形图形正好位于投影平面上,因此其上边缘的中点位于投影中心。为了达到这个效果,矩形被旋转了一些angle
。
focal length
问题是, and的值应该是什么angle
,new height
并且new bottom width
满足某些给定的效果所需的值?或者从数学上讲:
鉴于:
- 一个截头锥体
focal length
- 一个带有
width
和的矩形,该矩形height
固定在 的投影平面 (z=0) 上,因此矩形上边缘的中点正好位于截锥体的投影中心
- 矩形旋转并投影到投影平面后所需的
new height
和new bottom width
未知数被发现并应用于透视投影以获得所需的new height
and 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;
更多信息: