Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2010, 13:56   #11
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Altera Посмотреть сообщение
... но как-то двигается он не правильно: если куб перевернуть, то он крутится не вправо а влево. При запуске, когда куб в исходной положении он, при нажатии "вправо", крутится почему-то по часовой стрелке а не по горизонтале, к тому же с матрицами как-то возни много. Попробую конечно азобраться...

Вот по вертикале всегда вращается правильно
Я немного "упростил", поэтому так вращается. Вообще-то нужно делать отдельную матрицу для хранения поворотов-перемещений. Во вложении исправленный вариант.

Цитата:
Помое-му ничего сложного в моих математических выкладках нету. Вот что не понятного например?
Это я про свои выкладки. Поскольку ранее так не делал, попробовал понять для чего нужно приводить к сферическим координатам чтобы получить проекцию. В общем, как я уже сказал, это ни к чему не привело и поэтому исправить Ваш код я не смог.
Вложения
Тип файла: rar test3D.rar (172.7 Кб, 84 просмотров)

Последний раз редактировалось alexBlack; 29.06.2010 в 14:05.
alexBlack вне форума Ответить с цитированием
Старый 29.06.2010, 23:07   #12
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от alexBlack
Я немного "упростил", поэтому так вращается. Вообще-то нужно делать отдельную матрицу для хранения поворотов-перемещений. Во вложении исправленный вариант.
Ясно, я про то, что он вращается по оси X а не по очи Z. А по оси Y вращается правильно...

В матрицах мне как-то вообще трудно разобраться. Может пояснишь код немного? Я ещё не проходил математические матрицы. И вообще в ряд ли пройду

Последний раз редактировалось Altera; 29.06.2010 в 23:13.
Altera вне форума Ответить с цитированием
Старый 30.06.2010, 08:47   #13
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Кратко по коду.
Points3D - координаты вершин куба (на четвертую координату можно не обращать внимание - всегда 1). В этом массиве координаты никогда не меняются.

DrawScene; - вызов PointsTo2D - приведение координат к двумерным.
Затем просто соединяем вершины чтобы получить куб.
----
Немного теории. Любые преобразования точки в пространстве - это умножение координат точки на матрицу. Например, возьмем матрицу поворота вокруг оси OX

Код:
 | 1 0      0      0 |
 | 0 cos a  sin a  0 | = M
 | 0 -sin a cos a  0 |
 | 0 0      0      1 |
Умножим точку на матрицу - получим координаты точки после поворота:

|x, y, z, 1| * M = |x, y*cos a -z*sin a, y*sin a + z cos a, 1|

знакомые формулы, не правда ли ? Прелесть в том, что в матричной форме не нужно делать явных операций с тригонометрическими формулами. Любое преобразование в пространстве получается простым умножением матриц. Например, если нужно сделать поворот покруг оси OX, затем перенос вдоль оси OY, берем две матрицы - матрицу поворота MRox и матрицу переноса MToy и перемножаем их. Теперь достаточно умножить координаты точек на полученную матрицу и получим новые координаты точек после выбранных трансформаций.

Очень доступно написано здесь
Компьютерная графика. Динамика, реалистические изображения
-----
В коде RMatrix - это матрица сделанных поворотов.
При нажатие клавиши (например, Up) создаем матрицу поворота:

MatrixRx(B, pi/36);

и добавляем ее к уже сделанным поворотам умножая текущую матрицу:

RMatrix := M4_Mul_M4(RMatrix, B);

-----
Матрицу можно было бы сразу применить ко всем точкам Points3D, но тогда
неудобно будет добавлять новые точки аттрактора.
-----
Вернемся к PointsTo2D. Здесь мы создаем матрицу масштабирования.
Затем умножаем ее на матрицу поворотов RMatrix. Наконец, умножаем ее же на матрицу, задающую перспективу. Таким образом получена матрица A для преобразования координат. Теперь умножаем координаты всех точек на эту матрицу и получаем координаты точек на проекции.
alexBlack вне форума Ответить с цитированием
Старый 30.06.2010, 18:43   #14
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

А почему матрица размером 4x4 а не 3х3?
Переделал на 3х3, нормально всё. Не силён я всё таки в тригонометрии.

У тебя там 10^6 этих долбаных матриц и 10^8 их всевозможных перемножений. Ничего понять не могу.

Перспективу я тоже выпилил что бы на нервы не действовало. Но всё равно разобраться не могу.

Последний раз редактировалось Altera; 30.06.2010 в 19:20.
Altera вне форума Ответить с цитированием
Старый 01.07.2010, 20:27   #15
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

arcTan(Y/X) при X = 0, тоже материться будет)))
юзай arcTan2(Y,X) - там на сколько я помню все предусмотрено...

С матрицами и вправду проще... Но для человека который не изучал линейную алгебру и геометрию проще будет с тригонометрией разобраться. Во всяком случае мне было проще.
Kostia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описание и обсуждение шаблонов проектирования (паттерны) atomicxp Общие вопросы по программированию, компьютерный форум 35 20.01.2018 21:42
использование платного ПО для проектирования Domanoff Свободное общение 4 11.06.2010 13:33
Волновой алгоритм (алгоритм Ли) MrRockchip Общие вопросы C/C++ 4 10.05.2010 13:26
Case инструменты проектирования. Levsha100 Свободное общение 5 06.12.2009 03:12
Занесение данных в StringGrid на этапе проектирования формы program123 Компоненты Delphi 2 16.02.2009 23:00