![]() |
Модераторы: Rickert |
![]() ![]() ![]() |
|
AVRUDOI |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 29.8.2007 Репутация: нет Всего: нет |
Здраствуйте. Есть желание написать программу вращающегося куба по оси Y. Сам немогу. Нехвотает знаний если у каго есть желание помочь? Хочу написать на Делфи 7.
Это сообщение отредактировал(а) AVRUDOI - 22.9.2007, 12:59 |
|||
|
||||
Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: 2 Всего: 4 |
А кубег какой должен быть: проволочный, со сплошной закраской, с текстурой?
И как вы его хотите рисовать: с помощью методов tcanvas или Directx или OpenGL? --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
|||
|
||||
AVRUDOI |
|
|||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 29.8.2007 Репутация: нет Всего: нет |
Скорея всего с помощью методов tconves. Мне больше по душе этот метод. Он позволяет прочуствовать на линиях и точка красоту 3D. А потом хоть квейк пиши.
![]() Это сообщение отредактировал(а) AVRUDOI - 27.9.2007, 12:09 |
|||
|
||||
Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: 2 Всего: 4 |
Значит так, выкладываю код.
Нужно создать форму с таймером и весь код модуля unit1 заменить на нижеследующий. Сейчас нет времени писать подробные комментарии, это я наверное на выходных сделаю, но про некоторые особенности напишу сейчас. Прграмма рисует вращающийся куб, режим закраски можно менять клавишей "пробел". Прграмма поддерживает отрисовку и анимацию произвольных полигональных объектов стандартными средствами Delphi (без использования DirectX и OpenGL). Можно изменять позицию объектов и камеры. Не успел реализовать отсечение невидимых треугольников, z-buffer, направленные источники света. Возможно добавлю позднее. Программа получилась большая, т.к. претендует на универсальность, а не только на отрисовку конкретно вращающегося куба. Собственно код:
ЗЫ Практической ценности пример ИМХО не представляет, лучше изучать dx или opengl. ЗЗЫ Создание вращающегося куба и написание серьезного 3d приложения (игры) это две ОГРОМНЫЕ разницы. ЗЗЗЫ А может это вам в школе по предмету "Информатика" задали? ![]() Это сообщение отредактировал(а) Чупакабро - 27.9.2007, 20:57 --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
Канвас красивее OGL & D3D
![]() Мда... И вообще, тема должна быть в Дельфи, в таком случае. [...уходит ворча...] -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
fse |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 28.9.2007 Где: г. Рязань Репутация: нет Всего: 1 |
Всем привет!
AVRUDOI, похвально стремление докопаться до сути 3д, правда на канвасе мало кто что рисует трёхмерного;) Предложу и свой вариант кода. Чупакабро написал, видимо, рабочий код, но для новичка в этом деле сложный. По крайней мере разбираться можно долго ![]()
Вся дальнейшая работа сводится к повороту на нужные углы соответствующих вершин куба. И рисовать грани между соответствующими в кубе точками. Могу посоветовать: Если пересчитывается много точек, то создай таблицу sin(ox, oy, oz) и cos(ox, oy, oz), а не вычисляй их постоянно. А реально, эти формулы получаются как раз из перемножения матриц поворота на вектор, то, что сделано у Чупакабро. Это касательно поворотов. Перспективу можно строить при помощи косоугольных систем координат. Если с заливкой рисовать, то после поворотов всех точек нужно делать тест глубины (грубо говоря, сортировка точек по удалённости от проекционной плоскости). Советую почитать: Аналитическая геометрия (вышка) Компьютерная графика (статьи в инете) Удачи;) |
|||
|
||||
Чупакабро |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: 2 Всего: 4 |
А вы пробовали запускать? (заискивающе улыбается)
Дык я скоро комментарии подготовлю. Хотя ведь и не факт, что человеку реально нужно разобраться. Я сам-то там половину методом научного тыка написал, например, нужно ли перемножать матрицу сдвига на матрицу поворота или в обратном порядке, чтобы получить нормальную картинку. Ну а вообще вращающийся куб иногда рисуют даже в школе на информатике, хотя к 3d это имеет весьма отдаленное отношение. Зато код получается простой, это да. Да, кстати... fse, у вас получается, что куб вращается вокруг начала координат. В принципе, автору темы наверно это и нужно, но если реализовывать поворот вокруг произвольной оси, то код усложняется. То же самое с перспективой. Это как раз-таки задачка посложнее, чем само по себе вращение куба. А если сюда же добавить эмуляцию пиксельных шейдеров... ![]() Нет нет. Все правильно это именно программирование графики, а перевести все это на C, например, дело недолгое, т.к. здесь одна математика. Это сообщение отредактировал(а) Чупакабро - 28.9.2007, 18:29 --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
||||
|
|||||
fse |
|
||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 28.9.2007 Где: г. Рязань Репутация: нет Всего: 1 |
Чупакабро, оно так всё, если делать по науке - то конечно, матрицы. Хотя на уровне формул тоже нужно понимать.
Не согласен, вот как будет выглядеть процедура поворота... Как было
Как стало
Т.е. мы просто перевели точку к другому началу координат простым перемещением, повернули точку вокруг нового начала координат, потом переместили обратно! ![]() На самом деле, в тех задачах, что сейчас у меня, удобно работать именно не с матрицами, а с формулами, поэтому я пишу именно так. При этом, вместо матрицы смещения используется просто суммирование координат. Масштабирование: умножение координат на коэффициенты. При таком подходе существенно возрастает скорость, т.к. мы отходим от не столь быстрой операции умножения матриц.
Опять же, спорный вопрос ;) Перспектива - это просто перенос вектора в косоугольную систему координат. Если есть оси ox, oy, oz (единичные вектора) в новой косоугольной СК; x, y, z - координаты вектора; их нужно перевести в эту новую СК. При этом нужно просто найти проекции вектора каждую ось новой СК. Эти проекции численно будут являться координатами в перспективе. Находится тремя операциями скалярного произведения, что весьма быстро ![]() Вот, это касательно математики. Хотя, отлично понимаю, иногда этим нечего забивать голову, можно оперировать просто шаблонными матрицами. Это выгодно может быть по производительности только в случае, когда над точкой производятся очень сложные модификации. Вроде большой серии поворотов, перемещений, масштабирования и т.д. При этом, можно не умножать вектор на каждую матрицу, а просчитать сначала матрицу всех произведений матриц модификации. А потом умножать каждую точку на кэшированную матрицу. "добавить эмуляцию пиксельных шейдеров" - ууух, я и словей таких не знаю ![]()
Хм, а это всё зависет от нужного нам результата ;) |
||||||||||
|
|||||||||||
Чупакабро |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: 2 Всего: 4 |
Дык. Это я и имел в виду под усложнением кода) У вас получилось на 6 строчек больше ![]()
Ну, может я не так выразился. Имелось в виду выполнение операций над пикселями (как растерезация, так и всякие эффекты) центральным процессором, а не GPU. --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
||||
|
|||||
AVRUDOI |
|
||||
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 29.8.2007 Репутация: нет Всего: нет |
Здраствуйте. Поидеи все вроде номально. НО вот пробелемма что код нехочет работать с Делфи 7. Пробемма соостоит в том что происхотит перегрузка памети т.е. код выходит за пределы выделенной помети. Пока не могу понять где. Увожаемая "Чупокабра" немогли бы подсказать где может произойти перегрузка. ![]() |
||||
|
|||||
Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: 2 Всего: 4 |
Сильно сказано! Не понял: что значит "код твыходит за пределы выделенной памяти"? А в других версиях Delphi работает? У меня в седьмой все нормально... --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
|||
|
||||
fse |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 28.9.2007 Где: г. Рязань Репутация: нет Всего: 1 |
Всем привет!
Чупакабро, код запустил, симпотично ![]() Правда сложные многоугольники без теста глубины чудить будут ужасно. Я когда-то даже поддержал в проекте GDI-3Д своего загрузку моделей из максовских файлов и произвольное освещение. Как положено, цвет считался по проекции на вектор нормали полигона! Без теста глубины получилось плачевно ![]() ![]() А у AVRUDOI пологаю что знаю в чём проблема! По шагам, что делать в D7: - Создаёшь новый проект - Копипастишь напрямую - Ctrl-F9 Она спросит "удалить ли описанный Timer1", говоришь да Помещаешь его на форму Создаёшь из среды для таймера OnTimer Для формы OnCreate и OnKeyPress. И тогда всё заработает. Иначе программа обращается к объектам backbitmap и cube, которые не создаются, т.к. не вызывается OnCreate. И тогда аксес невалялся ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |