Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 3D вращение, 3D вращение 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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