![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 16.01.2009
Сообщений: 2
|
![]()
Мне нужно написать курсовую на c++ используя WinAPI. Курсовая трехмерные кубики с картинками.
Нужно: 1. Используя координаты такого типа Это координаты вершин A[0][0]=-100; A[0][1]=100; A[0][2]=-100; A[0][3]=1; A[1][0]=100; A[1][1]=100; A[1][2]=-100; A[1][3]=1; A[2][0]=100; A[2][1]=100; A[2][2]=100; A[2][3]=1; A[3][0]=-100; A[3][1]=100; A[3][2]=100; A[3][3]=1; A[10][0]=-100; A[10][1]=-100; A[10][2]=-100; A[10][3]=1; A[15][0]=100; A[15][1]=-100; A[15][2]=-100; A[15][3]=1; A[20][0]=100; A[20][1]=-100; A[20][2]=100; A[20][3]=1; A[25][0]=-100; A[25][1]=-100; A[25][2]=100; A[25][3]=1; как понять эти координаты? Здесь рисует куб, но выглядит он не очень (верхняя крышка в виде трапеции), надо сделать её параллелограммом. Рисуем соединяя вершины, образуя грани. E[0][0]=3; E[0][1]=0; E[1][0]=0; E[1][1]=1; E[2][0]=1; E[2][1]=2; E[3][0]=2; E[3][1]=3; E[4][0]=3; E[4][1]=25; E[5][0]=2; E[5][1]=20; E[6][0]=1; E[6][1]=15; E[7][0]=0; E[7][1]=10; E[8][0]=25; E[8][1]=10; E[9][0]=10; E[9][1]=15; E[10][0]=15; E[10][1]=20; E[11][0]=20; E[11][1]=25; Как с помощью них нарисовать нужный нам куб? 2. И нарисую я кубик, и как мне к нему приклеить картинки. Загрузить я их могу. Как исказить изображение чтобы, оно стало параллелограммом(StretchBlt-?). |
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,087
|
![]()
Это вероятно так называемые однородные координаты А(x,y,z,1)
Почитайте литературу про преобразования в трехмерном пространстве. Например, посмотрите в книге Шикина и Борескова (названия к сожалению не помню). Для отсечения невидимых граней самый простой алгоритм z-буфера. Цитата:
"Сканируем" горизонтальными линиями грани куба. Для каждой точки этой линии находим соответствующую точку в битмапе и выводим пиксель соответствующего цвета. И так закрашиваем каждую грань. Тоже в литературе должен быть описан. Двумя словами так это всё не опишешь ![]() |
|
![]() |
![]() |
![]() |
#3 |
Новичок
Джуниор
Регистрация: 16.01.2009
Сообщений: 2
|
![]()
То что ты написал(pu4koff), это метод построчного сканирования. Я искала в интернете. Но не смогла найти код, хотя бы примерный код на си++(нужно без использования классов).
1. Как вообще просканировать куб по линиям? С помощью каких функций? 2. Есть ли программный код этого метода? Если да то где его взять? 3. нужно ли использовать следующую функцию? Использование GetDIBits Приведённый в этой статье код использует GetDIBits, поэтому работает довольно быстро, так как использует 32-битное представление битмапа. Все операции производятся в локальной памяти в отличие от медленных вызовов API функций GetPixel и BitBlt. pBGR MyGetDibBits(HDC hdcSrc, HBITMAP hBmpSrc, int nx, int ny) { BITMAPINFO bi; BOOL bRes; pBGR buf; bi.bmiHeader.biSize = sizeof(bi.bmiHeader); bi.bmiHeader.biWidth = nx; bi.bmiHeader.biHeight = - ny; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = BI_RGB; bi.bmiHeader.biSizeImage = nx * 4 * ny; bi.bmiHeader.biClrUsed = 0; bi.bmiHeader.biClrImportant = 0; buf = (pBGR) malloc(nx * 4 * ny); bRes = GetDIBits(hdcSrc, hBmpSrc, 0, ny, buf, &bi, DIB_RGB_COLORS); if (!bRes) { free(buf); buf = 0; } return buf; } 4. Читала "компьютерная графика. Полигональные модели" - Шикина, Борескова. Там описана процедура вставки отрезка в упорядоченный список отрезков текущей строки.(Вариант построчного сканирования: метод S-буфера). Для каждой строки экрана поддерживается список отрезков граней, задающий фактически для каждого пиксела видимую в этом пикселе грань. Но суть в том, что пример пограммы написан с использованием классов, а мой препод настоятельно рекомендовал классы не использовать. 4.1 Можно ли как-нибудь реализовать без классов. И как? 4.2 Если честно этот код мне немного непонятен. 5. Если можно скиньте какую-нибудь ссылочку, где можно еще почитать? |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,087
|
![]()
Я уже не помню где я искал инфу в своё время. Только я делал без текстур. Только с освещением было дело. Возможно на www.algolist.ru что-то было про это.
3D модели (в данном случае кубы) состоят из полигонов. Для простоты возьмём полигон, состоящий из 3 рёбер, соединяющих 3 вершины. Треугольный в общем. Для каждой вершины даны координаты в 3D пространстве. Расчитываем для них экранные 2D координаты. Сортируем их по возрастанию по экранной координате y. Так у нас точка A будет самая верхняя, точка C - самая нижняя. B - по середине. горизонтальной линией, проходящей через точку B разбиваем этот треугольник на 2: ABO и CBO см. рисунок. Для каждой точки находим соответствующие им координаты на текстуре. Допустим вершине A соответствует пиксель [10;5] на картинке и т.д. Дальше по отдельности проходим по этим двум треугольникам горизонтальными сканирующими линиями и посредством интерполяции находим соответствие каждой из точек треугольника координаты текстуры. примерный код: x.screen - координата вершины x на экране Код:
![]() |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
проблема с картинками | sava28 | HTML и CSS | 3 | 05.08.2008 16:23 |
Кубики. Visual Prolog. | VIP52 | Помощь студентам | 1 | 30.05.2008 15:36 |
бд с картинками | TaTT DoGG | БД в Delphi | 3 | 28.04.2008 08:21 |
Помогите студенту МГКИТ задача про кубики | plexter | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 10.06.2007 16:07 |
про кубики | ара | Помощь студентам | 1 | 14.05.2007 07:29 |