Как найти угол(скаляр) Angle?

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Как найти угол(скаляр) Angle?

Сообщение longwair » 27.12.2012 (Чт) 9:31

Имеются две точки X1Y1 и X2Y2. в точке Х1Y1 находится стрелка в точке X2Y2 некий объект(кубик допустим), нужно вычислить угол наклона Angle что бы стрелка поворачивалась и точно указывала на объект, что бы потом переместить стрелку по вектору в точку X2Y2.
У вас нет доступа для просмотра вложений в этом сообщении.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как найти угол(скаляр) Angle?

Сообщение Mikle » 27.12.2012 (Чт) 11:18

Тангенс искомого угла - это отношение (x2-x1)/(y2-y1).
Соответственно тебе нужен арктангенс этой величины, но при y2-y1=0 получишь исключение деления на 0, эти случаи нужно обрабатывать отдельно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти угол(скаляр) Angle?

Сообщение Хакер » 27.12.2012 (Чт) 12:57

longwair, для этого вообще-то не нужно вычислять угол (скорее всего).

Допустим, ты получил угол. Что будешь делать с ним дальше?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Как найти угол(скаляр) Angle?

Сообщение longwair » 27.12.2012 (Чт) 14:44

Хакер, А как надо делать? Может я просто выразился не правильно. Короче нужно стрелочку заставить двигаться по вектору к точке X2Y2, и повернуть её соответственно к этой точке.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.12.2012 (Чт) 15:02

Надо сразу брать вектор. Можно его нормировать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти угол(скаляр) Angle?

Сообщение Хакер » 27.12.2012 (Чт) 16:37

longwair писал(а):акер, А как надо делать? Может я просто выразился не правильно. Короче нужно стрелочку заставить двигаться по вектору к точке X2Y2, и повернуть её соответственно к этой точке.

Нет смысла игнорировать вопросы. Потому что ничего не остаётся, как перезадать вопрос.
Вот получил бы ты величину угла. Что с этим значением ты собираешься делать дальше? Напевать его в слух? Записать на бумажку и отправить письмом в Лапландию? Что?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Как найти угол(скаляр) Angle?

Сообщение longwair » 27.12.2012 (Чт) 17:10

Хакер, Вот нет что бы помочь дельным советом, но нет нужно задать много вопросов от которых становится не по себе. Есть проблема и её надо решить, каким способом мне всё равно. Если из угла не получится то предложи что нибудь дельное. Или форум создавался для того что бы на вопрос задавали вопрос. Ну если не прав я, то подскажи как надо. Ведь так люди и учатся. И следующий кто зайдёт сюда(на форум) с такой проблемой прочитав всё это поймёт как надо делать.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти угол(скаляр) Angle?

Сообщение Хакер » 27.12.2012 (Чт) 17:24

Вот я ненавижу когда так тупят.

longwair писал(а):Ну если не прав я, то подскажи как надо.

Тебе сложно ответить на вопрос? От этого ответа зависит то, что я тебе подскажу.

longwair писал(а):Ведь так люди и учатся.

Вот так вот, тратишь своё время, на то, чтобы помочь им, вытягиваешь из них клещами информацию, необходимую для того, чтобы им помочь, а они вдруг начинают выделываться на ровном месте. Обидно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Как найти угол(скаляр) Angle?

Сообщение longwair » 27.12.2012 (Чт) 17:59

Мне кажется так если я найду угол(скаляр) Angle то перемещение стрелки будет примерно так
Код: Выделить всё
STPos.x=STPos.x-sin(angle)
STPos.y=STPos.y+cos(angle)

в рендере
DrawGameOBJ Strelka, STPos.X, STPos.Y, 0

думаю что это надо делать как то так, хотя не уверен.
P.S Хакер не обижайся. Если бы я не был туп, я бы сюда не попал.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти угол(скаляр) Angle?

Сообщение Хакер » 27.12.2012 (Чт) 18:05

Супер. Тогда идеально подходит ответ Qwertiy.
Я думал тебе надо повернуть саму стрелку, чтобы она остриём смотрела на цель. А тебе надо надо просто двигать центр стрелки, смотрящей своим остриём всегда вверх, по направлению к цели.

В своём (неправильном) коде sin(angle) меняй ArrowVelocityVector.x, а cos(angle) на ArrowVelocityVector.y.

ArrowVelocityVector — вектор, расчитываемый как VecNorm(TargetPos – ArrowPos) * ArrowSpeed.
Где VecNorm — функция нормализации вектора. Естественно поскольку в VB нет перегрузки операторов, минус и умножение заменяется на что-то вроде VecSub и VecScale.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Как найти угол(скаляр) Angle?

Сообщение longwair » 27.12.2012 (Чт) 18:18

Огромное человеческое спасибо.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Re: Как найти угол(скаляр) Angle?

Сообщение DODge » 27.12.2012 (Чт) 22:10

Отлично, а я с вашего позволения, продолжу тему с более сложным вопросом...
Давайте теперь представим что стрелка это ракета, которая должна поразить цель (куб). Суть проблемы в том чтобы заставить ракету вести себя соответствующим образом, т.е. она летит прямо (предположим вертикально вверх по картинке). Затем обнаруживается объект, и ракета (по замыслу самонаводящейся) должна плавно походу своего полета поворачивать в его сторону с некоторой заданной угловой скоростью. С ориентированием поворота ракеты проблем нет, использую Atan2 для избежания проблем с нулем. Но как сделать плавный поворот? Всю голову сломал. На данный момент всё выглядит достаточно убого: целый косяк ракет, выпущенные очередью, летят в сторону ближайшего объекта, некоторые из них его уничтожают, а остальные, РЕЗКО повернув, летят к следующему.
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как найти угол(скаляр) Angle?

Сообщение iGrok » 27.12.2012 (Чт) 23:28

DODge писал(а):С ориентированием поворота ракеты проблем нет, использую Atan2 для избежания проблем с нулем. Но как сделать плавный поворот?

Ну так не поворачивай сразу. Рассчитал угол поворота, сравнил с угловой скоростью (не забыв учесть "время" за которое проходит итерация), выбрал из них минимум, и продолжил движение, повернувшись на этот угол. На следующей итерации - так же. И так до тех пор, пока не будешь направлен прямо на объект.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти угол(скаляр) Angle?

Сообщение Хакер » 27.12.2012 (Чт) 23:56

DODge писал(а):С ориентированием поворота ракеты проблем нет, использую Atan2 для избежания проблем с нулем.

Дался вам этот Atan. Можно из направляющего вектора сразу получать матрицу вращения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Re: Как найти угол(скаляр) Angle?

Сообщение DODge » 28.12.2012 (Пт) 0:35

Сама ракета у меня представлена вектором позиции и вектором вращения. Скорость, понятное дело, помноженное на время прибавляется к позиции.
Точное направление на объект вычисляется по следующему псевдокоду:
Dim Направление As Vector3 = Vector3.Normalize(Объект.Позиция - Ракета.Позиция)

Соответственно, "Направление" теперь имеет единичный вектор направления от ракеты до объекта. В данный момент он так и используется без дополнительных обработок, поэтому ракеты и летят прямиком на объект. К сожалению, до меня так и не дошло как связать все эти данные (направление, скорость, вращение и позиция) чтобы придать ракете задуманное поведение.
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как найти угол(скаляр) Angle?

Сообщение Mikle » 28.12.2012 (Пт) 10:26

Хакер писал(а):Дался вам этот Atan. Можно из направляющего вектора сразу получать матрицу вращения.

В общем согласен. Но для того, чтобы задавать равномерное по скорости вращение, или, к примеру, сделать вращение с инерцией, бывает удобно оперировать непосредственно значением угла.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти угол(скаляр) Angle?

Сообщение Хакер » 28.12.2012 (Пт) 10:35

Mikle писал(а):В общем согласен. Но для того, чтобы задавать равномерное по скорости вращение, или, к примеру, сделать вращение с инерцией, бывает удобно оперировать непосредственно значением угла.

Да тут, собственно, вообще надо работать физическо-интеллектуальной ракеты. То есть ракета должна не тупо менять своё направление, а должно просчитываться физическое воздействие разных сил на ракету, плюс ракета должна думать, куда ей лететь, и сама определять эти физическое воздействия (корректирующие воздействия).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как найти угол(скаляр) Angle?

Сообщение Mikle » 28.12.2012 (Пт) 18:15

Хакер писал(а):есть ракета должна не тупо менять своё направление, а должно просчитываться физическое воздействие разных сил на ракету

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти угол(скаляр) Angle?

Сообщение Хакер » 28.12.2012 (Пт) 18:24

Ну вот даже если они будут заранее просчитывать тректорию ракете Безье-сплайном, то всё равно ни на каком этапе не требуется получение угла :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Как найти угол(скаляр) Angle?

Сообщение longwair » 22.04.2013 (Пн) 8:40

Продолжу тему. Начал делать огонь, плоскость с нанесённой текстурой огня. Хочу сделать что бы плоскость всегда смотрела в камеру. Так как же всё таки из направляющего вектора получить матрицу вращения?
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как найти угол(скаляр) Angle?

Сообщение Mikle » 22.04.2013 (Пн) 10:51

longwair писал(а): как же всё таки из направляющего вектора получить матрицу вращения?

Для этого есть готовая D3DXMatrixLookAtLH().

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Как найти угол(скаляр) Angle?

Сообщение longwair » 22.04.2013 (Пн) 12:38

Для этого есть готовая D3DXMatrixLookAtLH().

Ну с этим разобрался, а есть ли такое же но для стрелочки, как в теме выше?
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как найти угол(скаляр) Angle?

Сообщение Mikle » 22.04.2013 (Пн) 12:45

longwair писал(а):есть ли такое же но для стрелочки, как в теме выше?

Готового варианта для 2D нет, но никто не мешает использовать третью координату, равную нулю, из 2D сделать 3D.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Как найти угол(скаляр) Angle?

Сообщение longwair » 22.04.2013 (Пн) 12:48

Mikle, то есть использовать всё тот же D3DXMatrixLookAtLH()
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

Хогар
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 19.04.2014 (Сб) 0:16

Re: Как найти угол(скаляр) Angle?

Сообщение Хогар » 19.04.2014 (Сб) 0:34

Ребят, спасибо за вот это:
Тангенс искомого угла - это отношение (x2-x1)/(y2-y1).
Соответственно тебе нужен арктангенс этой величины, но при y2-y1=0 получишь исключение деления на 0, эти случаи нужно обрабатывать отдельно.

Пишу простенькую игруху, а-ля Диабло.
Я в математике и в тригонометрии ноль, а теперь у меня персонаж бегает за мышкой как положено.
Вот код, мож кому пригодится:
Код: Выделить всё
Public Sub UpdateDirection()
    Dim D As Single 'Будущий угол в градусах относительно оси для выбора направления
    If Engine.mouseX <> MainChar.X And Engine.mouseY <> MainChar.Y Then
        If Engine.mouseX - MainChar.X < 0 And Engine.mouseY - MainChar.Y < 0 Then CurrentQuadrant = TopLeft
        If Engine.mouseX - MainChar.X > 0 And Engine.mouseY - MainChar.Y < 0 Then CurrentQuadrant = TopRight
        If Engine.mouseX - MainChar.X < 0 And Engine.mouseY - MainChar.Y > 0 Then CurrentQuadrant = BottomLeft
        If Engine.mouseX - MainChar.X > 0 And Engine.mouseY - MainChar.Y > 0 Then CurrentQuadrant = BottomRight
        'Тут выбрали вадрат, где в данный момент курсор относительно спрайта
    End If
    If Engine.mouseX - MainChar.X <> 0 And Engine.mouseY - MainChar.Y <> 0 Then
        Let D = Abs(Rad2Deg(Atn((Engine.mouseX - MainChar.X) / (Engine.mouseY - MainChar.Y))))
        'А вот и заветный угол
    End If
    Select Case CurrentQuadrant
        'Тут определяем направление по углу, то-есть в какой примерно сектор выбранного квадрата смотрит вектор,
        'проведенный от спрайта к курсору, вроде по коду будет понятно
        Case MouseQuadrant.TopLeft
            If D < 25 Then CurrentDirection = North
            If D >= 25 And D <= 70 Then CurrentDirection = North_West
            If D > 70 Then CurrentDirection = West
        Case MouseQuadrant.TopRight
            If D < 25 Then CurrentDirection = North
            If D >= 25 And D <= 70 Then CurrentDirection = North_East
            If D > 70 Then CurrentDirection = East
        Case MouseQuadrant.BottomRight
            If D < 25 Then CurrentDirection = Sud
            If D >= 25 And D <= 70 Then CurrentDirection = Sud_East
            If D > 70 Then CurrentDirection = East
        Case MouseQuadrant.BottomLeft
            If D < 25 Then CurrentDirection = Sud
            If D >= 25 And D <= 70 Then CurrentDirection = Sud_West
            If D > 70 Then CurrentDirection = West
    End Select
End Sub


Большое спасибо! 8)


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 10

    TopList