void Apart(Quaternion q1, Quaternion q2)
{
var angle = Calc.ToRad(0.4f);
var vector = new Vector3(1, 1, 0); // new Vector(1, 1, 1) if 3d probably!
someObj1.Orientation = q1 * Quaternion.CreateFromAxisAngle(vector, angle);
someObj2.Orientation = q2 * Quaternion.CreateFromAxisAngle(vector, -angle);
}
Это приводит к тому, что сложенные объекты анимируются друг от друга - в моем мобильном приложении создается диагональная линия объектов, которая визуализирует объекты, заданные их Orientation
на экране в 2D.
Таким образом, разделение только в одна ось: var vector = new Vector3(0, 1, 0);
означает: <OO> . <O-O> .. <O--O>
при каждом обновлении
Редактировать :
Фактически vector
пришлось разложить и умножить угол на все оси отдельно.
// where UnitX is (1, 0, 0) and UnitY (0, 1, 0)
someObj1.Orientation = q1 * Quaternion.CreateFromAxisAngle(Vector3.UnitX, xAngle) * Quaternion.CreateFromAxisAngle(Vector3.UnitY, yAngle);
someObj2.Orientation = q2 * Quaternion.CreateFromAxisAngle(Vector3.UnitX, -xAngle) * Quaternion.CreateFromAxisAngle(Vector3.UnitY, -yAngle);
Поскольку мне нужно было разделиться с указанным c углом, а в 2D я мог просто взять проценты от этого угла:
var angle = Calc.ToRad(0.4f);
var makePortions = new Random().NextDouble();
var xAngle = (float)(angle * makePortions);
var yAngle = (float)(angle * (1 - makePortions));
В противном случае изменение угла по оси X перестанет действовать на ориентацию объектов в пределах 180 градусов по оси Y.