2011-11-10 4 views
1

私は、視点で示された地形図を含むOpenGL ES 1でゲームを構築しています。私はマップ上にいくつかのスプライトを描画し、距離に応じて拡大したいと思っています。私はスプライトを描くことができますが、カメラからどのくらい離れていても、常に同じサイズです。OpenGL ESの描画スプライトは、距離に応じて縮尺が変わります。

私はカメラからの距離、ビューポートの幅などに基づいてサイズを動的に計算することができると信じていますが、サイズを自動的に計算する方が好きです。

はここに私のコードです:

GLfloat quadratic[] = { 1.0f, 0.0f, 0.0f }; 
    glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, quadratic); 
    glPointSize(40); 
    glPointParameterf(GL_POINT_SIZE_MAX, maxSize); 
    glPointParameterf(GL_POINT_SIZE_MIN, 1.0f); 
    glTexEnvf(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_TRUE); 
    glEnable(GL_POINT_SPRITE_OES); 

    GLfloat point_array[] = 
    { 
     territoryOrigin.x, territoryOrigin.y, 10.0, 
    }; 
    glVertexPointer(3, GL_FLOAT, 0, point_array); 
    glDrawArrays(GL_POINTS, 0, 1); 

    glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_FALSE); 
    glDisable(GL_POINT_SPRITE_OES); 
+0

このES 1またはES 2ですか? –

+0

ES 1.元の質問を更新します。 –

+0

オルソビューを使用していませんか?あなたの設定でglOrthofまたはglFrustumfを使用しますか? – led42

答えて

1

[OK]を、私はこれを考え出しました。基本的には、ポップアップの角度が現在の表示回転によって決定される「ポップアップ」カットアウトのような役割を果たすクワッドを描きました。次に、図面を実行する際にデプステストを無効にして、描画されている3D地形に切らないようにします。このアプローチの利点は、スケール値を計算する必要がないことです。パースペクティブビューポートに通常の四角形を描いているので、世話をしています。

まず、視野角を0(オーバーヘッド)からpi/2(地上レベル)までのスケールで決定する必要があります。私はこの方程式でこれを行います:

viewingAngle = (currentRotation/90.0) * M_PI_2; 

currentRotationは、私がglRotatefで使用している角度です。視野角が与えられると、クワッドの「ポップアップ」エッジの垂直方向の高さと深さを計算することができます。基本的にはここから単純な三角法です。側面からポップアップカットアウトを見て想像してみてください。固定ベースを有し、水平位置から垂直位置に上昇するエッジを有する。このエッジは、円四分円の輪郭をトレースします。また、任意の点で、位置の値を計算するために使用できる直角三角形を形成します。

上記のスニペットで見られるような角度と斜辺(この場合、ポップアップイメージテクスチャが平らに置かれているかのようにyの高さを知っている場合)は、三角形の反対側に斜角を掛けた角度の罪を掛けます。この値は、ポップアップエッジを地面から持ち上げなければならない深さに相当します。 SIN(角度)=反対/斜辺ので、Iのような「反対」を解くことができる:

popUpValueZ = sinf(viewingAngle) * imageHeight; 

次に、Iは、ポップアップ画像のYサイズを計算するために必要。上の仮想三角形では、これはポップアップアングルに隣接する辺に対応します。そのため、余弦は、その値を計算するために使用されます。

popUpValueY = cosf(viewingAngle) * imageHeight; 

今、私は私の頂点を決定するためにpopUpValueYとpopUpValueZを使用することができます。彼らはそれぞれ私のクワッドの高さと深さとして機能します。視野角が地面に向かって低くなるにつれて、Z値は地面から増加し、Y値は短くなり、水平方向ではなく垂直平面に似ています。

私がしなければならなかった他の事:

glDisable(GL_DEPTH_TEST); 

私は、これらのポップアップ「擬似スプライトは、」3次元地形で戦っていたことがわかったので、私は単にそれらを描画する前にデプステストを無効に。この方法では、パースペクティブビューポート内での位置に基づいて正確にスケールすることができますが、常にそれらの前に描画されたものの上に表示されます。私の場合、私はこれらのスプライトをその前に描かれた地形で塞いでほしいので、地形を近づけるときには深度テストをもう一度有効にしました。

関連する問題