Перемещение с 2D на 3D - программирование
Подтвердить что ты не робот

Перемещение с 2D на 3D

Может ли кто-нибудь дать мне несколько советов или предложений

Мне нужно найти, насколько объект на фотографии перемещается из одной позиции в другую (ну, на самом деле, мне нужно рассчитать, сколько камеры перемещено между двумя изображениями, но поскольку объект останется неподвижным и просто повернется на его Ось Y, я думаю, будет легче перемещать изображение). Совсем так же, как этот пример, но не так сложно. enter image description here

Итак, я беру первую фотографию кубика rubiks и выбираю 4 точки на кубе в соответствии с примером здесь enter image description here Изображение представляет собой Texture2D, а синие круги представляют 4 точки передней поверхности куба, выбранные пользователем. Эти 4 точки хранятся в списке, и загружается следующее изображение, которое выглядит так: enter image description here Опять пользователь должен выбрать 4 точки того же лица, что и предыдущее (белое лицо). Затем эти 4 точки сохраняются в новом списке.

Итак, теперь у меня есть два списка, и мне нужно рассчитать, сколько "целая передняя грань" движется (вращать/масштабировать/переводить) с изображения 1 на изображение 2, как показано здесь enter image description here

Но что более важно, мне нужно вычислить это движение в 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);
4b9b3361

Ответ 1

мировая матрица * матрица просмотра (камеры) * проекция (камеры) = матрица преобразования

Предполагая, что куб1 = начальное положение.
Что происходит во время рендеринга: cube1 * transformMatrix = выходная матрица

Если я понимаю вас правильно: ваш вход позволяет пользователю изменять матрицу камеры (только просмотр),
(и камера = вид * проекция) И вы хотите узнать новое преобразование куба после обновления камеры.

Итак, вам нужно выполнить инвертирование:

матрица outputmatrix/transformMatrix = cube1 (новая, которая вам понадобится)

из новой матрицы результатов cube1 вы можете извлекать углы, движение и т.д.

Итак, ваша проблема больше связана с тем, что нужно реализовать, а не с тем, как ее реализовать.
(поскольку я вижу, что вы знакомы с командами и кодом, которые вам нужны)

Надеюсь, это поможет.