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

Корисні вектори в комп'ютерній графіці

Перпендикуляр до трикутника

Розрахунок перпендикуляра до трикутника може знадобитися, коли полігональна сітка збережена без нормалей, коли необхідно визначити нормаль площини, і тд. :) Обчислення перпендикуляра зводиться до визначення двох векторів a та b. Векторний добуток цих векторів є перпендикулярним до площини, якій належить трикутник. Напрям нормалі залежить від порядку векторів у векторному добутку.

Вектор a
Вектор b
Нормаль трикутника
Нормаль до трикутника
Перпендикуляр в вершині

У полігональних сітках зазвичай кожна вершина є спільною для декількох трикутників. Яка ж нормаль для такої вершини? Можна скопіювати вершину для кожного трикутника, і призначити їй нормаль цього трикутника. При освітлені це призведе до видимих переходів між полігонами, що може бути бажаним ефектом, наприклад, для унікальних нормалей для кожної грані куба. Якщо видимі межі між полігонами є небажаними, то нормалі згладжуються. Є наступні способи розрахунку згладженої нормалі (результуючий вектор необхідно нормалізувати в усіх випадках):

  • просумувати нормалі усіх трикутників до яких належить вершина. N=N1+N2+N3. Цей спосіб застосовується найчастіше.
  • перед сумуванням нормаль трикутника множиться на площу трикутника. N=N1*q1+N2*q2+N3*q3. Площа трикутника обчислюється як половина векторного добутку суміжних ребер трикутника.
  • перед сумуванням нормаль трикутника множиться на суміжний кут трикутника. N=N1*A1+N2*A2+N3*A3. Кут обчислюється як acos від скалярного добутку суміжних ребер трикутника.
  • комбінований метод, де нормаль зважується як площою трикутника, так і суміжним кутом.
    Згладжена нормаль у вершині
    Перперндикуляр до прямої

    У 2D просторі для того, щоб знайти перпеникуляр до прямої необхідно просто поміняти місцями складові x та y напряму прямої, та інвертувати один з них. Тобто n = (-y,x) або n = (y,-x). Ці два перпердникуляри є протилежними.

    В 3D просторі пряма має безліч перпердикулярів. Щоб знайти будь-який з них можна використати векторний добуток. Нехай пряма має напрям a. Візьмемо довільний вектор b, напрям якого відрізняється від напряму a (і не є протилежним). Результат векторного добутку (n) векторів a та b буде перпендикулярним до а.

    Перпендикуляр до прямої в 3D
    Дотична та нормаль до кривої

    Дотичну до кривої можна розрахувати з допомогою її першої похідної, а нормаль як перпендикуляр до знайденої дотичної. Наприклад, для 2D випадку, для рівнянь виду y=f(x):

  • Рівняння кривої
  • Рівняння кривої
  • Точка в якій необхідно знайти дотичну
  • Точка в якій необхідно знайти дотичну
  • Похідна від рівняння кривої
  • Похідна від рівняння кривої

    Знайдемо грідієнт в шуканій точці (підставимо координату x точки в похідну). Градієнт показує на скільки в даній точці змінюється значення y залежно від зміни х.

  • Градієнт в точці (2,4)
  • Градієнт в точці (2,4)

    Отже при зміні х на 1, y змінюється на 4. Знайдемо рівняння дотичної з нахилом, який відповідає градієнту, і яка проходить через точку (2,4). Для цього використаємо рівняння прямої:

  • Рівняння прямої
  • Градієнт в точці (2,4)
  • Представимо у вигляді y=f(x)
  • Представимо у вигляді y=f(x)
  • Дотична в точці (2,4)
  • Дотична в точці (2,4)
    Крива та дотична кривої
    Дотична до кривої без відомого рівняння

    Часто рівняння кривої є невідомим. У випадку з параметричними кривими, такими як криві Безьє, кожна точка кривої відповідає параметричному значенню t. Тобто t - точка на прямій, а t+Δ - наступна точка (якщо уявити, що Δ є безкінечно малим значенням). Для того, щоб знайти дотичну в точці кривої, яка відповідає значенню t, можна знайти напрям від точки t до точки t+Δ. При обчисленнях з плаваючою комою, Δ є числом, яке є малим, але в той же час достатньо великим для видимої зміни результату. Знайдений напрям буде наближеним до дійсного напряму дотичної. Нормаль в точці кривої знаходиться як перпендикуляр до дотичної.

    Дотична та нормаль кривої
    Вектор до світла, вектор погляду та половинний вектор

    При обрахунку освітлення можуть використовуватися вектори, які показані на зображенні:

    Вектори локального освітлення
  • n - нормаль поверхні. Зазвичай розраховується інтерполяцією нормалей вершин трикутника, якому належить точка поверхні (P).
  • v - вектор погляду. Розраховується як вектор від точки поверхні P до позиції камери.
  • L - вектор до світла. Розраховується як вектор від точки поверхні P до позиції світла. Якщо джерело світла не має визначеної позиції (напрямлене світло), то вектор світла рівний напряму напрямленого джерела світла. Якщо світло не є точковим, тобто займає певний об'єм, то в цьому об'ємі визначається скінченна кількість точок, які відповідають позиції світла.
  • r - відбитий вектор. Використовується для симуляції бліків, дзеркальних поверхонь, розрахунку напряму відбитого променя і тп.
  • t - заломлений вектор. Використовується для симуляції прозорих обєктів та обєктів в яких світло розсіюється.
  • h - половинний вектор. Розраховується як нормалізована сума векторів L та v. З зображення видно, що кут між векторами n та h є наближеним до кута між векторами v та r. Ця властивість застосовується при розрахунку дзеркального освітлення в стандартній моделі Бліна-Фонга (відпадає необхідність розрахунку відбитого вектора r).
    Відбитий вектор

    Відбитий вектор розраховується як віддзеркалення вектора світла відносно нормалі поверхні. В GLSL для цього є функція reflect, якій необхідно передати нормаль та вектор для віддзеркалення. Розрахунок відбитого вектора відбувається наступним чином (вектори n та L повинні бути нормалізованими):

  • розраховуємо довжину t - проекцію вектора L на n (скалярний добуток n та l)
  • розрахувуємо позицію точки Т1 як подвоєну довжину t у напрямі n
  • розраховуємо позицію точки Т2 віднявши L від Т1
  • відбитий вектор є рівним вектору від точки поверхні P до точки Т2

    Розрахунок відбитого вектора
    Відбитий вектор R
    Заломлений вектор

    Заломлений вектор розраховується за законом Снеліуса. Для цієї цілі в GLSL є функція refract(), якій необхідно передати нормаль поверхні n, падаючий вектор L та відношення вхідного показника заломлення середовища до вихідного (n1/n2). Розрахунок заломленого вектора відбувається наступним чином:

  • Косинус кута біля падаючого вектора
  • Косинус кута біля падаючого вектора
  • Сінус кута біля падаючого вектора
  • Сінус кута біля падаючого вектора - з тригонометричних властивостей
  • Косунус кута біля заломленого вектора
  • Косунус кута біля заломленого вектора - з тригонометричних властивостей
  • Сінус кута біля заломленого вектора
  • Сінус кута біля заломленого вектора - з закону Снеліуса
    Тепер можна розрахувати косунус кута γ
  • Заміна sin(θ) на cos(θ)
  • Заміна сінуса θ на косинус θ
  • Заміна sin(γ) на cos(θ)
  • Заміна sin(γ) на cos(θ)

    Тепер ми маєму усі необхідні складові для обрахунку заломленого вектора. З малюнка видно, що заломлений вектор складається з двох компонент - вздовж падаючого вектора(фіолетовий вектор) і вздовж нормалі (жовта лінія). Отже заломлений вектор розраховується наступним чином:

    Формула розрахунку заломленого вектора Розрахунок заломленого вектора T
    Ортогоналізація векторів

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

  • Серед трьох векторів обираємо вектор, який буде співпадати з віссю. Наприклад вектор Y.
    Визначаємо базову вісь
  • Беремо наступний вектор - X. Він неперпендикулярний до осі Y'. Відхилення від перпендикулярності можна виразити зсувом d1 вздовж осі Y'. На таку величину потрібно зсунути вектор X в напрямі протилежному осі Y' і нормалізувати, щоб X та Y' стали перпендикулярними. Зсув визначається скалярним добутком. Результатом буде вісь X'.
    Визначаємо другу вісь
  • Тепер беремо вектор Z. Він не є перпендикуларним ні до осі Y', ні до осі X'. Визначаємо відхилення від перпендикулярності d2 та d3 вздовж осей X' та Y' відповідно. Зсуваємо вектор Z вздовж -X' на відстань d2, і вздовж -Y' на відстань d3, і нормалізуємо. Результатом буде вісь Z'.
    Визначаємо третю вісь
    Ортогоналізація векторів

    Результат ортогоналізації Грема-Шмідта залежить від вибору початкового вектора. Тобто перша вісь буде збігатися з оригінальним вектором, а інші осі можуть бути сильно зсунутими. Щоб розподілити зсуви між всіма осями можна проводити ітеративну ортогоналізацію. На кожній ітерації береться наступний вектор і частково змінюється в сторону ортогоналізації з двома іншими векторами. Після достатньої кількості ітерацій проводиться стандартна ортогоналізація.




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