OpenGL - GlVertex относительная / абсолютная позиция - PullRequest
4 голосов
/ 27 апреля 2011

Imagen У меня есть список 2D точек (x, y), которые описывают 2D ландшафт в моей простой игре.Затем у меня есть glVertex (), чтобы нарисовать все эти точки в режиме GL_POINTS.

Затем у меня есть шар, который также имеет координаты (x, y).

Я хочу, чтобы шар имелопределенный размер по отношению ко всему остальному (например, местности).Как мне установить значения координат (x, y), чтобы нарисовать все, что мне нужно?Имея экран 600x400.

Меня беспокоит также то, что glVertex2f (1,1) нарисует примитивную точку в верхнем правом углу.Таким образом, 1 означает перейти на 100% вправо или вверх.Но экран 600х400, поэтому я не могу иметь размеры одинаковой длины по осям x и y.

Ответы [ 2 ]

0 голосов
/ 02 августа 2016

Вы можете написать собственную функцию, которая рисует вершины и принимает пиксели в аргументах:

#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);
0 голосов
/ 27 апреля 2011

Поскольку 0 - это 0% (абсолютный левый / нижний угол), а 1 - 100% (абсолютный правый / верхний), вам просто нужно найти точку между ними, которая будет соответствовать пикселям.

Например. Скажем, ваш мяч размером 20х20 пикселей. Это означает, что он имеет 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) является координатой центра шара, поэтому половина сложения идет по обе стороны от центра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...