Войти
ПрограммированиеФорумГрафика

lightmap. Расчет xyz по uv

#0
20:28, 2 июня 2012

Всем привет. Пытаюсь реализовать расчет карты освещенности для произвольного треугольника в пространстве. Треугольник задан координатами вершин. Известны uv координаты в каждой вершине. Смотрел вот эту статью на сайте: http://www.gamedev.ru/articles/?id=30102. Вроде все понятно, но где-то ошибаюсь и результат неверный. В общем координаты  для пикселей карты считал так:

//задаю координаты точек треугольника в пространстве.
     p1.x = 2;
     p1.y = 2;
     p1.z = 0;
    
    p2.x = 4;
    p2.y = 2;
    p2.z = 0;
    
    p3.x = 4;
    p3.y = 4;
    p3.z = 0;
// для удобства проверки взял z за 0
//дальше считаю вектора u и v:
    
    u = Minus(p2,p1);
    n1 = Minus(p3,p1);
    normal = CrossVector(u,n1);
    v = CrossVector(n1,normal);
    
    u = Normalize(u);
    v = Normalize(v);

// теперь считаю координаты в пространстве для текстурных координат в точке 0,0
    x = p1.x + (u.x * 0) + (v.x * 0);
    y = p1.y + (u.y * 0) + (v.y * 0);
    z = p1.z + (u.z * 0)+ (v.z * 0);

в итоге при 0,0 все ок считает, а при других значениях, например при 1,0 уже бред какой то.
В чем ошибка подскажите пожалуйста.


#1
23:12, 2 июня 2012

Наверно, потому что в статье показан частный случай. А ты к тому же неправильно скопипастил. Поищи на форуме "lightmap", уже 100500 раз это все обсуждалось.

#2
23:36, 2 июня 2012
А ты к тому же неправильно скопипастил.

Ничего не копипастил, писал сам основываясь на том, что понял из этой статьи. Проблему неверных расчетов понял. Неверно считается v вектор.
В статье сказано, что надо ещё домножать его на высоту полигона в к основанию вектора v. Вот эту фразу я не понял ((( Ещё сложность с тем, что иногда вектор получается отрицательным или вовсе не должен быть получен не векторным переменожением нормали и u а перемножением нормали и n1... как это учитывать, если брать не частный случай а общий? В общем прошу помощи в формуле расчета вектора v
Поищи на форуме "lightmap"

Искал, кроме двух тем, где есть код генерации карты ничего не нашел. В коде разобраться не смог.
#3
0:44, 3 июня 2012

SC2Melvin
> Искал, кроме двух тем, где есть код генерации карты ничего не нашел. В коде
> разобраться не смог.
Ок, могу только повторить - http://www.gamedev.ru/code/forum/?id=161446.
Правильно считать через барицентрические координаты. По текстурным находишь барицентрические, а по ним и позициям вершин - мировые координаты. Так же находятся другие параметры, заданные в вершинах - нормали, цвета, другой сет текстурных координат. Разберись в основах, иначе у тебя и с трассировками такие же вопросы будут.

#4
14:56, 3 июня 2012

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

//задаем точки треугольника и текстурные координаты

    a.x = 0; b.x = 3; c.x = 0;
    a.y = 0; b.y = 0; c.y = 3;
    a.z = 0; b.z = 0; c.z = 0;
    
    a.u = 0; b.u = 1; c.u = 0;
    a.v = 0; b.v = 0; c.v = 1;

// будем искать координаты для текселя с текстурными координатами s,t

//вычисляем барицентрические координаты m1,m2,m3:

    d = (b.u*c.v)-(b.v*c.u)-(a.u*c.v)+(a.v*c.u)+(a.u*b.v)-(a.v*b.u);
    m1 = ((b.u*c.v)-(b.v*c.u)-(s*c.v)+(t*c.u)+(s*b.v)-(t*b.u))/d;
    m2 = ((s*c.v)-(t*c.u)-(a.u*c.v)+(a.v*c.u)+(a.u*t)-(a.v*s))/d;
    m3 = ((b.u*t)-(b.v*s)-(a.u*t)+(a.v*s)+(a.u*b.v)-(a.v*b.u))/d;

//считаем координаты текселя s,t в пространстве:

    float x = a.x*m1+b.x*m2+c.x*m3;
    float y = a.y*m1+b.y*m2+c.y*m3;
    float z = a.z*m1+b.z*m2+c.z*m3;
ПрограммированиеФорумГрафика

Тема в архиве.