Тригонометрія

Pi

const float pi = 3.14159265f; // але в реальності тут безкінечна послідовність

Косинус та синус

(З http://commons.wikimedia.org/wiki/User:Geek3 , ліцензія GNU Free Documentation)

Одиничне коло

( Це модифіковане зображення http://en.wikipedia.org/wiki/User:Gustavb оригінальне зображення під ліцензією Crative Commons 3.0 )

t це кут в радіанах.

0 радіан = 0 градусів

180 градусів = Pi радіан

360 градусів ( повне коло ) = 2*Pi радіан

90 градусів = Pi/2 радіан

Вектора

Завжди знайте в яких координатах ваш вектор. Дивіться секцію 3 для деталей.

Однорідні координати

3D вектор - це (x,y,z), але 3D вектор з однорідними координатами - це (x,y,z,w).

  • w=0 : це напрямок
  • w=1 : це позиція
  • щось інше : може бути коректним, але ви знаєте краще, що ви робите

Ви можете множити матрицю 4х4 тільки з вектором з однорідними координатами.

Довжина

Просто як декартова відстань : sqrt( x² + y² + z² ). w не рахується.

Векторний добуток (Cross product)

( Це модифіковане зображення http://en.wikipedia.org/wiki/User:Acdx , оригінальне зображення під ліцензією Creative Commons 3.0 )

Символ Х використовується для позначення векторного добутку. length( a x b ) == length(a) * length(b) * sin(θ), тому можливо ви захочете викликати normalize() для результату.

Скалярний добуток (Dot product)

##

( З http://en.wikipedia.org/wiki/File:Dot_Product.svg )

A.B = length(A)*cos(Theta) , але зазвичай розраховується за формулою A.x*B.x +A.y*B.y +A.z*B.z

Додавання та віднімання

кодом :

res.x = A.x + B.x
res.y = A.y + B.y
...

Множення

кодом :

res.x = A.x * B.x
res.y = A.y * B.y
...

Нормалізація

Потрібно розділити вектор на його довжину :

normalizedVector = vec * ( 1.0f / vec.length() )

Матриця

Множення матриці на матрицю

Приклад переміщення (зсуву) матриці:

Множення матриці на вектор

Звичайні трансформації

… але в шейдерах, ви можете використовувати вектори в дотичному просторі. А для обробки зображень - в просторі зображення. ‘res.x = A.x + B.x’