sunLoadingImage
whowedImag
decoration left 1
decoration left 2
transhome
transprojects
transgallery
transarticles
decoration rigth
English
Українська
Show/Hide search bar
black cat logo variable logo
[10 Гру 2012]

Розрахунок дотичних та бідотичних векторів

Метод попіксельної модифікації нормалей додає тривимірній моделі більшої рельєфності. Для використання цього методу необхідно мати можливість переводити вектори з простору моделі у простір дотичних. Для формування матриці перетворення необхідно розрахувати вектори дотичних та бідотичних. Під дотичними векторами маються на увазі вектори для кожної вершини, які по напряму збігаються з напрямом зміни текстурних координат вздовж осей S та T.
Осі дотичних координат Координати вершини В в світовому простоті і в дотичних координатах. Дотична і бідотична йдуть вздовж текстури.
Спочатку розрахуємо необхідні вектори для кожного трикутника моделі. Припустимо, що є трикутник з вершинами A,B,C та точка у цьому трикутнику P. Також кожна вершина має визначені текстурні координати. Тоді для кожної точки для трикутника вірна рівність:
Вираження позиції точки P через текстурні координати
де T і B – вектори дотичних та бідотичних відповідно, sp,tp – текстурні координати точки P, sa,ta – текстурні координати точки A. Праву частину рівності можна інтерпретувати як позиціонування точки в системі координат, а саме в просторі дотичних. Вектори Т та B визначають осі системи, а різниця текстурних координат - необхідний зсув вздовж цих осей.
Виразимо позицію та текстурні координати точок B та С трикутника відносно точки А.



Тепер виразимо позиції точоч B i C через текстурні координати:

Невідомими є вектори T і B. Запишемо рівності у матричній формі.

Щоб знайти дотичні та бідотичні потрібно поділити ліву частину на матрицю з текстурними координатами(тобто помножити ліву частину на інвертовану матрицю).
Частина інвертованої 2х2 матриці, 1/det


Можна порахувати вектори дотичних та бідотичних для кожного трикутника в моделі. Після цього потрібно розрахувати ці вектори для кожної вершини. Так як кожна вершина може використовуватися багатьма трикутниками, то вектори T i B для вершини повинні бути усередненими відповідними векторами трикутників, які використовують ці вершини.
foreach vertex
    vertex.T = 0; // tangent
    vertex.B = 0; // binormal
    foreach triangle
        if (vertex in triangle) // test, for example, by vertex index
            vertex.T += triangle.T
            vertex.B += triangle.B
    vertex.T = normalize(T)
    vertex.B = noramlize(B)
Тепер для кожної вершини ми маємо нормаль, дотичну і бідотичну. Можемо сформувати матрицю для перетворення з простору дотичних у світовий простір.

Потрібно інвертувати цю матрицю, щоб вона виконувала зворотнє перетворення. Для матриці повороту (яка містить в ортонормальний базис) інвертна матриця рівна транспонованій. Але знайдені вектори дотичних і бідотичних не обовязково є перпендикулярними. Ортогоналізуємо її з допомогою метода Грама-Шмідта:


Також ці вектори потрібно нормалізувати. З ортогоналізованих векторів можна утворити матрицю перетворення з світового простору у простір дотичних:

Помноживши вектор на цю матрицю відбувається його перетворення з простору світу у простір дотичних. Це використовується в методі мапування нормалей у вершинному шейдері для перетворення вектора до світла (та інших векторів необхідних для освітлення) у простір дотичних.
Замість передачі шести чисел з плаваючою точкою для кожної вершини, можна передавати тільки чотири. Бідотичний вектор може бути відтворений як векторний добуток нормалі та дотичного вектора. Щоб відтворена бідотична вказувала у правильну сторону необхідно також врахувати напрямленість H. H рівний знаку детермінанта матриці MworldToTan (рівне 1 чи -1). Тож необхідно додати один атрибут vec4 для вершинного шейдера. В компоненти xyz записується дотичний вектор, а в компоненту w - значення H.




Sun and Black Cat- Ігор Дихта (igor dykhta email) © 2007-2014