4

Imagen 我有一个 2D 点 (x,y) 列表,用于在我的简单游戏中描述 2D 地形。然后我有 glVertex() 在 GL_POINTS 模式下绘制所有这些点。

然后我有一个球,它也有它的 (x,y) 坐标。

我希望球相对于其他一切(例如地形)具有确定的大小。我应该如何设置 (x,y) 坐标的值来绘制我想要的所有大小?拥有 600x400 的屏幕。

我也很困扰,因为 glVertex2f(1,1) 会在右上角绘制一个原始点。所以 1 代表 100% 向右或向上。但是屏幕是 600x400,所以我不能在 x 和 y 轴上具有相同长度的尺寸。

4

2 回答 2

0

由于 0 是 0%(绝对左/下)而 1 是 100%(绝对右/上),您只需要在两者之间找到一个与像素对齐的点。

例如。假设你的球是 20x20 像素。这意味着它是屏幕高的 5% 和屏幕宽的 3.33%。因此,围绕您的球的正方形将具有以下顶点:

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);
}

看看我是如何将球的宽度除以屏幕的宽度来获得一个适用于 glVertex2f 的浮点值?此外,ball.x 和 ball.y 应该是介于 0 和 1 之间的浮点值。

我将这些数字除以 2,因为我假设 (ball.x, ball.y) 是球中心的坐标,所以加法的一半在中心的两侧。

于 2011-04-27T18:35:21.023 回答
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);
于 2016-08-02T10:20:47.580 回答