Может ли кто-нибудь дать мне несколько советов или предложений
Мне нужно найти, насколько объект на фотографии переместился из одного положения в другое ( ну, на самом деле мне нужно рассчитать, насколько камера сместилась между двумя изображениями, но поскольку объект будет оставаться неподвижным и просто вращаться вокруг своей оси Y, я думаю, что будет легче перемещать изображение) Почти так же, как в этом примере. но не так сложно.
Итак, я делаю первую фотографию кубика Рубика и выделяю 4 точки на кубике, как в примере здесь. Изображение представляет собой Texture2D, а синие круги представляют 4 точки передней грани куба, выбранные пользователем. Эти 4 точки сохраняются в списке и загружается следующее изображение, которое выглядит так Снова пользователь должен выбрать 4 точки того же лица, что и в предыдущем случае (белое лицо).Затем эти 4 точки сохраняются в новый список.
Итак, теперь у меня есть два списка, и мне нужно рассчитать, насколько «вся лицевая сторона» сместилась (повернуть/масштабировать/перевести) с изображения 1 на изображение 2, как показано здесь.
Но что более важно, мне нужно рассчитать это движение в 3D! Итак, для первого изображения я предполагаю, что z-компонент = 0. Например, я предполагаю, что верхний левый угол изображения 1 =, например. (10, 10, 0).
Есть ли способ, которым я могу «предполагать», что если лицо изображения 2 повернуто/масштабировано/перемещено определенным образом, его можно перемещать в трехмерном пространстве? Таким образом, если верхний левый угол изображения 2 находится справа от верхнего левого угла изображения 1 (исходное изображение), камера, должно быть, сместилась вправо. И то же самое будет идти вверх или вниз по точкам? Что касается поворота, могу ли я рассчитать углы между точками изображения 1 и углами между точками изображения 2 и каким-то образом рассчитать, насколько повернулась камера?
Для моего кода я думал что-то вроде этого?
// 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);
А для перекоса (я немного застрял)....
// Rotation
Matrix rotation = Matrix.CreateFromAxisAngle(
Vector3.Normalize(new Vector3(?, ?, ?)), MathHelper.ToRadians(?)); // Not sure here
List<Vector3> imageAfterRotation = transformListOfVertices(cube, rotation);