Суббота, 23 Ноября 2024, 06:19

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Вычислить направление поворота
ZETAДата: Пятница, 03 Февраля 2012, 15:09 | Сообщение # 1
был не раз
Сейчас нет на сайте
Возникла такая ситуация. Я сделал, для начала, вращение пушки танка в направлении курсора мышки (первый скрин). Но это не совсем меня устраивает и возникла следующая задача: сделать вращение пушки от текущего положения к положению курсора с некоторой скоростью (второй скрин). Углы a (угол поворота пушки) и b (угол поворота мышки) известны. Пока идей немного, поэтому решил обратиться к сообществу, может кто знает как это сделать? Как оптимально вычислить направление поворота пушки?




Сообщение отредактировал ZETA - Пятница, 03 Февраля 2012, 15:10
AikidosДата: Суббота, 04 Февраля 2012, 03:09 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
atan2 вроде должен помочь.

Code
float fltRad = atan2(fltX1 - fltX2, fltY1 - fltY2);

fltRad - угол между двумя точками в радианах.

Добавлено (04.02.2012, 03:09)
---------------------------------------------
Вот, накалякал код для поворота объекта относительно точки. Если что не так написал - извиняйте. 3 часа ночи как никак.

Code
float fltX = 0, fltY = 0; // Координаты объекта
float fltHotspotX = 0, fltHotspotY = 0; // Точка, относительно которой будет происходить поворот
float fltAngle = 0; // Угол поворота в радианах

float fltRX = fltX - fltHotspotX, fltRY = fltY - fltHotspotY;

float fltSinAngle = sinf(fltAngle);
float fltCosAngle = cosf(fltAngle);

float fltDestX = fltRX * fltCosAngle - fltRY * fltSinAngle;
float fltDestY = fltRX * fltSinAngle + fltRY * fltCosAngle;

fltX = fltDestX + fltHotspotX;
fltY = fltDestY + fltHotspotY;


Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.

Сообщение отредактировал Aikidos - Суббота, 04 Февраля 2012, 02:58
GECKДата: Суббота, 04 Февраля 2012, 08:42 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
Quote (ZETA)
Как оптимально вычислить направление поворота пушки?

Ну как-то так:
(b - поворот пушки, a - угол указателя)
Code
float delta = b - a;
if (abs(delta) > PI)
   delta -= 2 * PI;
else if (abs(delta) < -PI)
   delta += 2 * PI;
b += sign(delta) * turnSpeed; // sign возвращает знак числа


Всё гениальное просто. И хреново работает.
ZETAДата: Суббота, 04 Февраля 2012, 09:41 | Сообщение # 4
был не раз
Сейчас нет на сайте
Aikidos, угол между векторами находится из скалярного произведения, задача была именно найти из углов
GECK, проверил, не работает

У меня получился следующий код

Code
GLfloat difference = b - a;

if (abs(difference) < 0.01)
{
  return;
}

if (difference > 0 && difference < 3.14 || difference < -3.14)
{
  a += 0.001;
}
else
{
  a -= 0.001;
}

if (a <= 0)
{
  a = 2 * M_PI + m_cannonAngle;
}

if (a >= 2 * M_PI)
{
  a = a - 2 * M_PI;
}
AikidosДата: Суббота, 04 Февраля 2012, 13:52 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
Quote (ZETA)
Aikidos, угол между векторами находится из скалярного произведения

Я знаю как находится угол между векторами. Задачу не понял в начале т.к.
Quote (Aikidos)
Если что не так написал - извиняйте. 3 часа ночи как никак.


Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг