diff --git a/rbxl-importer/src/__pycache__/rbxl_types.cpython-314.pyc b/rbxl-importer/src/__pycache__/rbxl_types.cpython-314.pyc index f6db794..b0a3d0d 100644 Binary files a/rbxl-importer/src/__pycache__/rbxl_types.cpython-314.pyc and b/rbxl-importer/src/__pycache__/rbxl_types.cpython-314.pyc differ diff --git a/rbxl-importer/src/rbxl_types.py b/rbxl-importer/src/rbxl_types.py index a689b12..21784e5 100644 --- a/rbxl-importer/src/rbxl_types.py +++ b/rbxl-importer/src/rbxl_types.py @@ -561,19 +561,30 @@ def _cframe_orientation_to_matrix(orientation_id: int) -> tuple: Источник: https://dom.rojo.space/binary#cframe-orientation-ids - Это полная таблица 24-х валидных orientation id для cube symmetries. - Возвращает (r00, r01, r02, r10, r11, r12, r20, r21, r22). + Формула из rbx-dom: + orientation_id = (rx_axis * 6) + ry_axis + 1 + где rx_axis, ry_axis ∈ {0..5} = (R0, R1, R2, R3, R4, R5): + R0 = +X, R1 = +Y, R2 = +Z, R3 = -X, R4 = -Y, R5 = -Z + + rx — это направление куда смотрит локальная +X ось куба (правая грань), + ry — направление куда смотрит локальная +Y ось (верхняя грань). + + Возвращает (r00, r01, r02, r10, r11, r12, r20, r21, r22) row-major. + Матрица собирается так: rx, ry, rz это столбцы. """ - # Таблица из rbx-dom. Каждое значение — пара (rx_axis, ry_axis) где - # значения в {0,1,2,3,4,5} = +X, -X, +Y, -Y, +Z, -Z + # Правильный порядок axes (rbx-dom): + # 0=+X, 1=+Y, 2=+Z, 3=-X, 4=-Y, 5=-Z AXES = [ - (1, 0, 0), (-1, 0, 0), - (0, 1, 0), (0, -1, 0), - (0, 0, 1), (0, 0, -1), + (1, 0, 0), # +X + (0, 1, 0), # +Y + (0, 0, 1), # +Z + (-1, 0, 0), # -X + (0, -1, 0), # -Y + (0, 0, -1), # -Z ] - # orientation_id = 1..24 (1-based) - if not (1 <= orientation_id <= 24): - # Неверный id — возвращаем identity + # orientation_id = 1..36 (некоторые комбинации rx==ry невалидны, в файлах + # не встречаются — но id может доходить до 6*6 = 36, не 24). + if not (1 <= orientation_id <= 36): return (1, 0, 0, 0, 1, 0, 0, 0, 1) idx = orientation_id - 1 @@ -581,16 +592,14 @@ def _cframe_orientation_to_matrix(orientation_id: int) -> tuple: ry_idx = idx % 6 rx = AXES[rx_idx] ry = AXES[ry_idx] - # rz = rx × ry (cross product) + # rz = rx × ry (cross product) — третий столбец rz = ( rx[1] * ry[2] - rx[2] * ry[1], rx[2] * ry[0] - rx[0] * ry[2], rx[0] * ry[1] - rx[1] * ry[0], ) - # Матрица: первые 3 — first row (R_xx, R_yx, R_zx) - # Сложновато; берём из rbx-dom convention: первые три — основа R*XAxis, - # затем R*YAxis, затем R*ZAxis. Расширяем в row-major form. - # На практике: orientation вектора (rx, ry, rz) — это **столбцы** матрицы. + # rx, ry, rz — это СТОЛБЦЫ матрицы. + # row-major: [r00=rx[0], r01=ry[0], r02=rz[0], r10=rx[1], r11=ry[1], r12=rz[1], ...] r00, r10, r20 = rx r01, r11, r21 = ry r02, r12, r22 = rz