Продолжение
этого.
Пожалуй, для моих задач наиболее удачной была бы следующая формулировка:
При этом нормой кватерниона будем считать
И тогда поворот вектора при помощи кватерниона сведётся к следующей матрице поворота:
Меня несколько сбило с толку, что отличие от
оригинальной матрицы поворота - всегда в сторону уменьшения коэффициентов!
Да и при умножении кватернионов то же самое: мы считаем, что все значения от -1 до +1, но при этом никогда не появляется сдвигов влево (умножений на 2), исключительно сдвиги вправо!
Это казалось неверным. Ведь если мы производим вращения в пространстве, где оси имеют разный масштаб, то, грубо говоря, первый поворот, переводящий Y в X, должен будет уменьшить значение вдвое, зато обратный к нему - напротив, увеличить вдвое! Кажется, что "умножалка на 2" где-то должна сидеть!
В конце концов, когда мы посмотрели, как преобразуется матрица поворота от изменения масштаба оси, там отчётливо появлялись коэффициенты 2 в одном месте и 1/2 в другом.
Тем не менее, похоже всё сходится...
Первая хитрость в том, что мы ограничили "силу" тех кватернионов, которые ведут к существенному возрастанию координат!
К примеру, у нас был вектор (1;0;0), при том ось X имеет вдвое бОльшую цену деления, чем все остальные, т.е 1 по оси X - это строго 1 метр, а такая же 1 по оси Y - это 0,5 метра.
При этом подобный масштаб справедлив и для кватернионов. Кватернион i, т.е соотв. вектору (0;1;0;0) соответствует вращению вокруг оси X на 180 градусов, а кватернион j, или (0;0;1;0) - вообще не является кватернионом вращения, поскольку его норма равна всего лишь 1/2...
Собственно, самый крупный кватернион вращения вокруг оси Y, который мы можем записать, используя значения от -1 до +1 - это
Его норма (по формуле, данной выше) равна единице!
И выражает этот кватернион поворот на угол 60° вокруг оси Y, что даёт матрицу поворота:
И если этот поворот применить к вектору (1;0;0), получится первый столбец этой матрицы, со значением Z больше единицы по абсолютной величине.
Ранее у нас выполнялось соотношение, что векторы длиной 1, поворачиваемые с помощью кватернионов с единичной нормой, сохраняют свою длину, и если все коэффициенты принимают значения от -1 до +1, то вектор длины 1 заведомо может быть записан!
Но здесь у нас и длина вектора, и норма кватерниона приобретают коэффициент 1/4 для осей Y,Z. Для них всё это остаётся в силе, длина остаётся неизменной, как это и положено при повороте.
Вот только гарантий насчёт того, что вектора влезут в те значения -1..+1, которые выделены им в компьютере - уже нет. Ведь если просто найти корень из суммы квадратов компонентов нашего кватерниона, это получится не 1, а вовсе даже 1,32. А вектор во время поворота кватернионом может возрасти на КВАДРАТ НОРМЫ, т.е и вовсе 1+3/4 = 1,75. И в тех компонентах матрицы, которые никак не поменялись по сравнению с оригинальной, так и вышло... Вот у нас корень из 3 выскочил, который 1,73. Это вторая хитрость.
Что-то в этом есть... Хотя пока не буду торопиться с применением, оставлю это в качестве задела на будущее. Пока по результатам моделирования выходило, что ошибки вычислений составляют около 5% от общей ошибки прибора, который я разрабатываю, главные вклады в которую - "шумы" фотоприёмной матрицы и ошибки в геометрии мишени, по которой мы работаем. Так что рваться устранять эти 5% (тем более, что полностью их этим методом вряд ли удастся устранить, скорее, оторвать 10..20% от этих 5%) пока преждевременно...
Но пока эта идея кружилась в голове, я просто обязан был её изложить на бумаге и в уютном бложеке, чтобы голова освободилась под более полезные на данный момент вещи.