2012-10-13 1 views
1

Я делаю простую игру в C#/XNA. Мои актеры хранят направление, в котором они собираются пойти как Vector2. В каждом цикле обновления я нормализую заголовок (из-за того, что он установлен, может привести к разной длине) и добавьте heading*Speed в положение для перемещения актера.Использование нормализованных векторов для хранения заголовка

Это кажется неэлегантным. Логически, направление не имеет длины, оно по определению является единичной длиной. Практически постоянная нормализация имеет тривиальные посторонние вычислительные затраты.

  1. Есть ли NormalizedVector2 в XNA?
  2. Как я могу создать тот, который совместим с XNA Vector2 (т. Е. Может быть добавлен к нему и т. Д.)? Расширить Vector2 и переопределить свойство Length?
  3. Существуют ли более серьезные концептуальные проблемы с тем, как я пытаюсь выполнить то, что я пытаюсь выполнить?
+0

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

ответ

2
  1. Нет. Единственный 2D вектор в XNA Vector2.
  2. Вы не можете. Поскольку Vector2 - это struct, вы не можете его использовать. Вы можете сделать свой собственный тип и предоставить метод конвертировать в Vector2 (путем создания нового Vector2).

Реалистично, я подозреваю, что ваш текущий подход (с помощью Vector2 и просто вызывая Normalize, вероятно, лучший подход. Если вы действительно беспокоитесь о многих вызовах, используйте the overload which uses ref and out для параметров, так как это немного более эффективным.

+0

Это такая крошечная функция, что, если вы не пишете механизм частиц или физики и не делаете тщательного профилирования (они, как, действительно, крошечные!), На самом деле не имеет значения, какой из них вы выберете.Но, для чего это стоит, я решил проверить свой ответ. И вы совершенно правы, остальные две перегрузки примерно на 25% медленнее (x86 .NET 4.0). –

+0

На самом деле я (несколько) забираю это обратно. Если вы нормализуете вектор «на месте», тогда 'Normalize()', который работает на 'this', является той же скоростью, что и« статический », который принимает ссылки. Профилирование этих присосок непросто;) –

0
  1. не то, что я знаю
  2. Как указывалось выше, вектор не может быть подклассы, но вы можете создать класс Direction, который обрабатывает вычисления и которые могут быть разобраны на Vector2 или просто есть вектор proerpty.
  3. Я бы просто использовал унитарный вектор и вращал его с помощью матрицы. С точки зрения производительности, он избегает деления, которое обычно является медленной операцией. Даже в терминах логики чаще всего выражается направление как 30 ° влево, а не x + y.
+0

Нормализация вектора - это 2 умножения, добавление, квадратный корень и деление. ** Но ** вращение вектора с матрицей - это * lots * добавок и умножений, плюс несколько триггерных операций. Я уверен, что вращение матрицы будет * медленнее. Вы можете сделать это без матрицы - я уверен, что это еще не победа в производительности. Выражение направлений как нормализованных векторов на самом деле чрезвычайно распространено. –

-2

Я что-то не хватает? Нормализованный вектор - это просто вектор, где x + y составляет 1 и указывает на направление. Он не имеет длины, как и любой вектор.

Вы можете сохранить нормализованный вектор только в векторе того же типа. И, конечно же, вам нужно обновить его, когда вам нужно изменить направление чего-то.

Ее довольно простое понятие описано здесь: http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.vector2.normalize.aspx

+0

'Vector2' хранит величину и направление. Величина не имеет значения для моих целей, и я не хочу ее хранить. Как вы можете сказать по моему вопросу, я знаю, как нормализовать вектор. – Superbest

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