Как сделать шар opengl

Обновлено: 08.07.2024

Я хочу сделать простую игру с OpenGL, это о перемещении объекта на экране, и когда я нажимаю какую-то клавишу, он будет расти. Поэтому я делаю сферу, и я хочу заменить ее изображением.

Есть ли способ заменить сферу (движущийся шар) в коде ниже с изображением?, я пытался использовать некоторые библиотеки, такие как SOIL, но, к сожалению, это не сработало со мной.

Вы можете использовать библиотеку STB для загрузки растрового изображения из файла. Следующий код загружает растровое изображение из файла, создает объект текстуры OpenGL и загружает растровое изображение в объект. В этом случае битмап представляет собой 24-битный файл BMP BMP:

Чтобы обернуть текстуру вокруг сферы, вы должны распределить координаты текстуры квадратично вокруг сферы. Это обеспечивается gluNewQuadric , gluQuadricTexture и gluSphere . GL_TEXTURE0 изображение должно быть привязано к текстурному блоку 0 ( GL_TEXTURE0 ) и не забудьте включить двухмерное текстурирование ( glEnable( GL_TEXTURE_2D ) ). Поскольку цвет текстуры умножается на текущий цвет, вы должны установить "белый" цвет раньше:

Здравствуйте. У меня простой вопрос: Рисую в OpenGl оси координат и сферу.Затем, с помощью таймера вращаю сферу вокруг своей оси. Проблема в том что вращается и сфера и оси координат. Как мне сделать так что бы вращалась только сфера? В общем вот что я делаю:

lazybiz

Ну тут ты вообще бреданул. Таймер сферу вращать не может)

Выкладывай весь код, либо смотри в сторону glPushMatrix.

Guest

Ну тут ты вообще бреданул. Таймер сферу вращать не может)

Выкладывай весь код, либо смотри в сторону glPushMatrix.

Я написал алгоритм, который генерирует икосаэдр (20 граней, 12 вершин). Далее, применяя метод бисекции к каждому треугольнику нужное количество раз, я получаю сферу нужного "качества". Если данную модель скормить простому шейдеру, то можно увидеть качественный кругленький шарик. Проблемы пошли когда я назначил каждой вершине текстурные координаты и начал семплинг.

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

Текстура это прямоугольник, если этим прямоугольником оборачивать икосаэдр то будет некая условная линия стыка начала и конца прямоугольника текстуры. Линия этого стыка будет проходить через некоторые треугольники икосаэдра. Я не могу понять какие текстурные координаты задавать вершинам такого треугольника. Мы не можем "сместить" текстурные координаты этих верши в начало текстуры или в конец, так как на этих вершинах построены другие треугольники и с ними все в порядке.

Решений я вижу два.

Первое это изменить метод генерации шара так, чтоб у нас вершины на шаре образовывали дуги, к которым я смогу привязать линию стыка текстуры

Второе это треугольники на линии стыка разбить на другие треугольники, чтоб вершины были четко на линии стыка, у них были одинаковые мировые координаты, но разные текстурные координаты.

OpenGL

Продолжается цикл статей, посвященных работе с библиотекой OpenGL на нашем сайте, и, наконец, пришло время подключить третье измерение в наших экспериментах. Сегодня мы создадим в пространстве куб, а также добавим функцию вращения 3D-фигуры вокруг осей x и y. Как всегда разберем все по шагам, а в конце статьи я выложу полный проект с реализованным примером.

За основу давайте возьмем проект из предыдущего урока (ссылка), и, как и тогда, для построения изображения мы сегодня будем использовать массивы вершин, индексов и цветов. Давайте разберем нашу задачу…

Что из себя представляет куб? Ответ прост — 6 граней (квадратов) и 8 вершин ) Именно так мы и будем строить фигуру — построим по отдельности 6 его граней, а эта задача для нас уже не представляет никакой сложности. Но прежде, чем приступать к рисованию, добавим в функцию initializeGL() следующее:

Помните на прошлом уроке, когда мы задавали разные цвета вершин у одной фигуры, то получали красивые переходы между цветами. Так вот сегодня нам это не нужно, грани будут иметь однородный цвет и именно для включения этого режима (а точнее для отключения режима сглаживания цветов) мы вызываем первую из этих функций. Цвет грани у нас теперь будет определяться цветом последней(!) нарисованной вершины квадрата.

Вторая функция устанавливает режим, когда строятся только внешние поверхности фигур. И вот тут есть один важный момент. Для корректного отображения объекта вершины в массиве вершин должны задаваться против(!) часовой стрелки.

Собственно, с приготовлениями на этом заканчиваем, начинаем отрисовку. Нам понадобятся три массива:

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

Мы задали координаты и цвета вершин куба. Давайте для наглядности посмотрим на рисунок:

Рисуем куб в OpenGL

Номера вершин на рисунке полностью соответствуют тому, как мы их задали в нашей программе. Теперь, глядя на картинку можно с легкостью пройтись по всем 6 граням куба и заполнить массив индексов. Давайте смотреть:

  • Грань 1 — вершины 0, 3, 2, 1
  • Грань 2 — вершины 0, 1, 5, 4
  • Грань 3 — вершины 7, 4, 5, 6
  • Грань 4 — вершины 3, 7, 6, 2
  • Грань 5 — вершины 1, 2, 6, 5
  • Грань 6 — вершины 0, 4, 7, 3

Теперь то же самое делаем в программе:

Осталось только вызвать функцию рисования:

Запускаем программу и видим наш куб:

3D изображение в OpenGL

Правда на данный момент он больше похож на квадрат ) Все потому что мы смотрим на куб со стороны оси z и видим его проекцию на плоскость X0Y. Для того, чтобы все-таки увидеть, что это действительно куб, давайте добавим возможность вращать фигуру при удержании кнопки мыши и перемещении ее указателя.

Сделаем так — при перемещении указателя мыши от левого края до правого будем поворачивать куб на 180 градусов. Осталось вычислить, на сколько градусов нужно повернуть фигуру при произвольном перемещении курсора. С этим все просто, получаем формулу:

yAngle = 180 * d / w;

Здесь d — это расстояние, на которое мы переместили курсор, w — ширина нашего окна. Обратите внимание, что при движении мыши вдоль оси x поворот будет осуществляться вокруг оси y, и наоборот, перемещение вдоль y — поворот вокруг x. Итак, сейчас нам нужно получить в программе данные о перемещениях мыши. Для этого переопределим методы:

При нажатии кнопки мыши ( mousePressEvent() ) сохраняем в переменную pressPosition текущие координаты курсора. При перемещениях указателя производим расчет углов поворота, на которые необходимо развернуть куб, а затем вызываем функцию updateGL() для перерисовки сцены в соответствии с полученными данными. Не забываем объявить все используемые методы и переменные в файле MainScene.h.

Функцию updateGL() то мы вызвали, но само собой ничего, естественно, не повернется… Для поворота 3D-фигуры OpenGL предлагает нам следующую функцию:

Здесь первый параметр — угол поворота, а три остальных определяют, вокруг какой из осей необходимо выполнить вращение. То есть если мы сделаем так:

То фигура повернется вокруг оси x на 45 градусов. С этим все понятно, осталось только добавить вызов этой функций к нам в программу, а точнее в функцию paintGL():

Как видите, все оказалось довольно-таки просто! Теперь нам предстоит собрать проект и проверить результат:


На этом заканчиваем сегодняшнюю статью, а уже скоро, а именно в следующем уроке, мы разберемся с текстурами в OpenGL — создадим собственные текстуры и нанесем их на 3D-объекты, так что до скорого, не пропустите новую статью!

Как и обещал, прилагаю архив с полным проектом этого примера: OpenGLTest_Cube.

Я пытаюсь сделать шар света (Как солнце), но я, может казаться, не делаю его видимым вообще. Я дам Вам некоторые отрывки кода, который я имею. Это находится в Java LWJGL, таким образом, это могло бы выглядеть немного отличающимся.

Что еще я должен сделать для создания света видимым?

3 ответа

Свет никогда не виден.

Однако, их влияние на материалы других объектов не видно. Поэтому важно, чтобы все объекты на сцене имели соответствующий набор свойств материала.

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

alt text

Вы захотите просмотреть функции glColorMaterial, так как они являются самым простым способом установки свойств материала.

Как сказал Фрэнк, свет невидим, он просто используется в качестве входа в уравнение освещения, используемое системой рендеринга (hardware/software) для вычисления конечных цветов геометрии.

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

Для получения информации о генерации светового расцвета прочтите это OpenGL Bloom Tutorial, и вот некоторые примеры кода на Java, использующие GLSL для генерации эффекта цветения.

В зависимости от того, хотите ли вы получить эффект полного цветения (если да, посмотрите на ответ Джоша Перри) или просто не темный объект, который, кажется, излучает свет, вы можете рассмотреть этот простой подход.

  • Отправьте сцену без фактической сетки "солнца", но с точечным освещением в центре вашего "солнца".
  • Отключите освещение GL.
  • Отобразите сферу или используйте рекламный щит , чтобы отобразить изображение вашего солнца в соответствующем месте.
  • Повторно включите освещение GL перед отображением следующего кадра.

Так как вы отключили освещение, солнце будет "полноцветным" без каких-либо вычислений по затенению или освещению.

Читайте также: