Войти
ПрограммированиеФорум2D графика и изометрия

Нужна помощь с поворотами векторов

Страницы: 1 2 3 Следующая »
#0
(Правка: 14:00) 13:42, 20 мая 2020

Все здравствуйте. У меня такая проблема, не могу понять принцип работы этого кода.
Как бы я ни пытался изменить угол поворота(g_fRotateAngle), модель поворачивается ровно на 90 градусов каждый тик таймера(я сделал 1 раз в сек.). Если сделать g_fRotateAngle = 360 - поворот идет в обратную сторону.
При попытке что либо изменить в коде - меняются все углы поворота или вообще останавливается. Хотелось бы понять как работает и где моя ошибка.

Сейчас поворачивает все как нужно, но ровно на 90 град. т.е. 4 раза за полный оборот.
rotate01 | Нужна помощь с поворотами векторов
rotate02 | Нужна помощь с поворотами векторов
rotate03 | Нужна помощь с поворотами векторов
rotate04 | Нужна помощь с поворотами векторов

//-----------------------------------------------------------

CreateTimer(1.0, MovingRotate, ent, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE); // повторяющийся таймер(1 тик в секунду)
//-----------------------------------------------------------
public Action MovingRotate(Handle: timer, any: ent) {  // сам код 
    if (!IsValidEdict(ent)) return Plugin_Stop;

    g_fRotateAngle = DegToRad(g_fRotateAngle);  // значение угла из квара перевожу в радианы
    float ent_angles[3], left_vec[3];

    GetEntPropVector(ent, Prop_Send, "m_angRotation", ent_angles);   // получаю углы
    GetAngleVectors(ent_angles, NULL_VEC, left_vec, NULL_VEC);        // получаю вектор из углов          

    float vecX = left_vec[0] * Cosine(g_fRotateAngle) - left_vec[0] * Sine(g_fRotateAngle);
    float vecY = left_vec[1] * Cosine(g_fRotateAngle) + left_vec[1] * Sine(g_fRotateAngle);
    resul_vec[0] = vecX;
    resul_vec[1] = vecY;

    PrintToChatAll("X %f/Y %f", vecX, vecY);

    .......

Получаю вот такие значения на выходе:

X 794.540405/Y 93.302810
X 93.302803/Y -794.540649
X -794.540344/Y -93.302970
X -93.302810/Y 794.540649
X 794.540405/Y 93.302810
X 93.302803/Y -794.540649
X -794.540344/Y -93.302970
X -93.302810/Y 794.540649


#1
(Правка: 19:32) 13:59, 20 мая 2020
Похоже ,что объект был изначально повернут по P при загрузке , и что-то мне подсказывает  что  это четверти,что-то типа:
x>0,y>0  - 1ая четверть
x<0,y>0  - 2ая четверть
x<0,y<0  - 3ая четверть
x>0,y<0  - 4ая четверть
#2
(Правка: 14:04) 14:02, 20 мая 2020

Dav103
> Похоже ,что объект был повернут по P, и что-то мне подсказывает  что  это
> четверти,что-то типа:
> x>0,y>0  - 1ая четверть
> x<0,y>0  - 2ая четверть
> x<0,y<0  - 3ая четверть
> x>0,y<0  - 4ая четверть

Поворачиваю (2D) вокруг left_vec[2](зелёным вверх). Это то что мне и нужно, в принципе.

#3
(Правка: 15:50) 15:49, 20 мая 2020

код поворота вектора(координаты) примерно такой

float angle = угол/ 180.f * PI;
float cs = std::cos( angle ); // Cosine
float sc = std::sin( angle ); // Sine

x *= sn;
y *= cs;

#4
17:53, 20 мая 2020

3dhater
Нет. Это получилось непонятно что, а не код поворота.

#5
(Правка: 19:04) 18:47, 20 мая 2020

3dhater
Сейчас попробую

К сожалению подтверждаю убеждение выше от samrrr.
Это не то явно, теряется вектор вокруг которого вращение должно идти, соответственно и полный бардак в остальном, а самое главное по итогу выдает след, не происходит изменения координат вообще.

Может быть я не так понял формулу.
Я пытаюсь вращать объект ent(3D модель) вокруг центра этого объекта(вектора)

#6
19:59, 20 мая 2020

samrrr
> Нет. Это получилось непонятно что, а не код поворота.
>
>
написал же примерно. что же, всё в памяти держать? откройте любую пустяковую программу по рисованию 2д круга, звёздочки или ещё чего, и там будет подобная вещь.


tonline_kms65
> Это не то явно, теряется вектор вокруг которого вращение должно идти,
> соответственно и полный бардак в остальном, а самое главное по итогу выдает
> след, не происходит изменения координат вообще.

Нужно установить объект в центр координат, повернуть объект (хоть матрицей), и вернуть на прошлую позицию. Это и есть вращение.

#7
20:19, 20 мая 2020

Попробуй с другой моделькой.

#8
22:15, 20 мая 2020

tonline_kms65
> g_fRotateAngle = DegToRad(g_fRotateAngle);
Я не знаю что это за язык, но переменная ведь каждый тик конвертируется в радианы снова и снова.

#9
0:06, 21 мая 2020

tonline_kms65
> X 794.540405/Y 93.302810
> X 93.302803/Y -794.540649

это 360градусов+360градусов=720градусов+70градусов=790градусов +4градуса начальная позиция
как физика скорость v=v0+at
итог=начальное+добавить то что ожидаем потом.

получается два проворота по 360=два полных круга
+70град это одна пятая часть круга= 70х5=350градусов а одна пятая это 0.2круга

выходит 2_круга+0.2_круга+ 4градуса.

если два круга то может сответственно уменьшить скорость проворота типа не 1тик за 1сек а типа 0.5х за секунду?
  половина от нормы за 1сек

вы это какой язык?
с++ версия11 ?

#10
2:00, 21 мая 2020

Rikk
Если попробовать нормализовать(отсечь до 360град.)?
Язык SourcePawn.

#11
5:25, 21 мая 2020

Apfel1994
Тестовое.  Для сключения ошибки, что бы сомнений не было.

#12
(Правка: 7:33) 7:20, 21 мая 2020

3dhater
Слушай, а хороший у тебя совет. Я нашел формулу и попробовал её в код перегнать.
Получается. Самое интересное то, что можно задать кол-во сегментов, а это открывает возможность для трассировки на столкновения.

Например, мне нужно движение объекта(скажем моего дракона) по карте, без использования точек навигации, сейчас у меня движение реализовано по принципу рикошета(получаю нормаль к поверхности и т.д.) но когда объект попадает в прямой или острый угол с такой моей реализацией он конечно, оттуда не вылезет никогда. Я сделал определение скорости - при 0 остановка и разворот - движение назад.
Вот как раз здесь пригодится твой совет, т.е. развернулся - сделал трассировку по полукругу(90 град.), и самая дальняя дистанция без столкновений это и будет искомый путь. Делать трассировку постоянно мне кажется сильно затратно будет.
Меня эта идея очень заинтересовала.

#13
11:11, 21 мая 2020

tonline_kms65
Да я не к тому. Неясно где она выставляется обратно в градусы. Было бы лучше так:
float rotateAngleRad = DegToRad(g_fRotateAngle);

#14
11:17, 21 мая 2020
float vecX = left_vec[0] * Cosine(g_fRotateAngle) - left_vec[0] * Sine(g_fRotateAngle);
float vecY = left_vec[1] * Cosine(g_fRotateAngle) + left_vec[1] * Sine(g_fRotateAngle);
Это же эквивалентно
float vecX = left_vec[0] * (Cosine(g_fRotateAngle) - Sine(g_fRotateAngle));
float vecY = left_vec[1] * (Cosine(g_fRotateAngle) + Sine(g_fRotateAngle));
что явно не похоже на код поворота.
Страницы: 1 2 3 Следующая »
ПрограммированиеФорум2D графика и изометрия