У меня было очень утомительное время, когда я использовал класс Matrix3D во Flash 10 для неаффинных 2D-преобразований. По сути, у меня есть квадрат в спрайте и четыре точки, которые образуют четырехугольник, и я хочу применить преобразование к спрайту, чтобы сделать эти точки вершинами спрайта.
Не будет особых проблем с решением этой математической задачи с использованием матриц 3х3, как в в этом случае . Проблема заключается в том, что класс Matrix для собственных преобразований Flash не выполняет неаффинных преобразований, а это значит, что нет доступа к полям u v w класса Matrix.
Благодаря встроенной поддержке flash10 для 3D был представлен класс Matrix3D, который допускает неаффинное преобразование, но с ним сложно работать. По сути, все, что вы применяете к этой матрице, не совсем то, что будет отображаться на экране, поскольку будет применена обязательная матрица проекции из класса PerspectiveProjection. Невозможно отключить эту проекцию, и эта матрица перспективных проекций всегда является необратимой матрицей (* 1). Описанный здесь метод - в stackoverflow, о ортогональной проекции flash10 - определения свойства fieldOfView около 0 или focalLengh до огромного числа, не поможет аннулировать перспективную проекцию для краевых случаев, которые работают с неаффинным 2d преобразования. Это означает, что даже если мы можем сделать проекцию почти ортогональной при работе с обычным сдвигом / масштабированием / вращением Matrix3D, та же проекция PerspectivePro на Matrix3D с неаффинными 2d-преобразованиями все равно будет иметь нежелательную перспективную проекцию. Был бы какой-нибудь способ аннулировать эту перспективу Projection? Или, может быть, лучший способ сделать это? Сейчас я использую обходной путь разделения плоскости на два треугольника и применяя к ним два аффинных преобразования.
Большое спасибо!
Cauê
(* 1), когда фокусное расстояние равно 1, матрица перспективной проекции имеет следующий вид:
-- --
| 1 0 0 0 |
| 0 1 0 0 |
| 0 0 1 0 |
| 0 0 1 0 |
-- --
^ No, sadly this wasn't a typo!