2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Проблемы с 3D граффикой
Сообщение25.10.2009, 01:52 


06/10/09
63
Здравствуйте. После того, как у меня получилось закрасить выпуклый произвольный четырехугольник и получить что-то наподобие поверхности, захотелось закрасить его текстурой. Но тут возникли проблемы с ее отображением. Если бы расстояние до плоскости было бы одинаковым, то можно было бы закрасить данную фигуру точно также, просто изменяя цвет точек в соответствии с вертикальным и горизонтальным коэфициентами. Но все на так просто, расстояние меняется и оно нелинейно, поэтому и текстура будет накладываться неравномерно. Для того, что-бы ее правильно отобразить, нужно найти формулу для одной из задач:
Плоскость $\alpha$ проходит через 3 точки в пространстве: A(Xa,Ya,Za), B(Xb,Yb,Zb) и C(Xc,Yc,Zc). Также, имеется точка P с координатами Xp, Yp, Zp. На плоскости $\alpha$ нужно найти координаты точки, из которой нормаль к данной плоскости проходит через точку P.
Или другая задача:
Дана та же плоскость $\alpha$, проходящая через те же точки А, В, С. Из точки Р в пространстве выпущен единичный вектор, с произвольным направлением. Надо найти координаты точки, лежащей на пересечении продолжения вектора P и плоскости $\alpha$
Или хотя-бы подскажите, как эту проблему неравномерного наложения текстур решили разработчики...

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение25.10.2009, 02:21 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Вот более-менее адекватная ссылка: http://www.codenet.ru/progr/video/tex/index.php

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение25.10.2009, 11:03 


31/08/09
183
Выкладывай сорсы здесь, пожалуйста, чтобы и другие могли посмотреть и поучиться.

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение25.10.2009, 16:38 
Заслуженный участник


26/07/09
1559
Алматы
2Qx15(RUS)
Цитата:
Но все на так просто, расстояние меняется и оно нелинейно

Это же четырехугольник, полигон. Расстояние от него до наблюдателя меняется линейно при скольжении по полигону.

Цитата:
поэтому и текстура будет накладываться неравномерно

Что значит неравномерно? Картинка "натягивается" на полигон, аффинно искажаясь при этом, так и должно быть, а как же иначе?

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение25.10.2009, 16:52 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Circiter в сообщении #254791 писал(а):
Что значит неравномерно? Картинка "натягивается" на полигон, аффинно искажаясь при этом

Проективно искажается вроде бы.

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение25.10.2009, 19:33 


06/10/09
63
Circiter в сообщении #254791 писал(а):
2Qx15(RUS)...Это же четырехугольник, полигон. Расстояние от него до наблюдателя меняется линейно при скольжении по полигону....
...Что значит неравномерно? Картинка "натягивается" на полигон, аффинно искажаясь при этом, так и должно быть, а как же иначе?...

Я тоже раньше думал, что земля кваднатная :)
Мои выводы могут быть и неправильными, но давайте начнем с простого:
Возьмите линейку и ее конец приложите к глазу так, что-бы деления были видны. Посмотрите на них: Мы знаем, что они в пространстве равноудалены, но здесь мы видим, что по мере удаления угол между ними уменьшается. Если бы в программе я линейно натянул текстуру на эту "линейку", то получил-бы одинаковый угол между ними, что как понятно, противоречит реальности. Аффинное искажение тут не подойдет, нужно что-то другое...
Xaositect, спасибо за ссылку, буду разбираться...
Завтра перепишу нормально функцию заливки одним цветом и выложу

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение25.10.2009, 19:42 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Qx15(RUS)
А вам это зачем нужно? Для самообразования? Если нет, то может быть легче воспользоваться готовым решением (OpenGL)?

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение25.10.2009, 19:58 


06/10/09
63
Я просто обожаю "изобретать велосипед" :) Пользоваться готовым решением не собираюсь, хочется самому понять, как это работает. Вообще хочется это все на ассемблере написать, но пока не могу понять это непростой язык. Я бы его понял, если компиляторы работали бы. Кстати, можете сказать как лучше, MASM, FASM или TASM? Вообще все переставил, скопировал прогу "Hello world", превратил в exe файл и запустил. А там.... Процессор послал меня на 3 буквы написав: ошибка
AX:3e4а....бла бла бла... Вообщем если бы хоть что-то заработало, оттолкнулся бы от это и ...понеслась... проги на Ассемблере как из пулемета... А так реально у меня тока VB есть, поэтому и пишу на нем.
Хотя эсли кто-то знает хотя-бы Delphi, Подскажите, как полному чайнику написать там хоть что-нибудь, а он мне все мои строчки обругал...

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение25.10.2009, 22:15 
Заслуженный участник


26/07/09
1559
Алматы
2Qx15(RUS)
Цитата:
Для того, что-бы ее правильно отобразить, нужно найти формулу для одной из задач: ...

Составьте соответствующие системы уравнений и решайте. Элементарно, но, боюсь, что вам это почти не пригодится.

Цитата:
Я тоже раньше думал, что земля кваднатная

Неостроумно. Наверняка вы в школе плохо учитесь. :) Да и про четырехугольник вы сами заговорили.

Цитата:
Возьмите линейку и ее конец приложите к глазу так, что-бы деления были видны

Да не буду я конец линейки к глазу прикладывать, опасно. :) Если серьезно, то откуда мне было знать, что вы имеете ввиду под расстоянием до плоскости? Повторяю, расстояние до плоскости от наблюдателя (i.e от плоскости экрана) в моделируемом трехмерном пространстве меняется линейно при сканировании полигона. Этот очень важный факт используется при текстурировании в реальных приложениях и позволяет получать коодинаты очередной точки полигона всего за несколько арифметических операций (без решения систем громоздких уравнений).

Перспективные искажения получаются на одном из последних этапах рендеринга путем умножения вектора на матрицу перспективной проекции.

2Xaositect
Цитата:
Проективно искажается вроде бы.

Ну это уже в конечном итоге. Я писал про то как картинка натягивается именно на полигон, т.е. на многоугольник в трехмерном пространстве (а не на его экранный образ). Это достигается действительно лишь простыми аффинными преобразованиями, а потом уже полученные точки домножаются на перспективную матрицу.

P.S.: На самом деле это очень широкая тема и существуют гораздо более изощренные методы текстурирования.

-- Пн окт 26, 2009 05:11:45 --

2Qx15(RUS)
Цитата:
Вообще хочется это все на ассемблере написать, но пока не могу понять это непростой язык. Я бы его понял, если компиляторы работали бы. Кстати, можете сказать как лучше, MASM, FASM или TASM?

Думаю, вам стоит полазить по замечательному ресурсу http://wasm.ru/, там есть в том числе информация о написании приложений трехмерной графики на ассемблере.

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение26.10.2009, 20:00 


06/10/09
63
Circiter в сообщении #254938 писал(а):
2Qx15(RUS)
...Составьте соответствующие системы уравнений и решайте. Элементарно, но, боюсь, что вам это почти не пригодится...
...Неостроумно. Наверняка вы в школе плохо учитесь...
...Да не буду я конец линейки к глазу прикладывать, опасно....Повторяю, расстояние до плоскости от наблюдателя (i.e от плоскости экрана) в моделируемом трехмерном пространстве меняется линейно при сканировании полигона...

1)Составить соответствующие системы уравнений и решить? Circiter, я в 11 классе, только недавно изучали производные, а вы хотите чтобы я прям сейчас на одной коленке накатал эти трехмерные уравнения и одной левой(а точнее правой) решил их? Да я год назад пытался это сделать, но вот что-то они уж очень большими получились. Вот я и хочу узнать способ по проще.
2) Плохая шутка - не повод для глубоких рассуждений...Учусь я на "4-5",иначе мне нечего было делать на таких форумах...И еще, если интересно, я так думал в 6 лет.
3)Это не опасно. Я вас не заставляю тыкать линейкой в глаз или у вас руки тресутся?
И еще тогда объясните это:
Изображение
И где тут расстояние линейно изменяется?!
-----------------------------------------------------------------------------------------
По поводу ссылки http:[url]//www.codenet.ru/progr/video/tex/index.php[/url]
Вообще подскажите, где есть больше инфы по этой теме?? Вот начал с самого первого уравнения:
Цитата:
Для точек (x,y,z), проекцией которых является (sx,sy) имеем:
Код:
sx = xSize/2+x*dist/(z+dist),
sy = ySize/2-y*dist/(z+dist)

Я понял, что это формула вычисления проекция точки на экране, используя координаты точки.
Всего 2 строки! Я эту формулу давно искал. Подставил в программу, и....получил такую ****... она вообще неправильная...
И вот автор статьи расписывает уравнения, преобразует их,подробно все считает, считает и:
Цитата:
...Осталось немного, подставить Mx = Bx-Ax и так далее, а потом подставить эти a и b в формулы для Du и Dv. В процессе подстановок что-то сократится, что-то упростится, но формулы для Du и Dv все равно получатся длиной в несколько строк.

И приходит он к следующему:
Цитата:
Код:
u = (C1*sx+C2*sy+C3) / (C4*sx+C5*sy+C6),
v = (C7*sx+C8*sy+C9) / (C4*sx+C5*sy+C6),

причем C1, ..., C9 - просто какие-то коэффициенты, зависящие от грани

Я просто угараю от С1-С9 :) И как мне их найти??? Может кто-то напишет?
Я гуглил, гуглил, так ничего и не нашел :(
----------------------------------------------------------------------------------------
Как и обещал, процедура рисования одноцветного четырехугольника, обычным строковым способом. Демонстративный вариант, т.е. понятный человеку:
код: [ скачать ] [ спрятать ]
Используется синтаксис Visual Basic
Private Sub DrawQPlane()
P1X = VSX(0) 'VSX, VSY - массив с проекциями точек на экран
P2X = VSX(1)
P3X = VSX(2)
P4X = VSX(3)
P1Y = VSY(0)
P2Y = VSY(1)
P3Y = VSY(2)
P4Y = VSY(3)
If P1Y < P2Y Then 'Сортировка Вершин
   T = P1X: P1X = P2X: P2X = T
    T = P1Y: P1Y = P2Y: P2Y = T
End If
If P1Y < P3Y Then
    T = P1X: P1X = P3X: P3X = T
    T = P1Y: P1Y = P3Y: P3Y = T
End If
If P1Y < P4Y Then
    T = P1X: P1X = P4X: P4X = T
    T = P1Y: P1Y = P4Y: P4Y = T
End If
If P2Y < P4Y Then
    T = P2X: P2X = P4X: P4X = T
    T = P2Y: P2Y = P4Y: P4Y = T
End If
If P3Y < P4Y Then
    T = P3X: P3X = P4X: P4X = T
    T = P3Y: P3Y = P4Y: P4Y = T
End If
X21 = P2X - P1X 'Вычисление коэфициентов смещения
X31 = P3X - P1X
X42 = P4X - P2X
X43 = P4X - P3X
Y21 = P2Y - P1Y
Y31 = P3Y - P1Y
Y42 = P4Y - P2Y
Y43 = P4Y - P3Y
If Y21 = 0 Then
    SX21 = X21
Else
    SX21 = X21 / Y21
End If
If Y31 = 0 Then
    SX31 = X31
Else
    SX31 = X31 / Y31
End If
If Y42 = 0 Then
    SX42 = X42
Else
    SX42 = X42 / Y42
End If
If Y43 = 0 Then
    SX43 = X43
Else
    SX43 = X43 / Y43
End If
BX21 = P2X
BX31 = P3X
BX42 = P4X
BX43 = P4X
If P2Y > P3Y Then 'Начало строкового "малевания" (рисования)
   For CiA = P4Y To P3Y - 1
        Line (BX42, CiA)-(BX43, CiA)
        BX42 = BX42 + SX42
        BX43 = BX43 + SX43
    Next
    For CiA = P3Y To P2Y - 1
        Line (BX42, CiA)-(BX31, CiA)
        BX42 = BX42 + SX42
        BX31 = BX31 + SX31
    Next
    For CiA = P2Y To P1Y - 1
        Line (BX21, CiA)-(BX31, CiA)
        BX21 = BX21 + SX21
        BX31 = BX31 + SX31
    Next
Else
    For CiA = P4Y To P2Y - 1
        Line (BX42, CiA)-(BX43, CiA)
        BX42 = BX42 + SX42
        BX43 = BX43 + SX43
    Next
    For CiA = P2Y To P3Y - 1
        Line (BX21, CiA)-(BX43, CiA)
        BX21 = BX21 + SX21
        BX43 = BX43 + SX43
    Next
    For CiA = P3Y To P1Y - 1
        Line (BX21, CiA)-(BX31, CiA)
        BX21 = BX21 + SX21
        BX31 = BX31 + SX31
    Next
End If
End Sub

Все переменные, кроме массивов VSX() и VSY() - временные и могут иметь любые имена.
Конечно, у меня код в 4 раза меньше по операциям, но он вообще никак не читабелен, хотя результат такой-же.
И еще: масштаб проецирования: Пиксели, а не Твипы!
Результат:
Изображение
Цвет можно изменить, если хочется, а про красные точки - это уже другая история, сделал процедуру для мышки, что-бы их можно было двигать...

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение26.10.2009, 20:34 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Qx15(RUS) в сообщении #255249 писал(а):
Я понял, что это формула вычисления проекция точки на экране, используя координаты точки.Всего 2 строки! Я эту формулу давно искал. Подставил в программу, и....получил такую ****... она вообще неправильная...И вот автор статьи расписывает уравнения, преобразует их,подробно все считает, считает и:

Формула правильная. Здесь dist - расстояние от глаза до экрана, а ось z направлена из глаза перпендикулярно экрану.

-- Пн окт 26, 2009 20:40:47 --

Qx15(RUS) в сообщении #255249 писал(а):
Я просто угараю от С1-С9 И как мне их найти??? Может кто-то напишет?Я гуглил, гуглил, так ничего и не нашел

Там выше куча громоздких формул, из которых при желании их можно найти, но никто этого не делает.

Там по ссылке есть про аффинное и перспективно-корректное текстурирование, это приемы, более используемые на практике.
Впрочем, согласен, что без некоторой подготовки это сходу не осилить.

-- Пн окт 26, 2009 20:46:09 --

Можно еще посмотреть [url]http://gen.lib.rus.ec/search?req=компьютерная+графика:+полигональные+модели[/url] страница 430

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение26.10.2009, 22:56 


06/10/09
63
Xaositect в сообщении #255275 писал(а):
...Формула правильная. Здесь dist - расстояние от глаза до экрана, а ось z направлена из глаза перпендикулярно экрану...

Я скорее всего просто не могу въехать в тему...
dist - расстояние от глаза до экрана? А где находиться "глаз"? Я не понял, что такое глаз? С осями то я разобрался, поменял местами y и z, но все-равно не то. Я просто вместо dist подставлял расстояние до точки (а что бы вы еще сюда поставили, если нет пояснений). Надеюсь dist - непостоянная величина, зависящая от положения, относительно камеры...иначе это правильной формулой центрального проецирования никак не назовешь...возможно только параллельной. Спасибо за ссылку на djvu-файл. Посмотрю, когда выкрою свободный час.

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение27.10.2009, 04:50 
Заслуженный участник


26/07/09
1559
Алматы
2Qx15(RUS)
Цитата:
я в 11 классе, только недавно изучали производные, а вы хотите чтобы я прям сейчас на одной коленке накатал эти трехмерные уравнения и одной левой(а точнее правой) решил их?

Да, уравнения просты, все в рамках школьной программы (я решил эти две задачки и ничего "страшного" в ходе решения не получалось), вы осилите если не будете лениться.

Цитата:
И еще тогда объясните это:
...
И где тут расстояние линейно изменяется?!

Прочитайте внимателно мое предыдущее сообщение. Расстояние меняется линейно от полигона до наблюдателя, т.е. до плоскости экрана, а не до точки. Возможно я зря упомянул наблюдателя, это внесло путаницу.

Но смысл остается тем-же, простейший алгоритм текстурирования устроен точно так-же как и ваша построчная заливка. Необходимые же вам искажения получаются уже при рассчете перспективы (грубо говоря, при делении координат параллельно спроецированных точек на их координату глубины).

Цитата:
Надеюсь dist - непостоянная величина

Это константа. Можно подбирать экспериментально.

 Профиль  
                  
 
 Re: Проблемы с 3D граффикой
Сообщение27.10.2009, 11:05 


10/02/06
54
Цитата:
Circiter, я в 11 классе, только недавно изучали производные, а вы хотите чтобы я прям сейчас на одной коленке накатал эти трехмерные уравнения и одной левой(а точнее правой) решил их?

Это многое объясняет. Тогда могу дать хороший совет - сначала курс линейной алгебры (по меньшей мере в части работы с матрицами) и аналитической геометрии. Там нет ничего военного, грамотный школьник осилит необходимое за пару месяцев, но без этого заниматься 3D-графикой перспективы нет.
А сам механизм рендеринга столько раз разобран по косточкам и реализован, что нет нужды изобретать велосипед, лучше почитать.
А уж если оч. хочется велосипеда - изобретайте алгебру :D

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group