|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 232
|
|
Как развернуть одну из координат угла09.09.2017, 13:44. Показов 7413. Ответов 27
Метки нет (Все метки)
Всем здравствуйте.
Такая проблема у меня появилась, я не могу сообразить как можно развернуть одно из полученных значений угла сущности. Как бы понятнее объяснить. Например у меня есть сущность: с позицией float pos[3] pos[0] = 200.0; pos[1] = 100.0; pos[2] = 0.0; и есть углы этой сущности float ang[3] (направление "взгляда") ang[0] = 100.0; ang[1] = 50.0; ang[2] = 10.0; Мне нужно развернуть одно из значений угла, например ang[2] в противоположную сторону. Как это можно сделать? Перепробовал разные варианты, всё не то. Один из вариантов - получаю из углов вектор направления. GetAngleVectors(ang, vecDir, NULL_VECTOR, NULL_VECTOR); и делаю этот вектор негативным (*-1) NegateVector(vecDir); после получаю уже из негативного вектора углы float fwd[3] GetAngleVectors(vecDir, fwd, NULL_VECTOR, NULL_VECTOR) к сожалению результат не тот. Кто с таким сталкивался, отпишитесь пожалуйста. Может кто что придумал. Точно такая-же, но нерешенная тема есть здесь У меня просьба, пожалуйста без предложений кватернионов, матриц поворота, углов Эйлера и т.д.
0
|
|
| 09.09.2017, 13:44 | |
|
Ответы с готовыми решениями:
27
Как развернуть систему координат формы Как закрыть одну форму, и развернуть другую Как свернуть две формы в одну иконку в трей и развернуть |
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|||
| 12.09.2017, 15:46 | |||
![]() Шарнирный замок вроде есть только у углов Эйлера. А тут по кратчайшей дуге все крутит как угодно.
0
|
|||
|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 232
|
||
| 12.09.2017, 17:04 [ТС] | ||
|
Кликните здесь для просмотра всего текста
GetVectorAngles Function
Returns angles from a vector. void GetVectorAngles(const float vec[3], float angle[3]) Parameters const float[3] vec Vector. float[3] angle Angle buffer. сама функция вектор в углы Кликните здесь для просмотра всего текста
GetAngleVectors Function
Returns vectors in the direction of an angle. void GetAngleVectors(const float angle[3], float fwd[3], float right[3], float up[3]) Parameters const float[3] angle Angle. float[3] fwd Forward vector buffer or NULL_VECTOR. float[3] right Right vector buffer or NULL_VECTOR. float[3] up Up vector buffer or NULL_VECTOR.
0
|
||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 12.09.2017, 19:00 | |
|
В гугле “Тело функции”
0
|
|
|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 232
|
|
| 13.09.2017, 14:23 [ТС] | |
|
Excalibur921,
Вроде нормальный вопрос задал. Попросил же не писать сюда кватернионы и т.д. нет пишешь. Я думал может быть бот - вроде нет. Если есть желание поумничать - создай ты свою тему и умничай там. Ни малейшего дельного совета я пока не получил от тебя, более того, ты саму суть моего вопроса уводишь в сторону. Пойми, ну нет у меня столько времени "жевать сопли" как у тебя. Мне помощь нужна, а не твоё умничание. В общем - постарайся больше не писать мне. Не засирай мне мою тему. Igor3D, Я приеду домой, покажу сам кусок кода. По памяти я не напишу. Там ничего особенного нет, варианты я перепробовал уже все что можно. Если на словах - то выглядит это так: 1. навожу прицел на Дрона (сущность это ENT entity), при нажатии на клавишу вызова - проверка на соответствие, передаю координаты(позицию и углы) игрока в глобал. переменную. 2. запускаю функцию подъёма и разворота Дрона в направлении углов игрока(углы беру из глобальной переменной) подъём Дрона вектором скорости, чтоб не трясло его. 3. в функции подъёма и разворота сравниваю все текущие 3 угла Дрона с углами игрока, приращением ко всем 3 углам с определенной частотой. 4. если разворот закончен и Дрон поднялся на определенную высоту - запускаю след функцию- движение Дрона к позиции игрока (позиция игрока из глоб. переменной) движение так же вектором скорости. 5. и .т.д. Всегда, при малейшей попытке развернуть угол начинаются ошибки, крутит Дрона как попало. Всё отлично только при одном условии - Дрон смотрит точно в направлении взгляда вызвавшего его игрока. Там никакие 180 град не мешают, с любого угла отрабатывает прекрасно. Код простейший. Возможно я ошибаюсь при передаче координат и углов в функцию разворота, и где то происходит конфликт параметров внутри функции с полученными. Но навряд-ли. И та-же просьба, пожалуйста, не пиши про кватернионы. Я не просто так в начале об этом просил. Здесь ответ только по сути моего вопроса. Я, ребятки, создам отдельную тему если мне понадобятся кватернионы, матрицы и тому подобное. Там можно будет поумничать и пофилосовствовать. Добавлено через 7 минут Excalibur921, Кстати, у тебя свои наработки есть? Где можно посмотреть на твои работы?
0
|
|
| 13.09.2017, 15:05 | |
|
tonline_kms65, цитирование для краткости опускаю, примеров кода не нужно. Ну что, надо разбираться с Вашей "матчастью".
Какая бы система/API не была - вряд ли она будет использовать какие-то "свои" углы. Думаю что это обычные углы Эйлера в градусах. Первым делом это надо проверить. Задайте вращение только по одной из оси и посмотрите, напр 1) angles = { 0, 0, 0 }; 2) angles = { 0, 45, 0 }; 3) angles = { 0, 90, 0 }; В рез-те дрон должен поворачиваться вокруг Y
0
|
|
|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 232
|
||
| 13.09.2017, 18:18 [ТС] | ||
|
float _angle[3] = {0.0, 90.0, 0.0}; //на 90 градусов по Y (_angle[1]) то естественно что Дрон повернется именно на 90 градусов, и именно по координате Y. Разница в том что здесь заданно статичное значение, а я просто прибавляю ко всем 3 координатам значения, пока эти углы не выровняются со значениями углов игрока. За счет этого и происходит поворот Дрона теле-портом каждый тик на это самое приращение. Я понимаю так - ориентация координат угла Дрона здесь (при статическом объявлении) зависит от углов центра карты(мира). Я вместо координат углов центра карты, пытаюсь использовать координаты углов камеры игрока(которые зависимы от координат центра карты). Я представляю себе это как то так. Возможно здесь и есть моя ошибка. Добавлено через 12 минут Возможно что это "Углы Эйлера", но у меня Дрон поворачивается одновременно по всем 3 осям. Поэтому не могу ничего определенного сказать.
0
|
||
| 14.09.2017, 13:35 | ||||||||
|
Поэтому Вам нужно найти тот порядок что установлен в Вашем API - из документации (наводки "Euler angles order", "Rotation order") или экспериментально, печатая в консоль. Сам доворот в принципе делается так (псевдокод для оси Y):
Добавлено через 6 минут
0
|
||||||||
|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 232
|
|
| 15.09.2017, 12:09 [ТС] | |
|
Всё, готово. Разобрался. Помогли на буржуйском сайте. Оказалось все не просто, а очень просто.
Вот всё что требовалось, 3 строчки кода: Кликните здесь для просмотра всего текста
client_angle[1] += 180.0; //переворачиваю координату Y угла камеры игрока
if(client_angle[1] < -180.0) client_angle[1] += 360.0; if(client_angle[1] > 180.0) client_angle[1] -= 360.0; а дальше сравниваю углы и выравниваю их как обычно. Координаты X и Z можно, по идее, закрепить, сделать статичными. Но т.к. Дрон имеет физические свойства - думаю не стоит т.к. он может цепляться за стены, землю, углы естественно меняются. На видео это хорошо видно. В общем задачка решена, одно из направлений углы камеры игрока развернуты. Получается - это не "углы Эйлера", это какие-то "просто углы". Что больше всего нравится - нет практически никаких расчетов. Ни синусов, ни косинусов, ни прочей белиберды. Для сетевой игры это то что нужно. На видео вызываю 2 созданных Дрона. Отрабатывает просто безукоризненно. Есть кое-какие недоработки конечно, но основная задача выполнена, всё остальное, понятно, уже мелочи. https://youtu.be/90aPtpC5bBs
0
|
|
| 15.09.2017, 12:09 | |
|
Как сделать точку отсчёта координат угла от центра и использовать Box2D? Вот есть кнопочки: свернуть, развернуть, закрыть. Как скрыть кнопку развернуть? прототипирование алгоритма вычисления координат/угла поворота Задача на нахождение угла при известных точках в 2D системе координат
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|