Как нарисовать заполненную оболочку в виде конуса в OpenGL (используя GLUT)?

StackOverflow https://stackoverflow.com/questions/237899

  •  04-07-2019
  •  | 
  •  

Вопрос

Я использую freeglut для рендеринга opengl...

Мне нужно нарисовать оболочку, похожую на конус (2D), который должен быть заполнен определенным цветом и применена некоторая прозрачность.

Оснащен ли freeglut toolkit такой встроенной функциональностью для рисования заполненных геометрий (или каким-то трюком)?или есть какой-то другой api, который имеет встроенную поддержку заполненных геометрий..

Редактировать 1: просто чтобы прояснить ситуацию с двумерным конусом...оболочка - это графическая интерпретация зоны покрытия самолета во время перехвата (вражеского самолета)...это напоминает сектор круга. вместо этого я должен был упомянуть сектор..

и glutSolidCone мне не помогает, так как я хочу нарисовать заполненный сектор круга...что я уже сделал...что осталось сделать, так это залить его каким-нибудь цветом...как заполнить геометрию цветом в opengl?

Редактировать 2: Все ответы, опубликованные на эти вопросы, могут в какой-то степени подойти к моей проблеме..Но я бы определенно хотел знать способ, как залить геометрию каким-нибудь цветом.Скажем, если я хочу нарисовать оболочку, которая является parabola...in в этом случае не было бы функции glut по умолчанию для фактического рисования заполненной параболы (или она есть?)..Итак, чтобы обобщить этот вопрос ... как нарисовать пользовательскую геометрию каким-нибудь сплошным цветом?

Редактировать 3: Ответ, который опубликовал mstrobl, работает для GL_TRIANGLES, но для такого кода:

glBegin(GL_LINE_STRIP);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

который рисует квадрат...рисуется только проводной квадрат ... мне нужно залить его синим цветом.

в любом случае, чтобы это сделать?

если я введу несколько команд рисования для замкнутой кривой..как круг .. и мне нужно заполнить его цветом, есть ли способ сделать это возможным...

я не знаю, как это возможно для GL_TRIANGLES...но как это сделать для любой замкнутой кривой?

Это было полезно?

Решение

При редактировании 3:Насколько я понимаю ваш вопрос, вы хотите, чтобы OpenGL рисовал границы, и все, что между ними, должно быть заполнено цветами.

Идея, которая у вас была, была правильной, но линейная полоса - это всего лишь полоса линий, и у нее нет никакой площади.

Однако вы можете соединить линии друг с другом, чтобы определить многоугольник.Это заполнит площадь многоугольника для каждой вершины.Адаптация вашего кода:

glBegin(GL_POLYGON);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

Однако, пожалуйста, обратите внимание, что рисование многоугольника таким способом имеет два ограничения:

  • Многоугольник должен быть выпуклым.
  • Это медленная операция.

Но я предполагаю, что вы просто хотите выполнить свою работу, и это сделает это.На будущее вы могли бы рассмотреть возможность простой триангуляции вашего многоугольника.

Другие советы

Я не уверен, что вы подразумеваете под "оболочкой", но конус - это примитив, которым обладает glut:

glutSolidCone(radius, height, number_of_slices, number_of_stacks)

Самый простой способ залить его цветом - это нарисовать его цветом.Поскольку вы хотите сделать его несколько прозрачным, вам также нужно альфа-значение:

glColor4f(float red, float green, float blue, float alpha)
// rgb and alpha run from 0.0f to 1.0f; in the example here alpha of 1.0 will
// mean no transparency, 0.0 total transparency. Call before drawing.

Чтобы сделать изображение полупрозрачным, необходимо включить смешивание.И вы должны настроить функцию смешивания на использование.То, что вы хотите сделать, вероятно, будет достигнуто с помощью следующего.Если вы хотите узнать больше, напишите мне комментарий, и я поищу несколько полезных советов.Но вот начинается ваша настройка:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Вызовите это перед выполнением каких-либо операций рисования, возможно, при инициализации программы.:)

Поскольку вы уточнили свой вопрос, попросив принести пирог:есть простой способ нарисовать это тоже с помощью примитивов opengl:

Вы бы нарисовали сплошную сферу, используя gluSolidSphere().Однако, поскольку вы хотите нарисовать только его часть, вы просто удаляете ненужные части:

void glClipPlane(GLenum plane, const GLdouble * equation);

С плоскостью, равной GL_CLIPPLANE0 для GL_CLIPPLANEn , и уравнением, представляющим собой плоское уравнение в нормальной форме (ax + by + c * z + d = 0 означало бы, что уравнение будет содержать значения { a, b, c, d }.Пожалуйста, обратите внимание, что это двойные значения, а не плавающие.

Я помню, что для этого существовала подпрограмма.Но это не так уж сложно сделать самому.

Но я не понимаю, что такое 2D-формат.Конус в 2D?Разве это не просто треугольник?

В любом случае, вот алгоритм рисования конуса в opengl

Сначала возьмите круг, разделите его равномерно так, чтобы у вас получилось хорошее количество краев.Теперь выберите центр круга, сделайте треугольники от краев к центру круга.Затем выберите точку над окружностью и сделайте треугольники от краев до этой точки.

Размер, форма и ориентация зависят от значений, которые вы используете для создания окружности и двух точек.Каждый шаг довольно прост и не должен вызвать у вас затруднений.

Сначала просто разделите скалярное значение.Начните с [0-2] - диапазона.Возьмите среднюю точку ((начало + конец) / 2) и разделите с ней диапазон.Храните значения в виде пар.Например, однократное разделение должно дать вам:[(0,1), (1,2)] Проделайте это рекурсивно пару раз, затем вычислите, какие эти точки находятся на окружности.Простая тригонометрия, просто не забудьте умножить значения на π, прежде чем продолжить.После этого у вас будет определенное количество ребер.2^ n, где n - количество подразделений.Затем вы можете просто превратить их в треугольники, придав им на одну вершинную точку больше.Таким образом, количество треугольников в конечном итоге равно:2^(n+1).(Суммы полезны, чтобы знать, делаете ли вы это с массивами фиксированного размера.

Редактировать: Чего ты действительно хочешь, так это пирога.(Извините за каламбур)

Это так же просто визуализировать.Вы снова можете использовать только треугольники.Просто выберите скалярный диапазон [-0.25 - 0.25], разделите, спроецируйте на окружность и сгенерируйте один набор треугольников.

Проекция скалярной окружности проста следующим образом:x=cos(v*pi)r, y=sin(vpi)* r, где (x, y) - результирующая точка вершины, r - радиус, а тригонометрические функции работают с радиантами, а не с градусами.(если они работают с градусами, замените число пи на 180)

Используйте буферы вершин или списки, чтобы отрисовывать их самостоятельно.

Редактировать:По поводу вопроса о расцветке.glColor4f, если вы хотите, чтобы некоторые части геометрии отличались по цвету, вы можете назначить цвет для каждой вершины в самом буфере вершин.Прямо сейчас я не знаю всех вызовов API для этого, но ссылка на API в opengl вполне понятна.

О правке в отношении цветов:

OpenGL на самом деле является конечным автоматом.Это означает, что при рисовании используется текущее положение материала и /или цвета.Поскольку вы, вероятно, не будете использовать материалы, не обращайте на это внимания.Тебе нужны цвета.

glColor3f(float r, float g, float b) // draw with r/g/b color and alpha of 1
glColor4f(float r, float g, float b, float alpha)

Это повлияет на цвета любых вершин, которые вы рисуете, любой геометрии, которую вы визуализируете - будь то glu или ваша собственная, - после выполнения вызова glColorXX.Если вы рисуете грань с вершинами и меняете цвет между вызовами glVertex3f / glVertex2f, цвета интерполируются.

Попробуй это:

glBegin(GL_TRIANGLES);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(-3.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 3.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(3.0, 0.0, 0.0);
glEnd();

Но я уже указал на glColor4f, поэтому предполагаю, что вы хотите задать цвета для каждой вершины.И вы хотите визуализировать с помощью отображаемых списков.

Точно так же, как вы можете отображать списки вершин, вы также можете сделать так, чтобы они имели список цветов:все, что вам нужно сделать, это включить списки цветов и сообщить opengl, где находится этот список.Конечно, они должны иметь тот же комплект, что и список вершин (в том же порядке).

Если бы у вас было

glEnableClientState(GL_VERTEX_ARRAY);   
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glDisableClientState(GL_VERTEX_ARRAY);

вы должны добавлять цвета таким образом.Они не должны быть плавающими;фактически, вы указываете ему, в каком формате он должен быть.Для списка цветов с 1 байтом на канал и 4 каналами (R, G, B и A) используйте это:

glEnableClientState(GL_VERTEX_ARRAY);   
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors_);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

Редактировать:Забыл добавить, что затем вы должны указать OpenGL, какие элементы рисовать, вызвав Элементы glDrawElements.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top