1

私の目的を説明し、提案された解決策についてフィードバックを得たいと思います。私は OpenGL ES (またはまったく OpenGL) にまったく慣れていないので、優しくしてください。また、プラットフォームは iPad (iOS) であり、所属制限があります。

目的:ユーザーが、正しい遠近法 (または少なくとも調整可能な遠近法) でテクスチャを適切に描画する必要がある頂点を配置できるようにすること。私が言いたいことを説明するために、次の例を考えてみましょう。

対応する芝生が前にある家の写真があるとしましょう。今、パースペクティブが正しく見えるように、(ユーザー) 指定のパスをタイル (テクスチャ) で舗装したいと考えています。ビューが直交している場合、タイルは完全に正方形になり、画像に何らかの奥行きがある場合は現実的ではありません。

ここで、1 つのアプローチは、OpenGL ES で錐台を使用して透視図を設定することです。次に、平面 (以下のように) を配置し、その上にイメージ テクスチャを配置します。

イメージ テクスチャを配置する平面

上の画像の外観から予想されるように、画像は歪んでいます。しかし、平面を後方に傾けると (ディスプレイの境界に完全にフィットするように)、画像が正方形に見えるので問題ありません。

ユーザーが舗装する領域を定義した場合、それらの点を傾斜面と同じ角度に配置し、その中に正方形のタイルを含むテクスチャを配置するだけで、遠近法で表示されます。傾斜角が正しくない場合、ユーザーは手動で調整できます。すると、上の図の平面の角の角度が調整され、平面がディスプレイに合わせて異なる角度で傾斜します。タイル テクスチャは、別の角度から表示されます。

これは実行可能なアプローチですか、それともこれを行うための他のより良い方法はありますか? 3D プログラミングのスキルが限られていることに関係しているかもしれない醜いハックだと思います。

4

2 に答える 2

3

画像にパースペクティブを適用するだけなら、OpenGL ES は必要ないかもしれません。この回答で説明した方法で、適切な CATransform3D を作成し、それを UIView または CALayer に設定するだけです。キーはm34、変換マトリックスのコンポーネントです。

OpenGL ES とテクスチャでこれを行いたい場合は、テクスチャ化されたクワッドの頂点に変換を適用して、遠近効果を作成できます。この例を次に示します。

四角形の透視変換

ここでは、カメラ入力を表示するテクスチャを変換して、遠近効果が適用されるようにします。これは、次の頂点シェーダーを使用して行われました。

 attribute vec4 position;
 attribute vec4 inputTextureCoordinate;

 uniform mat4 transformMatrix;
 uniform mat4 orthographicMatrix;

 varying vec2 textureCoordinate;

 void main()
 {
     gl_Position = transformMatrix * vec4(position.xyz, 1.0) * orthographicMatrix;
     textureCoordinate = inputTextureCoordinate.xy;
 }

ここで、次の方法で CATransform3D に基づいてマトリックスを生成しました。

 CATransform3D perspectiveTransform = CATransform3DIdentity;
 perspectiveTransform.m34 = 0.4;
 perspectiveTransform.m33 = 0.4;
 perspectiveTransform = CATransform3DScale(perspectiveTransform, 0.75, 0.75, 0.75);
 perspectiveTransform = CATransform3DRotate(perspectiveTransform, rotation, 0.0, 1.0, 0.0);

次に、CATransform3D を mat4 に変換します (4x4 マトリックスの内部構造を持っているため、これはかなり簡単です)。この動作を確認したい場合は、私のGPUImageフレームワークで FilterShowcase サンプル アプリケーションのコードを取得し、3-D Transform エントリを試してください。コードはすべて GPUImageTransformFilter 内にあり、かなり簡単に理解できるはずです。

于 2012-05-05T03:49:44.503 に答える
0

それが最も簡単な方法です。いずれにせよ、正しい消失点に対して角度を付けた平面を表示する必要があるため、ユーザーに平面を自分で回転させることが実行可能な解決策です。それ以外の場合は、画像処理の問題です。興味があれば、Computer Vision の Vanishing point Determination を調べます。

于 2012-05-05T00:58:38.123 に答える