2011-04-27 47 views
4

Imagen私は単純なゲームの2D地形を表す2D点(x、y)のリストを持っています。 私はGL_POINTSモードでそれらのポイントをすべて描画するためにglVertex()を使っています。OpenGL - GlVertex相対位置/絶対位置

次に、(x、y)座標も持つボールがあります。

ボールが他のすべてのもの(地形など)に対して一定のサイズになるようにします。 (x、y)座標の値を設定して、すべてのサイズを描画する方法を教えてください。 600x400の画面があります。

glVertex2f(1,1)が右上隅にプリミティブポイントを描画するので、私は困っています。したがって、1は右または上に100%移動することを表します。しかし、画面は600x400なので、x軸とy軸に同じ長さの次元を持つことはできません。

答えて

0

0は0%(絶対左/下)、1は100%(絶対右/上)であるため、その間にある点を見つける必要があります。

たとえば、ボールが20x20ピクセルであるとします。つまり、画面の高さの5%、画面の幅の3.33%です。私はglVertex2fで動作する浮動小数点値を取得するには、画面の幅によってボールの幅を分割していますか

void drawBall() 
{ 
    glVertex2f(ball.x - (20/600)/2, ball.y - (20/400)/2); 
    glVertex2f(ball.x - (20/600)/2, ball.y + (20/400)/2); 
    glVertex2f(ball.x + (20/600)/2, ball.y + (20/400)/2); 
    glVertex2f(ball.x + (20/600)/2, ball.y - (20/400)/2); 
} 

を参照してください。そのため、あなたのボールを囲む広場には、以下の頂点を持っているでしょうか?また、ball.xとball.yは0と1の間の浮動小数点値でなければなりません。

私は(ball.x、ball.y)が追加の半分はセンターのどちらかの側に行きます。

+0

あなたはよく説明しています。しかし、そのような分裂を常に行うことは標準的で共通しているのでしょうか? これは非効率的です。私が定数Kx = 1/600、Ky = 1/400を定義した場合、表記法はコード内で簡単になりますが、非効率な多くの乗算があります。 –

+0

その値(20/600)をball.width、(20/400)をball.heightとして保存します。私は分割のすべてを使っていたので、数字がどこから来ているのか分かりました。 –

+0

ああ、それははるかに良いでしょう。 –

0

あなたが頂点を描画し、その引数内のピクセルを取り、独自の機能を記述することができます。

#define WINDOW_WIDTH 600 
#define WINDOW_HEIGHT 400 
void glVertex_pixels(const double x,const double y){ 
    glVertex2d(x * 2.0/(double)WINDOW_WIDTH - 1.0, 1.0 - y * 2.0/(double)WINDOW_HEIGHT); 
} 

あなたはまた、マクロを使用することができた:

#define WINDOW_WIDTH 600 
#define WINDOW_HEIGHT 400 
#define glVertex_pixels(x,y) glVertex2d((double)(x) * 2.0/(double)WINDOW_WIDTH - 1.0, 1.0 - (double)(y) * 2.0/(double)WINDOW_HEIGHT); 

上記のコードに関係なく、あなたがこの関数の使用は簡単です。たとえば、次のコードでは、左側から10ピクセル、上側から20ピクセルの頂点を描画します。

glVertex_pixels(10,20);