Farseer Meter / Pixel Ratio - PullRequest
       44

Farseer Meter / Pixel Ratio

0 голосов
/ 12 октября 2011

Я много сделал с box2d в c ++ и пробую C #.Похоже, что Farseer обычно используется вместо Box2D (я знаю о Box2DXNA, но он выглядит немного устаревшим). Итак, Farseer - это то, что я использовал.Когда я использовал C ++ и Box2D, каждый всегда советовал не использовать соотношение 1 пиксель / метр (по какой причине, я не знаю) и обычно предлагал использовать где-то около 30 пикселей / метр.Поскольку я исследовал Farseer, я видел много противоречивых утверждений.Некоторые говорят, что нужно использовать 1 пиксель / метр, другие говорят, что используют шкалу, другие говорят, что нужно использовать ConvertUnits.ToSimUnits и ConvertUnits.ToDisplayUnits и т. Д.

Так что мне использовать?Прямо сейчас я использую ConvertUnits, но все рендерится в странных местах.Есть ли де-факто стандарт или что-то, что я должен пройти?Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

Farseer 3.x основан на Box2D.А в FAQ по Box2D написано :

Box2D настроен на метры-килограммы-секунды (MKS).Ваши движущиеся объекты должны быть на расстоянии от 0,1 до 10 метров.Не используйте пиксели как единицы измерения!Вы получите джиттер-симуляцию.

Другими словами, предполагая «нормальный» физический мир, у вас, вероятно, должно быть 1 физическая единица = 1 м .Но любой масштаб, который заставляет большинство ваших движущихся объектов находиться в диапазоне от 0,1 до 10 единиц, должен быть в порядке.

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

float width = 4.1f; // average car length in meters
float height = 1.4f; // average car height in meters
// Note: this method takes half-sizes:
var carVertices = PolygonTools.CreateRectangle(width / 2f, height / 2f);
// Then pass carVertices into PolygonShape, etc...

Отдельная проблема заключается в том, как затем отрендерить ваш мир в правильном размере.

Обычно это делается во время рендеринга, используякамера или матрица view (в стандартной системе world / view / projection).Это можно сделать двумя способами: BasicEffect.View ( MSDN ) или параметр матрицы преобразования в SpriteBatch.Begin ( MSDN , , см. Также ).

IMO, класс Farseer ConvertUnits - очень уродливый способ обработки конверсии.

1 голос
/ 14 октября 2011

Я использую int MetersPixel = 64;для всех моих базовых кальков.Так что у меня есть маленькие враги, их текстуры шириной 16 пикселей.Таким образом, при создании тел с помощью Farseer ширина составляет 0,25.

16/64 = 0,25

Самое главное, чувство, размер / масштаб и вес подходят для моей текущей игры, я не верю, что есть какое-то золотое правило или причина, по которой вам нужно прыгатьчерез обручи только для того, чтобы сделать ваш код 10 = 1 и т. д.

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

...