Довідник Оновлено в червні 2026

Математичні формули

Вектори, матриці, кватерніони, методи інтегрування ЗДР і ключові фізичні константи — кожна формула, що потрібна вам при створенні чи вивченні 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)

Тотожності скалярного добутку

Геометрична інтерпретація $$\mathbf{a} \cdot \mathbf{b} = |\mathbf{a}||\mathbf{b}|\cos\theta$$ $$\mathbf{a} \cdot \mathbf{a} = |\mathbf{a}|^2 \quad\text{(квадрат модуля)}$$ $$\mathbf{a} \perp \mathbf{b} \;\Longleftrightarrow\; \mathbf{a}\cdot\mathbf{b} = 0$$

🔢 Матричні перетворення

Three.js зберігає матриці у порядку по стовпцях у пласкому Float32Array. Усі перетворення нижче дають однорідні матриці 4×4.

Перенесення

T(tx, ty, tz) $$T = \begin{pmatrix}1&0&0&t_x\\0&1&0&t_y\\0&0&1&t_z\\0&0&0&1\end{pmatrix}$$

Масштабування

S(sx, sy, sz) $$S = \begin{pmatrix}s_x&0&0&0\\0&s_y&0&0\\0&0&s_z&0\\0&0&0&1\end{pmatrix}$$

Обертання навколо осі Y

Ry(θ) $$R_y(\theta) = \begin{pmatrix}\cos\theta&0&\sin\theta&0\\0&1&0&0\\-\sin\theta&0&\cos\theta&0\\0&0&0&1\end{pmatrix}$$

Model-View-Projection (MVP)

Конвеєр перетворення вершин $$\mathbf{v}_{clip} = M_{proj} \cdot M_{view} \cdot M_{model} \cdot \mathbf{v}_{local}$$
Матриця Властивість 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)$.

Кватерніон обертання з вісь-кут $$\mathbf{q} = \left(\cos\frac{\theta}{2},\; \hat{\mathbf{n}}\sin\frac{\theta}{2}\right)$$
Множення кватерніонів (композиція обертань) $$\mathbf{q}_1 \otimes \mathbf{q}_2 = \begin{pmatrix} w_1 w_2 - x_1 x_2 - y_1 y_2 - z_1 z_2 \\ w_1 x_2 + x_1 w_2 + y_1 z_2 - z_1 y_2 \\ w_1 y_2 - x_1 z_2 + y_1 w_2 + z_1 x_2 \\ w_1 z_2 + x_1 y_2 - y_1 x_2 + z_1 w_2 \end{pmatrix}$$
Обертання вектора v кватерніоном q $$\mathbf{v}' = \mathbf{q} \otimes (0, \mathbf{v}) \otimes \mathbf{q}^{-1}$$
SLERP — сферична лінійна інтерполяція $$\text{slerp}(\mathbf{q}_0, \mathbf{q}_1, t) = \mathbf{q}_0 \left(\mathbf{q}_0^{-1}\mathbf{q}_1\right)^t, \quad t\in[0,1]$$
Операція 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-й порядок

Глобальна похибка O(Δt) — найпростіший, найменш стійкий $$\mathbf{x}_{n+1} = \mathbf{x}_n + \Delta t \cdot f(\mathbf{x}_n, t_n)$$

Симплектичний Ейлер (напівнеявний Ейлер) — 1-й порядок

Зберігає енергію для гамільтонових систем — кращий для гравітації/пружин $$\mathbf{v}_{n+1} = \mathbf{v}_n + \Delta t \cdot \mathbf{a}_n$$ $$\mathbf{x}_{n+1} = \mathbf{x}_n + \Delta t \cdot \mathbf{v}_{n+1}$$

Метод Верле — 2-й порядок

Похибка позиції O(Δt²) · добре для молекулярної динаміки $$\mathbf{x}_{n+1} = 2\mathbf{x}_n - \mathbf{x}_{n-1} + \Delta t^2\,\mathbf{a}_n$$

Швидкісний Верле (leapfrog) — 2-й порядок

Рекомендований типовий вибір для фізики частинок $$\mathbf{v}_{n+\tfrac12} = \mathbf{v}_n + \tfrac{\Delta t}{2}\,\mathbf{a}_n$$ $$\mathbf{x}_{n+1} = \mathbf{x}_n + \Delta t\,\mathbf{v}_{n+\tfrac12}$$ $$\mathbf{v}_{n+1} = \mathbf{v}_{n+\tfrac12} + \tfrac{\Delta t}{2}\,\mathbf{a}_{n+1}$$

Рунге-Кутта 4 (RK4) — 4-й порядок

Похибка O(Δt⁴) · витратний, але дуже точний $$k_1 = f(\mathbf{x}_n,\; t_n)$$ $$k_2 = f\!\left(\mathbf{x}_n + \tfrac{\Delta t}{2}k_1,\; t_n + \tfrac{\Delta t}{2}\right)$$ $$k_3 = f\!\left(\mathbf{x}_n + \tfrac{\Delta t}{2}k_2,\; t_n + \tfrac{\Delta t}{2}\right)$$ $$k_4 = f\!\left(\mathbf{x}_n + \Delta t\,k_3,\; t_n + \Delta t\right)$$ $$\mathbf{x}_{n+1} = \mathbf{x}_n + \frac{\Delta t}{6}(k_1 + 2k_2 + 2k_3 + k_4)$$
Метод Порядок Обчислень/крок Найкраще для
Ейлера 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}$

Пружне зіткнення (1D)

Швидкості після зіткнення для мас m₁, m₂ $$v_1' = \frac{m_1 - m_2}{m_1 + m_2}v_1 + \frac{2m_2}{m_1+m_2}v_2$$ $$v_2' = \frac{2m_1}{m_1 + m_2}v_1 + \frac{m_2 - m_1}{m_1+m_2}v_2$$

Ядро сили тиску SPH (Spiky)

Desbrun 1996 — стандартний градієнт тиску SPH $$\nabla W_{spiky}(r, h) = -\frac{45}{\pi h^6}(h-r)^2\,\hat{\mathbf{r}}, \quad r \le h$$

⚛ Фізичні константи

G
Гравітаційна стала
6.674 × 10⁻¹¹ N m² kg⁻²
c
Швидкість світла
2.998 × 10⁸ m s⁻¹
h
Стала Планка
6.626 × 10⁻³⁴ J s
kB
Стала Больцмана
1.381 × 10⁻²³ J K⁻¹
NA
Стала Авогадро
6.022 × 10²³ mol⁻¹
e
Елементарний заряд
1.602 × 10⁻¹⁹ C
me
Маса електрона
9.109 × 10⁻³¹ kg
ε0
Електрична стала (вакууму)
8.854 × 10⁻¹² F m⁻¹
g
Стандартне прискорення вільного падіння (Землі)
9.80665 m s⁻²
R
Універсальна газова стала
8.314 J mol⁻¹ K⁻¹
Одиниці симуляції

Браузерні симуляції рідко використовують одиниці SI напряму — відстані 10⁻¹¹ м спричинили б втрату точності float. Натомість застосовуйте безрозмірні або нормалізовані одиниці: задайте $G = 1$, масу в довільних одиницях і налаштуйте так, щоб досягти візуально правдоподібної поведінки.