Farseer ConvertUnits? - PullRequest
       7

Farseer ConvertUnits?

1 голос
/ 01 марта 2012

В движке FarseerPhysics / XNA, что такое ConvertUnits.ToDisplayUnits();?

Ответы [ 3 ]

5 голосов
/ 01 марта 2012

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

В большинстве случаев это хорошо работает для объектов «обычного» размера, которые вы можете найти в игре (автомобили, книги и т. Д.), Измеряемых в метрах и килограммах. Однако это не обязательно, и вы можете выбрать любой масштаб. (Например, в играх, в которых используются шарики или самолеты, может использоваться шкала, отличная от метров / килограммов).

Большинство игр имеют различные пробелы. Например: пространство «Модель», пространство «Проекция», пространство «Вид», пространство «Мир», пространство «Экран», пространство «Клиент». Некоторые измеряются в пикселях, другие в простых единицах. И вообще игры используют матрицы для преобразования вершин из одного пространства в другое. Наиболее очевидно, когда вы берете мир, измеряемый в единицах, и отображаете его на экране, измеряемом в пикселях.

XNA's SpriteBatch упрощает это по умолчанию, поскольку мировое пространство совпадает с пространством клиента. Одна единица мира = один пиксель.

Обычно у вас должно быть определено пространство вашего мира, равное , идентичное пространству, в котором существует ваш физический мир. Но это будет проблемой при использовании пространства по умолчанию SpriteBatch, так как вы не сможете иметь физический объект размером более 10 пикселей без выхода за пределы диапазона, на который настроен Farseer.

Farseer's [1] решение состоит в том, чтобы иметь два разных мировых пространства - пространство game и пространство физика . И используйте класс ConvertUnits везде, где это необходимо для преобразования между этими двумя системами.

Лично я нахожу это решение чертовски ужасным , так как оно очень подвержено ошибкам (так как вы должны получить правильное преобразование в нескольких местах, разбросанных по всему коду).

Для любой скромно серьезной разработки игр я бы порекомендовал использовать единое мировое пространство, разработанное на основе требований Farseer. А затем либо используйте глобальное преобразование в SpriteBatch.Begin, либо что-то совершенно иное, чем SpriteBatch, для отображения этого мира на экране.

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


[1]: в прошлый раз, когда я проверял, ConvertUnits был частью образцов Farseer, а не частью самой библиотеки физики.

1 голос
/ 01 марта 2012

Farseer использует единицы измерения MKS (метр, килограмм, секунда).Они предоставляют методы для преобразования отображаемых единиц измерения в единицы измерения MKS и наоборот.ToSimUnits () и ToDisplayUnits ().

1 голос
/ 01 марта 2012

Я не имел дело с этим конкретным фрагментом кода, но большинство игр, имеющих виртуальное пространство (игровой мир), будут иметь функцию, аналогичную «ToDisplayUnits», и ее функция заключается в преобразовании физических единиц игрового мира в единицы отображения в XNA.

Примером могут быть метры в пикселях или метры в x, y, координаты экрана.

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

...