誰かが私にいくつかのアドバイスや提案を与えることができます
写真内のオブジェクトがある位置から別の位置にどれだけ移動したかを調べる必要があります(実際には、カメラが2つの画像間を移動した量を計算する必要がありますが、オブジェクトは静止したままで、Y軸を中心に回転するだけです。画像を動かしやすいと思います)。この例とほとんど同じですが、それほど複雑ではありません。
そこで、ルービックキューブの最初の写真を撮り、ここの例のようにキューブ上の4つのポイントを選択します
。画像はTexture2Dで、青い円はユーザーが選択したキューブの前面の4つのポイントを表しています。これらの4つのポイントがリストに保存され、次のような画像が読み込まれます。
ここでも、ユーザーは前と同じ顔(白い顔)の4つのポイントを選択する必要があります。次に、これらの4つのポイントが新しいリストに保存されます。
これで2つのリストができました。ここに示すように、「前面全体」が画像1から画像2に移動(回転/拡大縮小/移動)した量を計算する必要があります。
しかし、もっと重要なのは、この動きを3Dで計算する必要があるということです。したがって、最初の画像では、z-component = 0と仮定します。たとえば、画像1の左上隅=たとえば(10、10、0)と仮定します。
画像2の面が特定の方法で回転/拡大縮小/平行移動された場合、これを3D空間で移動できると「想定」できる方法はありますか?したがって、画像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);