Затем я попытался бы создать свои собственные манипуляторы (создать новые классы, которые заменят TrackBall Manipulator из 3DTools), чтобы сделать это.Например, в прошлом я выполнял масштабирование / панорамирование, вращение вокруг цели, свободное вращение, свободное перемещение, вращение объекта, преобразование объекта и т. Д., Выполняя простые манипуляции с матрицами / векторами.
Для вашегоНапример, вам нужно вычислить нормаль, которая ортогональна плоскости между Camera-> Target и вектором мира вверх.это даст вам вектор, который «параллелен» сверху камеры, как локальная ось X, если вы смотрите на экран.Используя этот вектор, вы можете ограничить движение куба в этом направлении.
Для этого вычисляем вектор V от камеры к цели.Это достигается вычитанием местоположения объекта из местоположения камеры.Затем вычислите вектор для перевода в сторону следующим образом:
Для заданного вектора вашей камеры: v = xi, yj, zk
Нормализовать вектор, v '= xi, yj, zk / sqrt (xi ^ 2 + yj ^ 2 + zk ^ 2)
Пусть U = глобальный мир вверх вектор u = 0, 0, 1
Тогда мы можем вычислить R = ГоризонтальныйВектор, параллельный направлению обзора камеры
R = v' ^ U, where ^ is the cross product, given by
a ^ b = (a2b3 - a3b2)i + (a3b1 - a1b3)j + (a1b2 - a2b1)k
Это даст вам вектор, который выглядит следующим образом.
Теперь вы знаете этот вектор R, когда вы перемещаете мышь влево / вправо, вы можете использовать его для перемещения объекта.Например, в псевдокоде:
// Pseudocode
onMouseMove()
{
// Using calculation for R vector above
Vector r = calulateVector();
// Assuming passed in the number of points to translate
// (or some derivative of mousemove)
let int pts = mousePointsMovedLeftOrRight;
// Perform a translate in direction of R
Vector targetPosition = TargetObject.PositionVector;
targetPosition.X += r.X * pts;
targetPosition.Y += r.Y * pts;
targetPosition.Z += r.Z * pts;
}
У меня дома на ноутбуке есть код, который может это сделать (это OpenGL, но тот же принцип - обеспечивает различные манипуляции с объектами и камерой в трехмерном пространстве).Пожалуйста, не стесняйтесь связаться со мной / комментарий, если вы хотите узнать больше.
С уважением,