Ограничительная коробка вращающегося прямоугольника (2d)
Я вижу, что это было задано по-разному. Я изо всех сил пытаюсь разобраться в этом, поэтому, спрашивая снова.
2d, который перемещается и вращается. Я ищу, чтобы скрыть его в ограничивающей рамке, поскольку, по-видимому, это самый эффективный способ обнаружения столкновения.
У меня не было проблем заставить его работать без вращения, но это просто! Теперь спрайт вращается, я не могу найти правильный способ написания кода.
Чтобы создать ограничивающий прямоугольник для спрайта, я понимаю, что после поворота нужно выработать 4 угла спрайта и использовать их для определения ширины + высоты ограничивающего прямоугольника с правильным размером.
Я использовал статью здесь - http : //msdn.microsoft.com/en-us/library/dd162943 (v = vs.85) .aspx - в частности, формула:
x' = (x * cos A) - (y * sin A)
y' = (x * sin A) + (y * cos A)
Используемый мной код:
x1 = (positionX * Math.cos(rotation)) - (positionY * Math.sin(rotation));
y1 = (positionX * Math.sin(rotation)) + (positionY * Math.cos(rotation));
x2 = (positionX+width/2 * Math.cos(rotation)) - (positionY+height/2 * Math.sin(rotation));
y2 = (positionX+width/2 * Math.sin(rotation)) + (positionY+height/2 * Math.cos(rotation));
positionX и positionY - текущее положение верхнего левого угла спрайта.
вращение - это радианы, которыми спрайт повернулся (и вращение от центра).
ширина и высота спрайта.
Я подумал, что приведенный выше код даст мне координаты верхних левых и верхних правых углов прямоугольника, повернутых соответственно. Тем не менее, на моем холсте я рисую строку от x1, y1 до x2, y2, и она не следует за спрайтом вообще!
Любые предложения? Извините за длинный пост!
Ура!
1 ответ
Я столкнулся с подобной проблемой в игре, которую я разрабатываю. Код ниже должен работать для любой матрицы. В основном это занимает верхние левые и нижние правые точки, преобразует их, а затем вычисляет, какая точка - новая верхняя левая, новая ширина, новая высота и сохраняет ее в прямоугольник. Это для C # XNA. Вероятно, это не самый быстрый метод, но он работает для всех матричных преобразований.
private Rectangle transformRectUsing(Rectangle tileBounds, Matrix m)
{
Vector2 x = new Vector2(tileBounds.Left, tileBounds.Top); x = Vector2.Transform(x, m);
Vector2 y = new Vector2(tileBounds.Right, tileBounds.Bottom); y = Vector2.Transform(y, m);
Vector2 newTopLeft;
if (x.X < y.X)
newTopLeft.X = x.X;
else
newTopLeft.X = y.X;
if (x.Y < y.Y)
newTopLeft.Y = x.Y;
else
newTopLeft.Y = y.Y;
Rectangle result = new Rectangle(Convert.ToInt32(newTopLeft.X), Convert.ToInt32(newTopLeft.Y), Convert.ToInt32(Math.Abs(x.X - y.X)), Convert.ToInt32(Math.Abs(x.Y - y.Y)));
return result;
}