5

画像を 3D オブジェクトに配置/ラップしたい。物事をシンプルかつ高速に保つために、3D ライブラリを使用 (および学習) する代わりに、マッピング画像を使用したいと考えています。マッピング イメージは次のように使用されます。

マッピングの使用

したがって、オブジェクトごとに 1 回マッピング イメージを生成し、ラップするすべてのイメージに同じマッピングを使用します。

私の質問は、(3D モデルが与えられた場合) どのようにそのようなマッピング画像を生成できますか? 専門用語がわからないので、検索に失敗しました。間違った専門用語を使用している場合は申し訳ありません。

以下に、ワークフローの説明を示します。
ここに画像の説明を入力
オブジェクトの 3D モデルと入力画像があり、テクスチャ画像の生成に使用できるマッピング画像を生成したいと考えています。

どこから始めればよいかさえわかりません。

より詳しい情報

私の最初のアイデアは、外部プログラムを使用して ID マッピング (以下を参照) をラップすることでした。Photoshop で生成された画像を使用してマッピングが機能するかどうかを確認するためだけに、Photoshop で水平方向および垂直方向のグラデーション画像を生成しました。結果は良くありません。期待はしていませんでしたが、試してみる価値はありました。

入力
ここに画像の説明を入力

マッピング (x と y) は画像のサイズを変更するだけで、特別なことは何もしません。
ここに画像の説明を入力 ここに画像の説明を入力

多くのアーティファクトがあること
ここに画像の説明を入力
がわかります。グラデーションをワープして生成したカスタム マッピング イメージは、見た目がさらに悪くなります。

マッピングに関する詳細情報は次のとおりです: http://www.imagemagick.org/Usage/mapping/#distortion_maps

マッピングに OpenCV remap() 関数を使用しています。

4

2 に答える 2

1

もし私がここであなたのことを理解したら、あなたはそれをすべて 2D でやりたいですか?

各キューブ サーフェスに対して warpPerspective() を呼び出すと、remap() を使用するよりもはるかに成功します。

擬似コードの概要:

// for each surface:
//  get the desired src and dst polygon
//  the src one is your texture-image, so that's:
     vector<Point> p_src(4), p_dst(4); 
     p_src[0] = Point(0,0); 
     p_src[1] = Point(0,src.rows-1); 
     p_src[2] = Point(src.cols-1,0);
     p_src[3] = Point(src.cols-1,src.rows-1);
// the dst poly is the one you want textured, a 3d->2d projection of the cube surface.
// sorry, you've got to do that on your own ;(
// let's say, you've come up with this for the cube - top:
     p_dst[0] = Point(15,15); 
     p_dst[1] = Point(44,19); 
     p_dst[2] = Point(56,30);
     p_dst[3] = Point(33,44);

// now you need the projection matrix to transform from one to another:
Mat proj = getPerspectiveTransform( p_src, p_dst );

// finally, you can warp your texture to the dst-polygon:
warpPerspective(src, dst, proj, dst.size());

「Learning Opencv」の本を入手できれば、p 170 あたりに記載されています。

アーティファクトについて不満を言っているので、最後に警告します-はい、すべてかなり安っぽく見えます.「本物の」3Dエンジンは、サブピクセル-UVマッピング、フィルタリング、ミップマッピングなど、ここで多くの作業を行います。必要に応じて見栄えが良いので、「本物」を使用することを検討してください。

ところで、opencvには素晴らしいopenglサポートが組み込まれています

于 2013-02-18T10:11:17.763 に答える
1

目的を達成するには、3D モデルの UV をテクスチャにレンダリングする必要があります。この方法で物事を行うよりも、3D のレンダリングを学ぶ方が簡単です。特にあなたのアプローチには多くの弱点があるためです。照明が難しく、深度バッファが豊富になるまでの問題があります。

すべてのオブジェクトが 1 つの角度からしか表示されないと仮定すると、それぞれを 3 つのテクスチャにレンダリングする必要があります。

UV-map
Normal-map
Depth-map (深度バッファを修正するため)

これらを描画してオブジェクトのように見せるには、まだシェーディングを行う必要があります。また、深度バッファを行う方法さえ知りません。それができることはわかっています。

したがって、3D の学習を避けるためには、3D レンダリングの難しい部分をすべて学習する必要があります。簡単なルートではないようです...

于 2013-02-25T08:47:03.183 に答える