| Векторы в 3д |
|
Maverick
| Дата: Вторник, 23.12.2008, 08:44 | Сообщение # 1 |
|
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
|
Имеем нормаль плоскости, величину скорости обьекта, поворот по горизонтале обьекта в его системе координат, наклон по вертикале обьекта в его системе координат (yaw и pitch соответственно). Как расчитать вектор движения обьекта вдоль этой плоскости в глобальной системе координат? И при этом узнать углы поворота вокруг главных осей в последовательности 0x, 0y, 0z с учетом локального (в его системе координат) наклона обьекта (в нашем случае камеры) по вертикале? ось x - прямо ось y - вправо ось z - вверх Добавлено (23.12.2008, 08:44) --------------------------------------------- ладно, спрошу подругому - как описать движение обьекта по произвольной кривой поверхности?
|
| |
| | |
|
Ang3L
| Дата: Вторник, 23.12.2008, 23:34 | Сообщение # 2 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Перевод глобальной системы в локальную полностью зависит от тебя. Как в ГМ x и y, относятся к глобальной системе координат. А вот объект у которого центр лежит в x и y и считаются от них, будут локальными. Пример: Экран - глобальные координаты - view_xview[] и view_yview[]. Двигаем объект относительно экрана. Локальные координаты -> (128; 128); Глобальные -> (view_xview[] + 128; view_yview[] + 128) Тормозное движение по поверхности: cos(pitch) * speed. Если смотришь вверх скорость = 0; Если на горизонт скорость = скорость; Если 45*, то скорость = sqrt(2) * скорость; Где-то так. поищи вот этот файл: directx9.chm Там вначале есть математика про графику. Но я не выцепил то что тебе нужно. Может ты разберёшься. А вот ещё: Программирование Магических Игр - Не про фентези! В частности: Основы 3д математики Это пока всё чем могу помочь.
Blogpost
|
| |
| | |
|
Maverick
| Дата: Среда, 24.12.2008, 19:54 | Сообщение # 3 |
|
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
|
интересно это конечно все, но перенос из локальной системы в глобальную координат я знаю как сделать. А как переносить углы из локальной в глобальную?  Причем у меня тут такая весчь, что помоему даже не понятно куда их именно переносить.... в систему координат плоскости? допустим камера смотри прямо, pitch,yaw,roll = 0. Тогда, находясь на вертикальной плоскости камера будет смотреть вверх, тоесть pitch = -90, yaw,roll = 0. Если камера смотрит влево (pitch,roll = 0, yaw = -90) то на все тойже вертикальной плоскости её параметры равны pitch,yaw = 0, roll = -90, тоесть она наклоницо влево по оси X, а не по оси Y. Если бы плоскость была вверхногами, градусов на 45, то параметры этой камеры были бы: pitch = -135 (положительные вращения вниз), yaw = -90 (положительные вращения вправо), roll = 0 (в порядке применения вращений pitch, yaw, roll). Но это все частные случаи. Как будет выглядить формула переноса этих углов в систему координат плоскости? Именно углов - ибо двиг Ultimate 3D не дает указат точку в пространстве, на которую смотрит камера, он дает тока указать вращения вокруг главных осей.
|
| |
| | |
|
Ang3L
| Дата: Среда, 24.12.2008, 23:03 | Сообщение # 4 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Я просто никогда не работал с 3д, точнее не оч. глубоко. Меня как раз эти вектора и перемещение в пространстве напрягали. Короч могу дать след. совет: Попробуй сначала поперемещать камеру в 2д. Просто выкинь третью координату. Попробуй перевод из локальной в глобаьную с-му и обратно, как для позиций, так и для перемещения. Потом просто добавишь по аналогий третью координату. Камеру обозначь как треугольник. И перемещение по кривой (а вот это сложнее сделать  ). Ща сам попробую.
Blogpost
|
| |
| | |
|
Maverick
| Дата: Четверг, 25.12.2008, 00:20 | Сообщение # 5 |
|
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
|
Короче тут надо задать начальные условия, раз ты не работал с 3д ) Я имею камеру  которая, может поворачивацо вокруг главных осей глобальной системы координат, тобишь Ox, Oy и Oz. Ох идет вправо, Oy - вперед, Oz - вверх. Камеру можно поворачивать только вокруг этих осей, а не вокруг её осей. Поворот вокруг Ox называецо pitch - тоесть наклон камеры вверх-вниз. Вокруг оси Oz - yaw - тоесть осмотр камерой влево-вправо. Поворот вокруг Oy - это наклон камеры вбок, тоетсь было так _ , стало так / - это типа наклон влево. Называецо он roll. Поворачиваецо камера в последовательности pitch, yaw, roll. Я хочу вопернуть камеру вокруг своих осей допустим pitch_camera - 45, roll_camera = 0, yaw_camera = 90. Чему будут равны pitch,yaw,roll те самые глобальные, если знаем локальные повороты камеры вокруг своей оси?
|
| |
| | |
|
Ang3L
| Дата: Четверг, 25.12.2008, 01:28 | Сообщение # 6 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Вот посмотри: Global to Local. Там вроде я всё подписал. Подписанное перемещение только Left. z, x - поворот камеры. с - перевод из глобальных координат в локальные и наоборот. стрелки - перемещение камеры относительно выбранной системы координат. lengthdir_x(len, dir) = len * sin(degtorad(dir)); lengthdir_y(len, dir) = -len * cos(degtorad(dir)); вроде так. а z наверное тоже что и y, тока без минуса. Quote Чему будут равны pitch,yaw,roll те самые глобальные, если знаем локальные повороты камеры вокруг своей оси? Так ты должен знать начало "мира". орты (1,0,0), (0,1,0), (0,0,1) - относительно их ты ищешь углы. Это глобальные координаты. Относительно их высчитывай свой угол. Тригонометрия, lenghtdirы и я, тебе помогут! Посмотри мой пример, может поможет. Если нет я попробую более конкретно разобрать твою ситуацию. вот так я высчитываю глобальный угол между 2 точками в 2д (ноль - вправо, а может и вверх... непомню :D): Можешь перевести в 3д А там ищи от (0,0,0) до (camera_x,camera_y,camera_z) -> и вот те угол. с++ Code float gamemath::point_direction(float x1, float y1, float x2, float y2) { float dX = x2 - x1; float dY = y2 - y1;
float dist = sqrt((dX*dX) + (dY*dY)); float dXa = abs(dX);
float beta = radtodeg(acos(dXa / dist));
float angle;
if(dX > 0) { if (dY < 0) angle = 270 + beta; else angle = 270 - beta; } else { if (dY < 0) angle = 90 - beta; else angle = 90 + beta; } return (360 - fmodf(angle + 180, 360)); } Кстати, я так посмотрел... так твои pitch, yaw, roll - помоему глобальные. Ты можешь их вернуть? если можешь, то это глобальные. P.S.: забыл. Угол можно узнать только на плоскости. В 3д получится вектор. P.P.S: Я работал с 3д, но ... немного насколько я помню там были функций (в 3dstate) установки координаты по оси - это глобальное изменение координат, относительно начала "мира". А ещё возращались глобальный угол по одной из координат. И для того что добавить какую-то величину: угол_установить_pitch(угол_возратить_pitch + 10); //было так.
Blogpost
Сообщение отредактировал Ang3L - Четверг, 25.12.2008, 01:49 |
| |
| | |
|
Maverick
| Дата: Четверг, 25.12.2008, 01:50 | Сообщение # 7 |
|
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
|
нет, в 3д можно узнать угол тоже, смотря отукда смотреть. Ты не то разбираешь. Это уже давно пройденный этап. Я знаю как определять направление от одной точки до другой даже в 3д. И для того чтобы задат yaw pitch roll - достаточно двух векторов. векторно перемножив которые - получим третий - это и есть локальная система координат. Я спрашиваю следущее - представь что камера стоит на земле, её pitch и yaw управляюцо движениями мышки, как и в любом фпс. А теперь прикинь что камера стоит вверхногами на потолке. Как найти чему стали равны её глобальные повороты pitch yaw roll? именно глобвальные а не локальные. Или прецтавь что плоскость повернута на n градусов куданить, тоетсь мы знаем нормаль плоскости. Как построить локальную систему координат плоскости? Чему будут равны глобальные повороты камеры, имеющие локальные pitch и yawl , отличные от 0, если она стоит на плоскости, имеющей нормаль normal?
|
| |
| | |
|
Ang3L
| Дата: Четверг, 25.12.2008, 02:16 | Сообщение # 8 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Quote А теперь прикинь что камера стоит вверхногами на потолке. Как найти чему стали равны её глобальные повороты pitch yaw roll? Верни их. Quote именно глобвальные а не локальные. Не локальные значит. А относительно чего тебе сейчас возращаются? К локальным координатам можно только добавить\вычесть, а возратить их нельзя, точнее они будут нулями. Quote Как построить локальную систему координат плоскости? Нормаль уже есть, так? значит 2 остальных вектора лежат на плоскости, так? выбирай любые 2 орты на плоскости. Всё. Система готова. Или ты думал что она там одна? Так. Я так понял что у тебя нет функций, которые возращают угол? Если есть, назови относительно чего он сейчас определяется. Добавлено (25.12.2008, 02:16) --------------------------------------------- Просто у меня уже есть глобальный угол - direction. Поэтому я тебя не понимаю. Когда я перешёл на HGE, там такого не было. Я ввёл сам координату глобальную. Я считаю, что вверх ноль (вроде. забыл ) в 2д. вот и вся премудрость.
Blogpost
|
| |
| | |
|
Maverick
| Дата: Четверг, 25.12.2008, 03:04 | Сообщение # 9 |
|
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
|
нет... локальные pitch и yaw камеры я задаю мышкой, повдинул влево - и yaw стал не 0 а допустим 40, подвинул вверх и pitch стал допустим 32. Это все локальное. Но если камера будет стоять на плоскости под 90°, то начав двигать мышь влево - я начну изменять локальный yaw камеры. Казалось бы мы ожидаем что камера сейчас начанет поворачивацо влеао. Ан нет! она начинает крутицо вдоль оси, по которой смотрит! ЭТО НЕ ПРАВИЛЬНО это потомучто она крутицо вокруг глобальных осей координат, а мне надо чтобы она крутилась вокруг локальных. Сколько раз можно повторять???? Добавлено (25.12.2008, 03:03) --------------------------------------------- Почему нельзя просто взять и поменять очередность применения поворотов... тупой движок.... если повернуть камеру вначале по yaw а только ПОТОМ по pitch - это уже САААААВСЕМ другое, и это как раз то что мне нужно. Но нет блин.... поэтому приходицо вот так извращацо. Как расчитать эти повороты, чтобы казалось что я поворачиваю камеру не в последовательности pitch->yaw а в последовательности yaw-pitch? Добавлено (25.12.2008, 03:04) --------------------------------------------- и еще... что значит "верни их" ?? return? или я чето не понимаю? Если return, то причем тут это вообще? Что вернуть? елси я даже еще не расчитал то, что надо возвращать
Сообщение отредактировал Maverick - Четверг, 25.12.2008, 03:05 |
| |
| | |
|
Ang3L
| Дата: Четверг, 25.12.2008, 03:26 | Сообщение # 10 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Quote Казалось бы мы ожидаем что камера сейчас начанет поворачивацо влеао. Ан нет! она начинает крутицо вдоль оси, по которой смотрит! Ха! Знакомая проблема. То же самое было и в 3dstate. я её тогда не решил. Quote локальные pitch и yaw камеры я задаю мышкой, повдинул влево - и yaw стал не 0 а допустим 40, подвинул вверх и pitch стал допустим 32. Это все локальное. Нет не локальное. Это глобальные величины. Они относительно мира. Но да, они локальные переменные. Это да. Короч те надо freelook. Ща чё-нить придумаем. Quote что значит "верни их" ?? return? или я чето не понимаю? Если return, то причем тут это вообще? Что вернуть? елси я даже еще не расчитал то, что надо возвращать Ты их как-нить узнать можешь? ну типо вывести на экран? я читал хелп к этому двигуну и нифига не понял. В норм. движках существуют функций, которые возращают координаты. Это связано с инкапсуляцией программы, лучше так короч. А тут я так понял, переменные открытые. Типо ты изменяешь rotx\y\z, как в ГМ х\у\direction? rotz += 1; Так? Добавлено (25.12.2008, 03:24) ---------------------------------------------
Quote это потомучто она крутицо вокруг глобальных осей координат, а мне надо чтобы она крутилась вокруг локальных. Ну так я те ж сверху пример сваял. локальная = координата - глобальная. так локальное перемещение через как я писал выше. Quote lengthdir_x(len, dir) = len * sin(degtorad(dir)); lengthdir_y(len, dir) = -len * cos(degtorad(dir)); вроде так. а z наверное тоже что и y, тока без минуса. А повороты... Добавлено (25.12.2008, 03:26) --------------------------------------------- Ну ка, а покажи код как ты поворачиваешь, сейчас.
Blogpost
Сообщение отредактировал Ang3L - Четверг, 25.12.2008, 03:16 |
| |
| | |
|
Maverick
| Дата: Четверг, 25.12.2008, 03:34 | Сообщение # 11 |
|
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
|
да! ты прав!  Очень жалко что ты нифига не понял в хелпе. Переменные rotx roty и rotz - это повороты обьекта(или камеры) вокруг глобальных осей. Я ввел пару своих переменных - rotx_temp и roty_temp - это накло и поворот камеры с учетом того что она стоит горизонтально на земле. потом еще есть rotx_add и rotz_add. Щя обьясню что это. Я вокруг камеры создаю 4 индикатора, посылаю их по обратной нормали плоскости до контакта с ней, они останавливаюцо там, теперь если смотреть на них с позиции камеры roty_temp + 90 - то направление от заднего индикатара к переднему - есть наклон плоскости rotx_add если смотреть на индикаторы с позиции камеры roty_temp (тоесть сзади) - то направление от левого до правого индикатора - это rotz_temp - тоесть наклон плоскости влево. Причем индикаторы всегда находяцо в системе координат камеры и сохраняют своё относительное положение. земля щупаецо в обратном направлении последней известной нормали. Причем перед тем как перевести индикаторы в систему координат камеры, я разворачиваю их вокруг камеры на её roty_temp, тоесть например первый индикатор всегда остаецо спереди камеры, неважно как и куда она направлена без учета rotx_temp. так я полчаю углы наклона полскости глобальной системе коордиинат, повернутой на roty_temp камеры. я пробовал получать финальные углы так rotx = rotx_temp + rotx_add roty = roty_temp rotz = rotz_temp + rotz_add ниче не получилось. Пробовал создать три вектора у камеры, которые б определяли её систему координат и пыталсо вычислить повороты уже по ним - таже херня, все безрезультатно. Но малотого что мне надо вот так повернуть камеру, мне ведь еще надо задать движение, но это потом ) Кстате играл в трекманию? Добавлено (25.12.2008, 03:33) --------------------------------------------- вообще мне надо написать двиг , позволяющий двигацо как угодно на все 360 по всем плоскостям ) Добавлено (25.12.2008, 03:34) --------------------------------------------- я может не правильно нахожу углы плоскости..... не кажецо проблема в этом. Но это касательно движения....
|
| |
| | |
|
Ang3L
| Дата: Четверг, 25.12.2008, 03:36 | Сообщение # 12 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Quote Кстате играл в трекманию? Нет. Не довелось. Гонки хошь сделать? Quote Очень жалко что ты нифига не понял в хелпе. Да там именно этот момент, момент трансформаций, оч. слабо описан. Quote Казалось бы мы ожидаем что камера сейчас начанет поворачивацо влеао. Ан нет! она начинает крутицо вдоль оси, по которой смотрит! Вот в этот момент должен подключится Roll. Тогда не будет завала. Подумай пока как. Я спать пойду, и пока поразмыслю. Завтра отпишусь, если чё нить придумаю.
Blogpost
|
| |
| | |
|
Maverick
| Дата: Четверг, 25.12.2008, 10:16 | Сообщение # 13 |
|
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
|
SOLVED! m1 = CreateRotationMatrix(-1,0,0,0) var m2; m2 = CreateRotationMatrix(-1,rotx_temp,0,0) TransformMatrix(m1,m1,m2) ReleaseMatrix(m2) m2 = CreateRotationMatrix(-1,0,roty_temp,0) TransformMatrix(m1,m1,m2) ReleaseMatrix(m2) m2 = CreateRotationMatrix(-1,rotx_add,0,0) TransformMatrix(m1,m1,m2) ReleaseMatrix(m2) m2 = CreateRotationMatrix(-1,0,0,-rotz_add) TransformMatrix(m1,m1,m2) ReleaseMatrix(m2) vec = ComputeMatrixRotationAngles(-1,m1) rotx = GetVector(vec,1) roty = GetVector(vec,2) rotz = GetVector(vec,3) и все встает на свои места. Точно также я повернул вектор скорости. Я просто вначале даже не заметил что там есть функции для вращения матриц С ними есессно все проще
Сообщение отредактировал Maverick - Четверг, 25.12.2008, 10:16 |
| |
| | |
|
SRes
| Дата: Четверг, 25.12.2008, 10:17 | Сообщение # 14 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
|
Maverick, Я играл. Даже лицуху покупал, но меня игра не затянула и щас пылится на полочках.
Velociped Inc.
|
| |
| | |
|
Maverick
| Дата: Четверг, 25.12.2008, 11:16 | Сообщение # 15 |
|
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
|
вопрос про трекманию был вплане примера просчета векторов ТАМ, а не в плане "давай поиграем" :P Добавлено (25.12.2008, 11:16) --------------------------------------------- Короче осталось только правильно найти углы поворота плоскости, зная только её нормаль ) те самые rotx_add и rotz_add
|
| |
| | |
|
SRes
| Дата: Четверг, 25.12.2008, 11:38 | Сообщение # 16 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
|
Maverick,  Я просто ответил.
Velociped Inc.
|
| |
| | |
|
Ang3L
| Дата: Четверг, 25.12.2008, 13:53 | Сообщение # 17 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Maverick, я чёт пока не втыкаю. Я уже видел эти матрицы преобразований, но зачем они так и не понял. Ща буду разбираться для 2д плоскости  . Кстати, у тебя 3 последние m2 можно объединить я так думаю. И тогда у тебя останутся только по 2 TransformMatrix() и ReleaseMatrix()
Blogpost
|
| |
| | |
|
Maverick
| Дата: Четверг, 25.12.2008, 16:13 | Сообщение # 18 |
|
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
|
да, если бы ты понимал - то не говорил бы что "можно обьеденить", ибо я специально повернул сначала по у, потом х и потом по з, а если обьедеинть - результат совсем другой =)
|
| |
| | |
|
Ang3L
| Дата: Четверг, 25.12.2008, 18:21 | Сообщение # 19 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
3DSTATE Demos Вот тут посмотри. Там вроде есть какие-то сырцы, может поможет. Quote ибо я специально повернул сначала по у, потом х и потом по з, а если обьедеинть - результат совсем другой Я искренне немогу понять почему именно в таком порядке, и почему их нельзя объеденить. Они двигаются по разным осям, поэтому я думаю, их можно объеденить в одну трансфрмацию, только смотреть чтоб оси не пересекались. Например, с локальным перемещением у мен явыше пример, да там пофиг по какой из осей ты передвигаешь сначала, конечный результат один и последовательность не влияет. Короч, мне например, надо ещё разбираться. Больно как-то кривой код получается. Просто, если код работает, это не значит что это верное решение. А я стараюсь находить верные решения (если они идут не в разрез с оптимизацией).
Blogpost
|
| |
| | |
|
Maverick
| Дата: Суббота, 27.12.2008, 13:31 | Сообщение # 20 |
|
Хоть палкой гони
Группа: Высший Советник
Сообщений: 781
Статус: Offline
|
это верное решение, поверь ) ибо это то что мне надо было - этот код меняет порядок вращений pitch->yaw->roll на yaw->pitch->roll Просто прецтаваь, а еще лучше возьми ченить в руки, похожее на вектор (карандаш например), задай систему координат: куда ты щя смотришь - это у, вправо от тебя х, а вверх з. Вот поверни сначала карандаш вокруг _своего_ у, а потом вокруг _своего_ х и запомни его положение. Теперь поверни его из начального положения на теже углы, но сначала по х а потом по у. Карандаш займет савсем другое направление в пространстве. Это называецо вращение вокруг глобальных осей координат. если не знать, в какой последовательности вращать - в конце концов можно зайти в тупик, потеряв одну из степеней свободы у вектора ) Добавлено (27.12.2008, 13:31) --------------------------------------------- Как найти углы Эйлера, зная только нормаль плоскости?
|
| |
| |
|
|