Вектори, матриці, кватерніони, методи інтегрування ЗДР і ключові фізичні константи — кожна формула, що потрібна вам при створенні чи вивченні 3D-симуляцій у браузері.
Вектори — це будівельні блоки кожної симуляції. Усі формули нижче стосуються $\mathbb{R}^3$, якщо не зазначено інакше; 2D-еквіваленти відкидають компоненту $z$.
| Операція | Формула | Three.js / JS |
|---|---|---|
| Додавання | $\mathbf{a} + \mathbf{b} = (a_x+b_x,\; a_y+b_y,\; a_z+b_z)$ | a.add(b) |
| Множення на скаляр | $s\,\mathbf{a} = (s\,a_x,\; s\,a_y,\; s\,a_z)$ | a.multiplyScalar(s) |
| Модуль | $|\mathbf{a}| = \sqrt{a_x^2 + a_y^2 + a_z^2}$ | a.length() |
| Нормалізація | $\hat{\mathbf{a}} = \dfrac{\mathbf{a}}{|\mathbf{a}|}$ | a.normalize() |
| Скалярний добуток | $\mathbf{a} \cdot \mathbf{b} = a_x b_x + a_y b_y + a_z b_z$ | a.dot(b) |
| Векторний добуток | $\mathbf{a} \times \mathbf{b} = (a_y b_z - a_z b_y,\; a_z b_x - a_x b_z,\; a_x b_y - a_y b_x)$ | a.cross(b) |
| Кут між векторами | $\theta = \arccos\!\left(\dfrac{\mathbf{a} \cdot \mathbf{b}}{|\mathbf{a}||\mathbf{b}|}\right)$ | a.angleTo(b) |
| Лінійна інтерполяція | $\mathbf{c} = \mathbf{a} + t(\mathbf{b} - \mathbf{a}),\quad t\in[0,1]$ | a.lerp(b, t) |
| Відбиття | $\mathbf{r} = \mathbf{d} - 2(\mathbf{d}\cdot\hat{\mathbf{n}})\hat{\mathbf{n}}$ | d.reflect(n) |
Three.js зберігає матриці у порядку по стовпцях у
пласкому Float32Array. Усі перетворення нижче дають
однорідні матриці 4×4.
| Матриця | Властивість Three.js | Призначення |
|---|---|---|
| Моделі (M) | object.matrixWorld |
Об’єкт → світовий простір (позиція + обертання + масштаб) |
| Вигляду (V) | camera.matrixWorldInverse |
Світ → простір камери |
| Проєкції (P) | camera.projectionMatrix |
Камера → простір відсікання (перспективне ділення) |
| Матриця нормалей | object.normalMatrix |
Перетворює нормалі (обернена транспонована верхньої лівої 3×3 з MV) |
Кватерніони задають 3D-обертання без шарнірного блокування (gimbal lock). Одиничний кватерніон $\mathbf{q} = (w, x, y, z)$ з $|\mathbf{q}|=1$ кодує обертання на $2\arccos(w)$ навколо осі $(x,y,z)/\sin(\arccos w)$.
| Операція | Three.js |
|---|---|
| З вісь-кут | q.setFromAxisAngle(axis, angle) |
| З кутів Ейлера | q.setFromEuler(euler) |
| Множення (композиція) | q.multiply(r) |
| Slerp | q.slerp(target, t) |
| Спряжений / обернений | q.conjugate() (за умови одиничності) |
| Застосувати до вектора | vec.applyQuaternion(q) |
Для системи $\dot{\mathbf{x}} = f(\mathbf{x}, t)$, де $\mathbf{x}$ — вектор стану (позиції + швидкості), ці методи просувають стан на один крок часу $\Delta t$.
| Метод | Порядок | Обчислень/крок | Найкраще для |
|---|---|---|---|
| Ейлера | 1 | 1 | Швидкі прототипи, некритичні задачі |
| Симплектичний Ейлер | 1 | 1 | Пружини, гравітація, симуляції частинок |
| Верле | 2 | 1 | Молекулярна динаміка, тканина |
| Швидкісний Верле | 2 | 2 | N-тіл, SPH, загальна фізика |
| RK4 | 4 | 4 | Атрактор Лоренца, маятник, ЗДР |
| Закон | Формула |
|---|---|
| Другий закон Ньютона | $\mathbf{F} = m\,\mathbf{a}$ |
| Закон всесвітнього тяжіння | $F = G\dfrac{m_1 m_2}{r^2}$, $\mathbf{F}_{12} = G\dfrac{m_1 m_2}{r^3}\,\mathbf{r}_{12}$ |
| Кінетична енергія | $K = \tfrac{1}{2}m\,v^2$ |
| Гравітаційна потенціальна енергія | $U = -G\dfrac{m_1 m_2}{r}$ |
| Сила пружної пружини | $F = -k(x - x_0)$ (закон Гука) |
| Сила демпфування | $F_d = -b\,v$ (лінійне демпфування) |
| Сила опору | $F_D = \tfrac{1}{2}\rho\,C_D\,A\,v^2$ |
| Імпульс | $\mathbf{p} = m\mathbf{v}$, зберігається в замкнених системах |
| Момент імпульсу | $\mathbf{L} = \mathbf{r} \times \mathbf{p} = I\,\boldsymbol{\omega}$ |
| Момент сили | $\boldsymbol{\tau} = \mathbf{r} \times \mathbf{F} = I\,\boldsymbol{\alpha}$ |
Браузерні симуляції рідко використовують одиниці SI напряму — відстані 10⁻¹¹ м спричинили б втрату точності float. Натомість застосовуйте безрозмірні або нормалізовані одиниці: задайте $G = 1$, масу в довільних одиницях і налаштуйте так, щоб досягти візуально правдоподібної поведінки.