2013-03-20 5 views
4

Мне нужно реализовать сужающийся эффект на мувиклип, сохраняя его согласованным с некоторыми направляющими линиями. Например, если мой клип выглядит этаЭффект сужения в ActionScript 3

enter image description here

после преобразования оно должно выглядеть следующим образом

enter image description here

так, что форма в мувика остается симметричным, а высота Безразлично» т изменение. Длина верхнего края остается неизменной. Также было бы неплохо иметь контроль над углом с обеих сторон, но для начала я хотел бы, чтобы он был на 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 класс, но лицензия для некоммерческого использования и не похоже на работу с клипами изначально. A similar class выглядели многообещающими, но ссылки на источник мертвы.

ответ

1

флэш использует простую модель усеченной с точкой зрения, плоскостью проекции, и focal length, что расстояние от точки к плоскости проекции.

enter image description here

Существует также FieldOfView, но он должен быть не имеет значения, как представляется его значение будет отменено focalLength.

Прямоугольная часть графика расположена прямо на плоскости проекции, так что средняя точка ее верхнего края расположена в центре проецирования. Для достижения эффекта прямоугольник поворачивается примерно на angle.

enter image description here enter image description here

Вопрос заключается в том, что должна быть значением focal length и angle так что new height и new bottom width удовлетворяют некоторые заданные значения, которые желательны для эффекта?Или говоря математически:

Дано:

  • усеченного с focal length
  • прямоугольник с его width и height, который прижат к плоскости проекции (г = 0), так что средняя точка верхний край прямоугольника расположен прямо в центре проецирования усеченного конуса
  • new height и new bottom width прямоугольника после его поворота и проецирования на плоскость проекции

Неизвестные должны быть найдены и применены к перспективной проекции для того, чтобы получить желаемый new height и 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; 

Дополнительная информация:

0

Необходимо правильно добавить перевод, а затем после перевода, скажем, если выбранная вами центральная точка (вокруг которой нужно сделать поворот) в (cx, cy), вы добавляете перевод на -cx,-cy, а затем поворачиваете, а затем переводите назад.

m3D.appendTranslation(-1*cx,-1*cy,0); 
m3D.appendRotation(-45, Vector3D.X_AXIS); 
m3D.appendTranslation(cx,cy,0); 
+0

Не работает. См. Обновление. – Pleo

+0

Ваш MC преобразуется вокруг собственного нуля, поэтому вы не должны использовать 'mcX' или' mcY' в переводе, только ширину и высоту. – Vesper

+0

Пробовал это тоже. Все равно получите несимметричный результат, сдвинутый влево. – Pleo

Смежные вопросы