Суть такова, у меня есть герой с переменной rotation и есть мышь с координатами x и y. Мне нужно что бы угол мыши сохранялся в переменной rotation. Как это вычислить?
Суть такова, у меня есть герой с переменной rotation и есть мышь с координатами x и y. Мне нужно что бы угол мыши сохранялся в переменной rotation. Как это вычислить?
rotation = Атан2 (расстояние по оси у от объекта до мыши, расстояние по оси х от объекта до мыши); Я не знаком с математическими функциями с++, но если что, то http://gcup.ru/publ/unity3d_dvizhenie_v_storonu_kursora/1-1-0-291 - тут я писал как разворачивать объект в сторону мыши, но для юнити. @noTformaT
vec1=(1,0); //Условно вектор тыкающий вперед vec2=((x-PlayerPos),(y-PlayerPos)); //Вектор от игрока к позиции мышки rotation=acos(cos(vec1,vec2));//Угол между векторами ЗЫ все вверху псевдокод.
Добавлено (19.08.2011, 11:54) --------------------------------------------- noTformaT, кстати смотря на твою статью: сразу бросается в глаза что таким подходом можно вычислить угол < 90, что не есть гуд.
karuy, эммм. Может ваш пример и хорош но как мне посмотреть код того как вы измеряете угол? Где файл .cpp и .sln ? Пооткрывал фалы блокнотом - это дельфи?
кстати смотря на твою статью: сразу бросается в глаза что таким подходом можно вычислить угол < 90, что не есть гуд.
нельзя, http://en.wikipedia.org/wiki/Atan2 but to define atan2 uniquely one uses the principal value in the range (−π, π]. That is, −π < atan2(y, x) ≤ π. А вот atan обычный вернет @noTformaT
function TForm1.NormalizeVector(v: Tvec2): Tvec2; var length: Single; begin length:=sqrt(v.x*v.x + v.y*v.y); v.x:=v.x/length; v.y:=v.y/length; Result:=v; end;
procedure TForm1.FormCreate(Sender: TObject); begin vec22.X:=1; vec22.Y:=0; end;
function TForm1.cosVectors(a, b: Tvec2): Single; begin Result:=(a.x*b.x+a.y*b.y)/ (Sqrt(a.x*a.x+a.y*a.y)*Sqrt(b.x*b.x+b.y*b.y)); end;
end.
Сообщение отредактировал karuy - Пятница, 19 Августа 2011, 18:55
Вот пример с моего бложика про HGE. Функция atan2 принадлежит заголовку cmath. Полученное значение будет НЕ в градусах, а в радианах. Т.е. если вы используете систему, работающую на градусах - переведите полученное значение в радианы. Каким способом? dir_gradus=dir_rad * 180 / Pi
Quote
Извиняюсь, что относительно редко обновляю блог, но действительно, трудно подобрать стоящий материал и подготовить его. На GCUP предложили выложить пример поворота спрайта объекта на курсор мыши.
Делается поворот всего-лишь в одну строку кода. Надо лишь учитывать, что угол поворота в HGE считается на в градусах, а в радианах.
В классе или там, где нам требуется прописываем расчет направления от координат №1 (x,y, в нашем случае – это координаты игрока) к координатам №2 (mouse-x, mouse_y, у нас это координаты курсора мыши):
Code
direction=-atan2(y-mouse_y,mouse_x-x);
Все! Направление считается. Остается только вывести спрайт.
Кто-нибудь знает что это значит:" Error: Отсутствуют экземпляры перегруженная функция "atan2", соответствующие списку аргументов."? Вылазит когда навожу мышку на atan2. Вот код:
stalker5889, прочитайте пример по ссылке. Он будет работать, если спрайт повернут вправо, на нулевой угол по система радианов. My Games: · [2D, TDS] Death Embrace.
Словами я описал в посте №3, програма делает то же самое что описано в посте если присмотреться. Могу еще псевдокодом описать) СПП псевдокод: (как же я давно не строчил ничего на спп=))
#pragma comment (lib,"windmill.lib") //подключение файла библиотеки
void Game(); float AngleToMouse(float,float);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { IniEngine(L"RotateToMouse",500,500); // инициализация движка с настройками по умолчанию TextGen(L"",16); // генерация шрифтов RunEngine(Game); // запуск движка return 0; } void Game() { int posx=200; int posy=200; float rotate = AngleToMouse(posx+16,posy+16); // 16 смещение на центр спрайта PrintDigit(rotate,2,20,20); DrawSprite(L"",posx,posy,1,rotate); } float AngleToMouse(float x,float y) { return atan2(y-GetWorldY(),x-GetWorldX())*(180/3.14);
// или так, что тоже самое но медленнее /* float a = y-GetWorldY(); float b = x-GetWorldX(); float radian = atan2(a,b); float degree = radian * (180/3.14); return degree; */ }