|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
|
|
Как развернуть одну из координат угла09.09.2017, 13:44. Показов 7101. Ответов 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
Как развернуть систему координат формы Как закрыть одну форму, и развернуть другую Как свернуть две формы в одну иконку в трей и развернуть |
|
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
|
|
| 09.09.2017, 14:21 | |
|
Что такое угол сущности? В каких единицах измерения все эти цифры?
Добавлено через 4 минуты ang[2] =360 - ang[2] сработает?
0
|
|
|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
|
|
| 09.09.2017, 15:50 [ТС] | |
|
Углы это, грубо говоря, xyz координаты направления в 3d пространстве сущности(ее взгляда)
0
|
|
|
Айлурофил
|
|
| 09.09.2017, 16:31 | |
|
Смещаете всё в точку (0,0,0), меняете угол, и смещаете обратно.
t(i)=ang(i)-pos(i) t(i0)=-t(i0) ang(i)=t(i)+pos(i)
0
|
|
|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
|
|||
| 09.09.2017, 19:00 [ТС] | |||
|
Вот это интересно. А для чего такой маневр? Что он даёт?
Делать это в цикле? Добавлено через 50 минут Кликните здесь для просмотра всего текста
dron [0] 2.020084/[1] 156.586502/[2] -0.071075
client [0] 2.904000/[1] 157.120056/[2] 0.000000 dron [0] 3.020084/[1] 157.586502/[2] 0.928924 client [0] 2.904000/[1] 157.120056/[2] 0.000000 dron [0] 2.020084/[1] 156.586502/[2] -0.071075 client [0] 2.904000/[1] 157.120056/[2] 0.000000 dron [0] 3.020084/[1] 157.586502/[2] 0.928924 client [0] 2.904000/[1] 157.120056/[2] 0.000000 dron [0] 2.020084/[1] 156.586502/[2] -0.071075 client [0] 2.904000/[1] 157.120056/[2] 0.000000 dron [0] 3.020084/[1] 157.586502/[2] 0.928924 client [0] 2.904000/[1] 157.120056/[2] 0.000000 dron [0] 2.020084/[1] 156.586502/[2] -0.071075 client [0] 2.904000/[1] 157.120056/[2] 0.000000 dron [0] 3.020084/[1] 157.586502/[2] 0.928924 client [0] 2.904000/[1] 157.120056/[2] 0.000000 dron [0] 2.020084/[1] 156.586502/[2] -0.071075 client [0] 2.904000/[1] 157.120056/[2] 0.000000 Я пытаюсь сравнивать именно в этих таинственных значениях. Но значения не выходят за пределы 360. Возможно что это градусы. Добавлено через 21 минуту Для чего мне это нужно - у меня игрок удалённо вызывает эту самую сущность (ENT). Непосредственно поворот я делаю прибавлением значений к каждому из 3 значений угла ENT. За основу, для сравнения, я беру углы игрока. Но так как игрок смотрит на ENT, она естественно, разворачивается к игроку задом, т.е. в направлении взгляда игрока. Я считаю это самый дешевый вариант, который не грузит процессор. Но вот есть такой косяк. А как с ним бороться не знаю. Кликните здесь для просмотра всего текста
if(client_angle[0] > drone_angle[0]){ // сравниваю угол игрока client_angle[0] с текущим углом ENT drone_angle[0]
drone_angle[0]=FloatAdd(drone_angle[0], 1.0); //прибавляю значение с частотой 1.0 }else{ drone_angle[0]=FloatSub(drone_angle[0], 1.0); // отнимаю значение с частотой 1.0 } // и т.д. if(client_angle[1] > drone_angle[1]){ drone_angle[1]=FloatAdd(drone_angle[1], 1.0); }else{ drone_angle[1]=FloatSub(drone_angle[1], 1.0); } if(client_angle[2] > drone_angle[2]){ drone_angle[2]=FloatAdd(drone_angle[2], 1.0); }else{ drone_angle[2]=FloatSub(drone_angle[2], 1.0); } Самый точный - вектором. Но я тогда не могу плавно повернуть сущность в направлении на игрока. Вернее могу, но получается масса вычислений. А резко, понятно, смотрится дико.
0
|
|||
| 10.09.2017, 08:10 | ||
|
Расскажите чего Вы хотите добиться на простом примере, избавьтесь от слова "сущность" (здесь совершенно неуместного)
0
|
||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 10.09.2017, 18:17 | |
|
Повернуть AB относительно A на 180? C=A - (B-A)
0
|
|
|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
|
||
| 10.09.2017, 19:21 [ТС] | ||
|
Сделал видео для наглядности. Видно что при вызове сущности (здесь сущностью может быть все что угодно, в данном случае это Дрон) она всегда поворачивается к вызывающему "задом". Для определения положения Дрона я использую координаты игрока (камеры) т.е. углы. Как бы понятнее объяснить - я при развороте Дрона, беру за образец углы глаз игрока (камеры) сравниваю с углами Дрона. Так проще. Регулировка идет в основном только по 2 осям, X (yaw - рыскание) и по Y (pitch - тангаж), Z можно не трогать, так как эта координата у камеры игрока не меняется. Если крутить Дрона вектором, то все нормально получается, но при ориентировании по углам зрения игрока - проблема с разворотом углов именно игрока т.е. камеры. Спасибо за подсказку. Я как то об этом даже и не подумал. Я так понял что координаты камеры изменить невозможно? Тогда это меняет дело. Я и так и этак мучился. Тогда нужно играть углами Дрона. Я уже собирался просто модель перекомпилировать, развернуть меши модели и по новой привязать их к костям. Но это такой головняк. Это просто полная перекомпиляция модели, причем со всеми её анимациями. Добавлено через 7 минут Можно же сделать так: 1. angle[1] = -angle[1] 2. angle[1] = angle[1]*-1 Просто "развернуть".
0
|
||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 10.09.2017, 20:55 | |
|
0
|
|
|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
|
||
| 11.09.2017, 00:15 [ТС] | ||
|
Пока не могу практикой проверить. Я на работе. А в теории я слаб. Приеду домой - проверю. Я сомневаюсь что решена будет эта проблема. Ты разворачиваешь вектор направления, а мне нужно развернуть только одну из 3 координат угла. Я для примера взял angle[1]. В теории вроде всё должно получиться, а на деле либо крутить начинает по конски, либо вообще не работает. С векторами работать проще и точнее, но придется сравнивать вектора, поворачивать один из векторов, без синусов косинусов уже никак не обойтись. А это дополнительные расчеты. Или делать трассировку до попадания именно в вызывающего игрока, опять дополнительная нагрузка. Есть еще вариант, самый простой но самый геморройный, перекомпиляция модели полностью. Что бы изменить положение основной кости. Было бы конечно проще использовать кватернионы с матрицей поворота, но это не тот язык, если только прикрутить сюда готовую библиотеку, но это уже ООгромный геморрой. Это всё недоделанный SourcePawn, не в обиду будет сказано, для работы с 3D моделью очень мало, доступа к костям вообще нет! Что то типа бейсика, для работы с текстом, только шустрее бейсика раз в 10, если не больше. Тогда и делали бы уже SourceBasic. По идее, сама функция вызова мне не нужна. Но нужны те возможности которые потом можно будет использовать. Если я пойму как они работают. Приеду домой - займусь. Информация от Igor3D меня заинтересовала. Очень похоже на реальность.
0
|
||
| 11.09.2017, 11:14 | ||||
Ладно, я понял так: объект (напр дрон) должен поворачиваться задом к камере. Тогда зачем вообще углы? Вам нужно совместить одну из осей СК объекта (напр -Z) с направлением (drone - camera). Это можно сделать матрицей поворота или кватернионом. Если нужны детали - распишу
0
|
||||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
||||||
| 11.09.2017, 12:00 | ||||||
|
В матрице много повторов.
Проще хз как..
1
|
||||||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
||||||
| 11.09.2017, 12:28 | ||||||
|
Нужно нормировать:
0
|
||||||
| 11.09.2017, 13:56 | ||
|
- находим векторное произведение исходных векторов (для угла 180 пролетаем) - выписываем первую матрицу 3x3 (первый вектор и произведение) - выписываем вторую матрицу 3x3 (второй вектор и произведение) - теперь первую матрицу транспозим и множим на вторую. Вот она матрица поворота Если все это расписать на бумажке - получится та самая "ужасная" матрица что выше
0
|
||
|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
|
|||
| 11.09.2017, 17:45 [ТС] | |||
|
Excalibur921 Igor3D
Спасибо ребятки за развернутые ответы. Насчет матриц и т.д. - ну не тот это язык (SourcePawn), не тот. Это просто скриптовый язык. не объектно-ориентированный. По стилю и по скорости он похож на с++, но не более того. 1. получаю вектор направления Дрон-Игрок (если изменить Игрок-Дрон то направление вектора поменяется => поменяется направление модели) 2. получаю вектор направления Дрона 3. сравниваю вектора (я думаю можно даже не нормализовать) Этот вариант неплох в принципе, но это дополнительные расчеты. В случае с ориентацией на углы камеры все просто, очень просто, никаких особых расчетов. Даже синусов и косинусов нет. Но вот есть недоработка в самом языке, нет доступа к костям модели. Здесь скелетная анимация, она основана на костях. Если смотреть на углы модели, то углы определяются именно от положения основной кости модели. и изменить их я пока не знаю как. Нет к костям доступа в этом языке. Вот и получается направление углов камеры игрока совпадает с направлением углов кости модели Дрона. Знал бы про этот косяк, изначально делал бы модель Дрона с обратным расположением костей. Но разве всё можно предвидеть. Вот сейчас и мучаюсь. Простейшая задачка вроде-бы а не решаема. Можно, как я писал, перекомпилировать модель, но у меня просто не хватит уже терпения. Это я для тех кто не хочет таких же проблем. Меши модельки нужно сразу располагать на костях правильно.
0
|
|||
|
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 224
|
|
| 11.09.2017, 17:55 [ТС] | |
|
Как приеду, еще помучаюсь и наверно остановлюсь на векторах.
Обидно просто - казалось бы простая задача, а решения нет, а всё потому что модель изначально сделал неправильно. Вернее не совсем правильно, всё внимание уделил анимациям.
0
|
|
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|||||||
| 12.09.2017, 12:36 | |||||||
|
http://ru.solverbook.com/sprav... na-vektor/ Попробовал матрицу поворота через кватернион. Снова много повторов. Работает, а расчетов меньше.
0
|
|||||||
| 12.09.2017, 13:53 | |||
|
Добавлено через 1 час 13 минут В общем, как в том анекдоте где трусы линяют
0
|
|||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|||
| 12.09.2017, 14:39 | |||
|
Не знаю что это такое:
Например мне непонятно как дрон знает куда прилетать и направление взгляда дрона…Самое простое массив координат точек на карте с проверкой не занято ли это место другим объектом + временная блокировка подхода игроков к этому месту. Я так понял анимация модели это посадка всегда на плоскость с постоянной высоты. Тогда всего 1 угол у модели определяет направление взгляда дрона в плоскости параллельной земле. Тут повернуть всю модель до анимации вокруг Z и все. Записать координаты центра игрока в момент вызова дрона. Зная точку посадки дрона заранее и точку вызова найти направление взгляда дрона. После посадки дрон смотрит на точку откуда был вызван.
0
|
|||
| 12.09.2017, 15:15 | ||
|
Да, и насколько я понял, ребятке вовсе не нужен "поворот по кратчайшей дуге". Напр камера оказалась выше дрона по Y - но дрон ведь не станет "задирать хвост" - он хочет довернуть его только вокруг Y, вот и ищет угол
0
|
||
| 12.09.2017, 15:15 | |
|
Помогаю со студенческими работами здесь
20
Как сделать точку отсчёта координат угла от центра и использовать Box2D? Вот есть кнопочки: свернуть, развернуть, закрыть. Как скрыть кнопку развернуть? прототипирование алгоритма вычисления координат/угла поворота Задача на нахождение угла при известных точках в 2D системе координат
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во
всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
|