WPF 3d анимация вращения - PullRequest
       20

WPF 3d анимация вращения

1 голос
/ 16 ноября 2009

У меня есть несколько 3d прямоугольников на экране, которые я хочу повернуть вокруг оси Y.

Я хочу нажать мышью и повернуть 3D-объект до максимального поворота, но когда пользователь перемещает свою мышь, я хочу слегка повернуть его, чтобы он выглядел как качалка (вращающаяся из диапазона от -13 до 13 градусов по оси Y).

В данный момент я могу это сделать, но моя частота кадров действительно сильно страдает, когда я быстро двигаю мышь. Так, например, когда я щелкаю левую сторону прямоугольника, я генерирую раскадровку и анимационные объекты, а затем поворачиваю 3d-объект до -13 градусов. Затем, когда я немного перемещаю мышь вправо, я хочу повернуть ее до -12,5 и так далее ...

Опять же, я могу сделать все это, просто производительность сильно страдает! В некоторых случаях он снижается до 5-FPS ... что недопустимо.

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

Спасибо за любую помощь, которую вы можете предоставить! Mark

Ответы [ 2 ]

2 голосов
/ 19 ноября 2009

Я предполагаю, что вы делаете следующее:

  • Использование отдельной Model3D для объекта, который вы вращаете, и включение его в Model3DGroup
  • Предоставление ему RotateTransform3D, содержащего AxisAngleRotation3D
  • Анимация свойства AxisAngle3D Axis в раскадровке

Если мои предположения верны, я думаю, мы можем заключить, что проблема заключается в эффективности рендеринга, поскольку ЦП требуется обновить одно значение оси, пересчитать преобразование и обновить MILCore незначительно.

Я могу придумать несколько способов улучшить производительность рендеринга:

  1. Если ваша вращающаяся Model3D - это GeometryModel3D, опирающаяся на MeshGeometry3D, сделайте все возможное, чтобы упростить сетку и используемые материалы. Это также может помочь заменить другую сетку для крупных планов.

  2. Если вращаемым Model3D является GeometryModel3D, который использует кисти VisualBrush, во время анимации временно замените VisualBrush на ImageBrush, содержащий BitmapImage, который является снимком Visual, лежащего в основе VisualBrush, на момент запуска анимации. Когда анимация закончится, верните VisualBrush. Пользователь, вероятно, не заметит, что содержимое объекта временно зависает при его вращении. (Обратите внимание, что эту же технику можно использовать, если ваш Visual3D является Viewport2DVisual3D.)

  3. Если поворачиваемая Model3D объединяется в Model3DGroup с другими объектами, но находится полностью перед или позади других групп, разделите модель на отдельный отдельный Viewport3DVisual, соответствующим образом наслоенный, чтобы получить желаемый эффект.

  4. Упрощенное освещение или типы материалов

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

0 голосов
/ 18 ноября 2009

MSDN представляет несколько советов о том, что влияет на производительность WPF 3D. Если вы еще не наткнулись на него, проверьте элементы в списке «Влияние на производительность: Высокий».

Редактировать: В марте 2009 года Джош Смит опубликовал статью о CodeProject, которая включает вращающиеся трехмерные объекты. Может быть, вы хотите проверить его решение.

...