2017-09-26 5 views
1

私は4つのコーナーからポイントのグリッドを生成しようとしています。このコーナーは自由に置くことができるので、グリッドが視点を持つように見えます。私は(左上から始まる)角が時計回りの順序である処理において、次のコードを書いた4つのコーナーからパースペクティブでグリッドを作成する

PVector[][] setGrid(PVector[] corners, int cols, int rows) { 
    PVector[][] grid = new PVector[rows][cols]; 
    for(int y = 0; y < rows; y++) { 
     float fY = (float)y/(rows - 1); 
     PVector p1 = PVector.lerp(corners[0], corners[3], fY); 
     PVector p2 = PVector.lerp(corners[1], corners[2], fY); 
     for(int x = 0; x < cols; x++) { 
      grid[y][x] = PVector.lerp(p1, p2, (float)x/(cols-1)); 
     } 
    } 
    return grid; 
} 

これは補間点とグリッドを生成し、それはに対応していませんパースペクティブグリッド。すべてのインラインポイントは等距離ですが、最も近いポイントは最も遠く離れている必要があります。

可能であれば私は、Java /処理で、私の答えを明確にする

EDIT

をいくつかの方向性をいただければ幸いです。私は4つのランダムなコーナーポイントを定義し、perspective deformed gridを作成するすべてのポイントを取得したい。 dX1!= dX2の観点から、dY1!= dY2のために注意してください。私が書いたコードは、結果がdX1 = dX2 = ... = dXi、dY1 = dY2 = ... = dYiのように補間されるので、この効果はありません(私はこれを知っていますが、私が必要とすることをする方法を知らない)

私は透視変換について読んだことがありますが、画像を変換する必要はありません。ちょうどgrid points coordinatesを取得する必要があります。

+0

私は本当にわからないんだけど何あなたは尋ねている。切断された関数の代わりに[mcve]を投稿できますか?あなたは何をしようとしているのか模擬してください。どのコード行が期待どおりに動作していませんか? –

+0

私は自分自身を少し説明してみました。希望する結果の図を追加しました – markusand

答えて

0

例の画像では、異なる長さのエッジに沿って不変な線の数を保持することによって、パースペクティブ効果が得られます。それがあなたの実装がするものなので、私は正直にこの問題を見ていません。ここで

はあなたsetGridを呼び出すスケッチ()である:

PVector[] corners; 

void setup(){ 
    size(150,100); 
    corners = new PVector[4]; 
    corners[0] = new PVector(35,20); 
    corners[1] = new PVector(15,height-30); 
    corners[2] = new PVector(width-10,height-10); 
    corners[3] = new PVector(width-30,10); 
    noLoop(); 
} 
void draw(){ 
    background(255); 
    PVector[][] results = setGrid(corners, 9, 9); 
    for(PVector[] pvs : results){ 
    for(PVector pv : pvs){ 
     ellipse(pv.x,pv.y,5,5); 
    } 
    } 
} 

PVector[][] setGrid(PVector[] corners, int cols, int rows) { 
    PVector[][] grid = new PVector[rows][cols]; 
    for(int y = 0; y < rows; y++) { 
     float fY = (float)y/(rows - 1); 
     PVector p1 = PVector.lerp(corners[0], corners[3], fY); 
     PVector p2 = PVector.lerp(corners[1], corners[2], fY); 
     for(int x = 0; x < cols; x++) { 
      grid[y][x] = PVector.lerp(p1, p2, (float)x/(cols-1)); 
     } 
    } 
    return grid; 
} 

...と、結果はほぼ正確にターゲット画像のように見えます。あなたが何か違う何かを見ているなら、おそらく非常に似ている辺の長さを持つグリッドを作成していますか?距離に後退歩道のように - - あなたが定期的に台形に視点を投影したい場合は

、代わりにこのアプローチを検討してください。

+0

私が共有した方法の結果は、本当に必要なものではありません。同じ列または行のポイント間の距離は等距離ですが、ポイントがビューアに近いほど「近く」、「離れている」ほど小さくなる必要があります。 2Dシーンでこの3D効果をシミュレートする何らかのアルゴリズムがあるかどうかわかりません – markusand

+0

上記のmath.stackexchangeの答えのようなアルゴリズムがありますが、擬似3D情報を提供する必要があります。そこに自己解答を見てください。 – JeremyDouglass

関連する問題