Объединение матриц с помощью Actionscript Matrix3D

Я хочу получить правильно визуализированный результат проекции из среды Stage3D, которая через свой API представляет что-то вроде интерфейса «серого ящика». Он серый, а не черный, потому что я вижу этот важный фрагмент исходного кода:

matrix3D.copyFrom (renderable.getRenderSceneTransform (camera));
matrix3D.append (viewProjection);

Техника проекционного рендеринга, которая идеально соответствует моим потребностям, взята из полезного руководства, которое работает непосредственно с AGAL, ​​а не с какой-либо конкретной структурой. Сопоставимый фрагмент логики рендеринга выглядит так:

cube.mat.copyToMatrix3D (drawMatrix);
drawMatrix.prepend (worldToClip);

Итак, я полагаю, что правильное общее описание того, что здесь происходит, заключается в том, что обе части кода настраивают правильную комбинированную матрицу для отправки в вершинный шейдер, где эта матрица будет параметром операции m44 AGAL. Общее описание состоит в том, что комбинированная матрица перенесет нас из локального пространства объекта через пространство обзора камеры в экран или пространство отсечения.

Моя проблема может быть резюмирована как возникающая из-за моего незнания правильных матричных операций. Я считаю, что моя неудачная попытка объединить две среды возникла именно потому, что семантика добавления одной матрицы к другой не является и никогда не должна быть эквивалентна добавлению этой матрицы к другой. Моя просьба, таким образом, может быть резюмирована таким образом. Поскольку я не могу контролировать последовательность вызовов, которую будет выдавать фреймворк, например, я должен жить с операцией добавления, я могу только попытаться исправить ситуацию на той стороне, где я подготавливаю матрицу, которая должна быть добавлена. Этот код не является черным ящиком, но я слишком сложен, чтобы знать, как изменить его, чтобы он соответствовал требованиям к интерфейсу, предъявляемым фреймворком.

Есть ли какая-то последовательность инверсий, преобразований или других маневров, которые позволили бы мне изменить матрицу viewProjection, которая была разработана для добавления в начале, чтобы она получалась правильной, когда вместо этого она добавляется к координатам мирового пространства объекта?


person Terry Corbet    schedule 09.07.2013    source источник
comment
Фреймворк, который вы используете — это away3d или простой вариант minimole? Возможно, вы также могли бы описать, что вы пытаетесь сделать... похоже, вы делаете что-то, что фреймворк не предоставляет встроенных средств для выполнения, что может указывать на то, что вы делаете что-то неправильно.   -  person jordancpaul    schedule 21.07.2013
comment
Да, фреймворком, с которым я пытался соединить Camera3D, который Джексон Данстан использует в одном из своих замечательных учебных пособий, была версия 4.1 Away3d. Как я указал в своем ответе, мне удалось внести необходимые изменения, выполнив транспонирование операций транспонирования. Спасибо за внимание.   -  person Terry Corbet    schedule 22.07.2013
comment
Я также узнал некоторую информацию, которая может быть полезной. Операции на стороне процессора и на стороне графического процессора достаточно быстрые, чтобы не было потери скорости FPS. И теперь я понимаю, что причина, по которой камера Данстана отличается, заключается в том, что он решил реализовать правостороннее пространство камеры/объектива, а не левостороннее, которое большинство примеров заимствовало из класса com.adobe.utils.PerspectiveMatrix3D. С этим дополнительным объяснением, возможно, есть лучшие предложения относительно того, как изменить/адаптировать между ними - кажется, что это не просто вопрос изменения знака ориентации .z.   -  person Terry Corbet    schedule 23.07.2013
comment
Нет, это не тривиальное дело. Я построил полноценный 3D-движок на основе левосторонней системы координат, используя для вдохновения mnimole иaway3d. Есть некоторые важные функции, которые необходимо модифицировать для использования левшами, например, команда lookAt. Кроме того, вам придется изменить матрицу проекции камеры/объектива, что требует немного математики. Я настоятельно рекомендую «Математику для программирования 3D-игр и компьютерной графики» Эрика Ленгьела. В главе 4 есть все ответы, которые вам нужны!   -  person jordancpaul    schedule 23.07.2013


Ответы (1)


Я даю ответ скорее из отчаяния, чем из уверенного понимания, и все же надеюсь получить лучший ответ от более знающих. Из «3D Math Primer» Данна и Парберри я узнал, что «транспонирование произведения двух матриц равносильно получению произведения их транспонирования в обратном порядке».

Не имея возможности понять, как вводить текст с использованием надстрочных индексов, я не уверен, что смогу свести свой подход к полезной математической формулировке, поэтому я изобрету синтаксис, используя функциональную нотацию. Эквивалентность, отмеченная Данном и Парберри, будет выглядеть примерно так:

AB = transpose (B) x transpose (A)

Это близко к решению моей проблемы, которая, если переформулировать, на самом деле является просто проблемой, возникающей из-за того, что я не могу контролировать поведение внутренних матричных операций в пакете фреймворка. Однако я могу выполнять соответствующие матричные операции по обе стороны рабочего процесса от локальных координат объекта до координат, требуемых вершинным шейдером графического процессора.

Я еще не завершил тестирование своего решения, которое требует, чтобы последний шаг был сделан в шейдере AGAL, ​​но я смог подтвердить в AS3, что последнее «непреобразование» действительно дает точно такие же объединенные необработанные данные, что и пример от автора камеры с желаемыми свойствами объектива, реализация которых включает в себя добавление, а не добавление.

BA = transpose (transpose (A) x transpose (B))

Я также еще не проверял, насколько интенсивны эти дополнительные вычисления для обработки, чтобы снизить частоту кадров моего приложения выше приемлемого, но я рад, по крайней мере, иметь возможность подтвердить, что вычисления дают тот же результат.

person Terry Corbet    schedule 10.07.2013