Может ли кто-нибудь дать мне несколько советов или предложений
Мне нужно найти, насколько объект на фотографии перемещается из одной позиции в другую (ну, на самом деле, мне нужно рассчитать, сколько камеры перемещено между двумя изображениями, но поскольку объект останется неподвижным и просто повернется на его Ось Y, я думаю, будет легче перемещать изображение). Совсем так же, как этот пример, но не так сложно.
Итак, я беру первую фотографию кубика rubiks и выбираю 4 точки на кубе в соответствии с примером здесь Изображение представляет собой Texture2D, а синие круги представляют 4 точки передней поверхности куба, выбранные пользователем. Эти 4 точки хранятся в списке, и загружается следующее изображение, которое выглядит так: Опять пользователь должен выбрать 4 точки того же лица, что и предыдущее (белое лицо). Затем эти 4 точки сохраняются в новом списке.
Итак, теперь у меня есть два списка, и мне нужно рассчитать, сколько "целая передняя грань" движется (вращать/масштабировать/переводить) с изображения 1 на изображение 2, как показано здесь
Но что более важно, мне нужно вычислить это движение в 3D! Поэтому для первого изображения я предполагаю, что z-компонент = 0. Например, я предполагаю, что верхний левый угол изображения 1 = например. (10, 10, 0).
Есть ли способ, который я могу "предположить", если лицо изображения 2 повернуто/масштабировано/переведено определенным образом, что это можно перемещать в трехмерном пространстве? Поэтому, если верхний левый угол изображения 2 находится справа от изображения 1 (начальное изображение) в верхнем левом углу, камера должна перемещаться вправо. И то же самое было бы для вверх или вниз по точкам? Что же касается поворота, могу ли я вычислить углы между изображениями 1 точки и углами между двумя точками изображения и как-то рассчитать, насколько камера повернулась?
Для моего кода я думал что-то вроде этого?
// Image 1 coordinates for the front face
// Assume z = 0
cube1 = new List<Vector3>();
cube.Add(new Vector3(10, 10, 0));
cube.Add(new Vector3(20, 10, 0));
cube.Add(new Vector3(10, 20, 0));
cube.Add(new Vector3(20, 20, 0));
// Get image 2 coordinates
cube2 = new List<Vector3>();
cube.Add(new Vector3(newX, newY, ?)); // Keep Z = 0?
cube.Add(new Vector3(newX, newY, ?));
cube.Add(new Vector3(newX, newY, ?));
cube.Add(new Vector3(newX, newY, ?));
Для перемещения влево или вправо просто подсчитайте, сколько перемещено каждая точка.
//Translation
Matrix translating = Matrix.CreateTranslation(new Vector3(amountMovedX, amountMovedY, 0));
List<Vector3> imageAfterTranslating = transformListOfVertices(imageAfterScaling, translating);
И для перекоса (Im немного застрял)....
// Rotation
Matrix rotation = Matrix.CreateFromAxisAngle(
Vector3.Normalize(new Vector3(?, ?, ?)), MathHelper.ToRadians(?)); // Not sure here
List<Vector3> imageAfterRotation = transformListOfVertices(cube, rotation);