![]() |
|
Модераторы: 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. |