Как увидеть масштабные матрицы с геометрической точки зрения - PullRequest
2 голосов
/ 09 сентября 2010

Я использую XNA, но для этого примера это не имеет большого значения. Допустим, у меня есть спрайт. Затем я применяю масштабную матрицу перед чем-либо. Применяется ли масштабирующая матрица для масштабирования локальной оси спрайта или просто для перемещения точек вниз? Другими словами, применяет ли масштабирующая матрица 0,5f в мировом пространстве к моему спрайту в начале координат мира масштабирование вниз по локальной оси спрайта или только ко всем точкам, составляющим этот спрайт наполовину?

То же самое относится к переводу, а затем к масштабированию. В моей голове я представляю матрицу перевода 30,30 как перемещение локального источника спрайта к 30,30, и в результате локальная ось спрайта к 30,30. Затем масштабирование на 0,5f уменьшило бы локальную ось, но я не понимаю, почему начало спрайта теперь будет 15,15.

Эта путаница усугубляет тот факт, что вы выполняете перевод 1 вправо по оси абсцисс в мире, теперь вы движетесь в зависимости от примененной вами шкалы (так что вы будете двигаться только в мире на 0,5 ). Это наводит меня на мысль, что масштаб применяется к собственной оси объекта.

Кстати, если вы, ребята, говорите о происхождении в ваших наблюдениях, не могли бы вы указать, на какое происхождение вы ссылаетесь?

Спасибо

Ответы [ 2 ]

1 голос
/ 09 сентября 2010

Обычно спрайт определяется его вершинами (точками). Применение масштабирующей матрицы к спрайту преобразует вершины (точки) спрайта.

Матрица масштаба всегда предполагает, что (0, 0) является источником преобразования масштаба. Таким образом, если вы масштабируете спрайт с центром в (30, 30), все точки будут растягиваться от (0, 0). Если это поможет, представьте спрайт в виде маленькой точки на окружности вокруг точки (0, 0) с масштабированием всего этого круга.

Если вы хотите масштабировать спрайт в (30, 30) от центра спрайта, вы должны сначала перевести центр спрайта в (0, 0), а затем перевести спрайт обратно в (30, 30) после выполнения шкалы.

Так это будет:

   Translate(-30, -30)
   Scale(0.5)
   Translate(30, 30)
0 голосов
/ 09 сентября 2010

Чтобы расширить ответ Эмпиреана, в трехмерных мирах обычно есть как минимум четыре системы координат, каждая из которых имеет свое локальное происхождение:

  • Пространство объектов
  • Пространство мира
  • Пространство камеры
  • Просмотр пространства (2D!)

с тремя преобразованиями:

  • Объект в мир
  • Мир в камеру
  • Камера для просмотра

Вы можете создавать новые системы координат, например, «Пространство модели», с преобразованием «Модель в объект».Используя это, вы получаете ряд шагов:

Модель -> Масштаб -> Объект -> Повернуть -> Перевести -> Мир -> Повернуть -> Перевести -> Камера Камера -> Перспектива -> Вид

В OpenGL вы должны перемещать матрицы в обратном порядке, указанном выше, поэтому преобразование Model-> Object является последним, и OpenGL должен правильно визуализировать объект.Я бы предположил, что XNA / DirectX имеет аналогичную систему.

Сложнее, у Model Space может быть иерархия перемещений, масштабов и поворотов в дереве для создания скелетной системы, которую затем можно использовать для деформации модели.сетка.Обычно это называется Skinning.

Итак, чтобы ответить на вопрос, например, в зависимости от того, к какому преобразованию вы примените преобразование вращения, вы получите разные результаты.В преобразовании Модель-> Объект модель будет вращаться вокруг источника объекта.В трансформации Объект-> Мир объект будет вращаться вокруг источника мира.

...