Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 3D вращение, 3D вращение 
:(
    Опции темы
Gigabyte
Дата 20.10.2005, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Студент-халявщик
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 1.11.2004
Где: ПЫтер

Репутация: нет
Всего: 3



Подскажите формулу по которой можно найти координаты 3d тела при вращение если известен угол на которое тело было повернуто(центр вращения-цент фигуры)


--------------------

user posted image
user posted image
PM MAIL ICQ   Вверх
maxim1000
Дата 20.10.2005, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



тут еще надо знать вокруг чего тело вращалось...


--------------------
qqq
PM WWW   Вверх
Gigabyte
Дата 20.10.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Студент-халявщик
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 1.11.2004
Где: ПЫтер

Репутация: нет
Всего: 3



тело вращается вокруг центра фигуры(т.е. вокруг своей оси)

Цитата
(центр вращения-цент фигуры)

я же написал


--------------------

user posted image
user posted image
PM MAIL ICQ   Вверх
maxim1000
Дата 20.10.2005, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



ох... представим себе человека
когда он стоит на земле, он может крутиться, например, направо - в горизонтальной плоскости, т.е. вокруг вертикальной оси
когда это какой-то гимнаст на кольцах, он может крутиться в вертикальной плоскости (т.е. вокруг горизонтальной оси)
и в том, и в другом случае они вертятся вокруг своего центра...


--------------------
qqq
PM WWW   Вверх
Dr.Wisdom
Дата 20.10.2005, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 6.1.2005

Репутация: нет
Всего: 0



Вообще имелось ввиду вокруг оси или точки.

Это точно было в курсе аналитической геометрии. Не помню убейте меня не помню. Учебник - погорелов. (или проскуряков) в общем аналитическая геометрия. там простое преобразование матриц.

А сточки зрения матана то напиши преобразование плоскости в сферу и бери любую функцию на плоскости. После преобразования произоыдет поворот. Вообще поворот, случайное движение.... я отвлекся.

Вращение вокруг оси - перемещение в плоскости ей перпендикулярной. Плоскость перпендикулярная вектору ..... э-э-э-э-х не помню простая формула.
--------------------
VIVA LA RESISTANCE
PM MAIL   Вверх
Gigabyte
Дата 20.10.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Студент-халявщик
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 1.11.2004
Где: ПЫтер

Репутация: нет
Всего: 3



у меня есть формула вращения двух мерного тела вокруг оси

x = xo + r * cos(alpha + beta)
y = yo + r * sin(alpha + beta)

xo,yo - центр поворота,
r - длина отрезка OM
O - это центр поворота,
M - некая точк
угол alpha между отрезком OM и горизонталью
beta-угол поворота

а мне нужно вращать тело вокруг центра(задаётся 3 угла и координаты точки надо найти новые координаты точки)



--------------------

user posted image
user posted image
PM MAIL ICQ   Вверх
DENNN
Дата 20.10.2005, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Очень мне это формулировка нравится:

Цитата(Gigabyte @ 20.10.2005, 14:26)
а мне нужно вращать тело вокруг центра

Цитата(Gigabyte @ 20.10.2005, 13:54)
тело вращается вокруг центра фигуры


При такой формулировке вращать можно как угодно и "куда" угодно - все будет верно smile

Это сообщение отредактировал(а) DENNN - 20.10.2005, 16:12
PM ICQ   Вверх
S.A.P.
Дата 20.10.2005, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Gigabyte может тебе нужно найти новые координаты вершин какой - нибудь фигуры? Потому что если фигура вращается вокруг своего центра, то координаты центра не меняются smile .
PM MAIL   Вверх
yaja
Дата 22.10.2005, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 30.3.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Ну наверное что-то вроде

a - a0 = r * A

A = cos(y) -sin(y) 0
sin(y) cos(y) 0
0 0 1

такая вот матрица, если вращать по по z. аналогично для осей х и у.
Если что-то другое, то плохо дело smile (склероз)
Можно канечно представить, как композицию двух поворотов, но есть формула для поворота вокруг произвольной оси работающая быстрее
PM MAIL   Вверх
cardinal
Дата 22.10.2005, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Почитайте что я делал:
http://forum.vingrad.ru/index.php?showtopic=22163


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Gigabyte
Дата 24.10.2005, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Студент-халявщик
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 1.11.2004
Где: ПЫтер

Репутация: нет
Всего: 3



cardinal напиши пожалуйста формулу которой ты пользовался в своём примере


--------------------

user posted image
user posted image
PM MAIL ICQ   Вверх
cardinal
Дата 24.10.2005, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата(Gigabyte @ 24.10.2005, 10:36)
напиши пожалуйста формулу которой ты пользовался в своём примере

Тут в коде все формулы есть:
http://forum.vingrad.ru/index.php?showtopi...ndpost&p=150469
А ты напиши откуда ты smile Просто интересно...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
cardinal
Дата 24.10.2005, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



А вот это формулы для того, чтобы поворачивать одновременно на углы альфа, бета и гамма вокруг всех осей. То есть не на определенный угол вокруг оси, например x, а вокруг нескольких сразу. Это вырезка из кода как я заметил не очень здорово прокомметирована поэтому, если есть вопросы то пиши…
Код

    angleX = angleX * PI / 180  ' rad from angle for x axis
    angleY = angleY * PI / 180  ' rad from angle for y axis
    angleZ = angleZ * PI / 180  ' rad from angle for z axis
    For i = 0 To object.pointsq
    
        DrawPoint object.pointCol(i), object.nocolor
        
        object.pointCol(i).X = object.pointCol(i).X - object.center.X
        object.pointCol(i).Y = object.pointCol(i).Y - object.center.Y
        object.pointCol(i).Z = object.pointCol(i).Z - object.center.Z
              
        newpoint.X = object.pointCol(i).X * _
                     Cos(angleZ) * Cos(angleY) _
                     - object.pointCol(i).Z * _
                     Cos(angleZ) * Sin(angleY) _
                     + object.pointCol(i).Y * _
                     Sin(angleZ)
        newpoint.Y = object.pointCol(i).X * _
                    (-Cos(angleX) * Sin(angleZ) * Cos(angleY) _
                     + Sin(angleX) * Sin(angleY)) _
                     + object.pointCol(i).Z * _
                     (Cos(angleX) * Sin(angleZ) * Sin(angleY) _
                     + Sin(angleX) * Cos(angleY)) _
                     + object.pointCol(i).Y * _
                     Cos(angleX) * Cos(angleZ)
        newpoint.Z = object.pointCol(i).X * _
                    (Sin(angleX) * Sin(angleZ) * Cos(angleY) _
                     + Cos(angleX) * Sin(angleY)) _
                     + object.pointCol(i).Z * _
                    (-Sin(angleX) * Sin(angleZ) * Sin(angleY) _
                     + Cos(angleX) * Cos(angleY)) _
                     - object.pointCol(i).Y * _
                     Sin(angleX) * Cos(angleZ)
                  
        newpoint.X = newpoint.X + object.center.X
        newpoint.Y = newpoint.Y + object.center.Y
        newpoint.Z = newpoint.Z + object.center.Z
        
        object.pointCol(i) = newpoint
        DrawPoint object.pointCol(i), object.color
        DoEvents    ' allow other processes
    Next
    RotatePObject3D = object



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
DENNN
Дата 25.10.2005, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Аффинные преобразования вас спасут.
PM ICQ   Вверх
Gigabyte
Дата 25.10.2005, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Студент-халявщик
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 1.11.2004
Где: ПЫтер

Репутация: нет
Всего: 3



Цитата
А ты напиши откуда ты  Просто интересно...

в смысле откуда из какого города? С-Пб!!!!


--------------------

user posted image
user posted image
PM MAIL ICQ   Вверх
Gigabyte
Дата 25.10.2005, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Студент-халявщик
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 1.11.2004
Где: ПЫтер

Репутация: нет
Всего: 3



cardinal
Не знаю рочему но когда я переписал этот код на Дельфи то у меня ничего не работает
написал вроде правильно???


--------------------

user posted image
user posted image
PM MAIL ICQ   Вверх
cardinal
Дата 25.10.2005, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата(Gigabyte @ 25.10.2005, 10:06)
смысле откуда из какого города? С-Пб!!!!

Угу...

Что не работает? Координаты точек не те или что?


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Гость_Bob
Дата 25.10.2005, 22:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Gigabyte @ 20.10.2005, 14:26)
у меня есть формула вращения двух мерного тела вокруг оси

x = xo + r * cos(alpha + beta)
y = yo + r * sin(alpha + beta)

xo,yo - центр поворота,
r - длина отрезка OM
O - это центр поворота,
M - некая точк
угол alpha между отрезком OM и горизонталью
beta-угол поворота

а мне нужно вращать тело вокруг центра(задаётся 3 угла и координаты точки надо найти новые координаты точки)

В любом случае вращение лучше делать с помощью матриц.

Вращение 2д тела может выглядеть так:

Матрица (3 на 3) вращения:
cos® -sin® 0
sin® cos® 0
0 0 1

где r - угол поворода.

Вектор выглядит так:
x y 1

где х и у координаты одной точки.

Если этот вектор умножить на матрицу, то в результате получится вектор с новыми координатами х и у.

Для трехмерного вращения надо использовать матрицу 4 на 4 и вектор:
x y z 1

Вот например функция умножения матрицы (4 на 4) на вектор из 4 элементов:
Код

typedef float MATRIX_4x4[4][4];

typedef float VECTOR_4[4];

void Mult(VECTOR_4 v,MATRIX_4x4 m)
{
  VECTOR_4 t={0};
  for(int i=0;i<4;i++)
    for(int j=0;j<4;j++)
      t[i]=t[i]+v[j]*m[j][i];

  for(int i=0;i<4;i++)
    v[i]=t[i];
}



  Вверх
Gigabyte
Дата 26.10.2005, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Студент-халявщик
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 1.11.2004
Где: ПЫтер

Репутация: нет
Всего: 3



кто нибудь может написать пример с матрицей не на си а в виде алгоритма или на Дельфи
а то я не очень разобрался?!?! smile
cardinal у меня координаты точки вообще левые а при некоторых углах совсем не меняются
не могу понять в чем дело


--------------------

user posted image
user posted image
PM MAIL ICQ   Вверх
cardinal
Дата 26.10.2005, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата(Gigabyte @ 26.10.2005, 04:40)
cardinal у меня координаты точки вообще левые а при некоторых углах совсем не меняются
не могу понять в чем дело

Построчно пройдись по коду и посмотри, что не так работает как ты ожидаешь...
Добавлено @ 19:49
Цитата(Gigabyte @ 26.10.2005, 04:40)
кто нибудь может написать пример с матрицей не на си а в виде алгоритма или на Дельфи

Может это поможет...
http://www.gamedev.ru/coding/20614.shtml


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Gigabyte
Дата 31.10.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Студент-халявщик
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 1.11.2004
Где: ПЫтер

Репутация: нет
Всего: 3



Хоть кто-то может написать формулу для вычисления новых координат хотябы в плоскости,
а не пример!!!!!! smile smile


--------------------

user posted image
user posted image
PM MAIL ICQ   Вверх
DENNN
Дата 31.10.2005, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Цитата(Gigabyte @ 31.10.2005, 14:29)
Хоть кто-то может написать формулу для вычисления новых координат хотябы в плоскости

Специально для тех, кто плохо учился в школе и не всостоянии прочитать учебник геометрии:
1) поворот на угол альфа вокруг точки с коорд. (0;0)
Цитата

xn=x*cos( alfa )
yn=y*sin( alfa )

2)параллельный перенос плоской геометрической фигуры на вектор (x1;y1)
Цитата

xn=x+x1
yn=y+y1


Сложно? Для 3-хмерки важно понимать как вообще можно задать поворот фигуры: относительно осей, либо вектора. Использование карандаша, бумажки, линейки и собственной головы поможет разобраться в том, что же вам все таки нужно (читай поможет вывести необходимые для данной задачи формулы).
PM ICQ   Вверх
yaja
Дата 31.10.2005, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 30.3.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Нашел исходник темы, где мне приходилось делать преобразование координат(в частности и поворот вокруг оси), делал посредством матриц. Тоесть дана единичная матрица 4x4 (считай базис в пространстве), тогда после поворота, он будет выглядить так
Код


Matrix  Matrix :: rotate ( const Vector& axis, float angle ) {
  Matrix res ( 1 );
  float  cosine = cos ( angle );
  float  sine   = sin ( angle );

  res.x [0][0] = axis.x * axis.x + ( 1 - axis.x * axis.x ) * cosine;
  res.x [1][0] = axis.x * axis.y * ( 1 - cosine ) + axis.z * sine;
  res.x [2][0] = axis.x * axis.z * ( 1 - cosine ) - axis.y * sine;
  res.x [3][0] = 0;

  res.x [0][1] = axis.x * axis.y * ( 1 - cosine ) - axis.z * sine;
  res.x [1][1] = axis.y * axis.y + ( 1 - axis.y * axis.y ) * cosine;
  res.x [2][1] = axis.y * axis.z * ( 1 - cosine ) + axis.x * sine;
  res.x [3][1] = 0;

  res.x [0][2] = axis.x * axis.z * ( 1 - cosine ) + axis.y * sine;
  res.x [1][2] = axis.y * axis.z * ( 1 - cosine ) - axis.x * sine;
  res.x [2][2] = axis.z * axis.z + ( 1 - axis.z * axis.z ) * cosine;
  res.x [3][2] = 0;

  res.x [0][3] = 0;
  res.x [1][3] = 0;
  res.x [2][3] = 0;
  res.x [3][3] = 1;

  return res;
}


Дело было давно, ничего не помню, особо разбираться откуда это, влом smile smile
Чтобы узнать координаты вектора после поворота, достаточно умножить его на полученную матрицу
PM MAIL   Вверх
yaja
Дата 1.11.2005, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 30.3.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



ПРочитал, что на практике для поворотов чаще всего используют квантерионы (читай 4-х векторы с особым правилом умножения). Квантерион выглядит, как q = [s, v], где s - скаляр, v - вектор.

[s1, v1] * [s2, v2] = [s1 * s2 - <v1, v2>, s1 * v2 + s2 * v1 + v1Xv2]
q^-1 = (1 / ||q||)^2 * [s, -v]

Тогда, чтобы повернуть вектор v (тоесть квантерион [0, v]) используя операции с квантерионами, надо посчитать
v` = Rot(v) = q * v * q^-1
q - квантерион поворота вокруг оси (x, y, z) на угл y,
q = [cos(y / 2), sin(y / 2) * (x, y, z)]
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0752 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.