16

誰かが私にいくつかのアドバイスや提案を与えることができます

写真内のオブジェクトがある位置から別の位置にどれだけ移動したかを調べる必要があります(実際には、カメラが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);
4

1 に答える 1

2

ワールドマトリックス*ビューマトリックス(カメラの)*プロジェクション(カメラの)=変換マトリックス

cube1=初期位置と仮定します。
レンダリング中に何が起こるかは次のとおりです。cube1*transformMatrix=出力行列

私があなたの正解を理解している場合:あなたの入力は、ユーザーがカメラマトリックス(ビュー)のみを変更することを許可します
(そしてカメラ=ビュー*プロジェクション)そしてあなたはカメラが更新された後の立方体の新しい変換を見つけたいと思います。

したがって、反転操作を行う必要があります。

outputmatrix / transformMatrix = cube1マトリックス(必要な新しいマトリックス)

新しいcube1結果マトリックスから、角度、動きなどを抽出できます。

したがって、問題は、実装方法ではなく、実装する「内容」に関連しています。
(私はあなたが必要なコマンドとコードに精通しているのを見ます)

これがお役に立てば幸いです。

于 2012-04-04T15:55:32.587 に答える