Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2017, 23:16   #1
KhNJu
 
Регистрация: 12.03.2017
Сообщений: 5
По умолчанию Построение октаэдра (OpenGL)

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

Код:
#include "stdafx.h"
#include <GL/glut.h>

int R = 1; // радиус

// Нумерация элементов массивов vertices (присвоение вершинам номера от 0 до 7) и colors. Составляем из вершин треугольники - грани (а1, а2, а3, а4, а5, а6, а7, а8)
GLubyte a1[] = { 0, 1, 2 }; 
GLubyte a2[] = { 1, 3, 2 }; 
GLubyte a3[] = { 0, 4, 1 }; 
GLubyte a4[] = { 1, 4, 3 }; 
GLubyte a5[] = { 0, 5, 2 }; 
GLubyte a6[] = { 2, 5, 3 };
GLubyte a7[] = { 0, 5, 4 };
GLubyte a8[] = { 5, 4, 3 };

void setupPointers(void)
{   //координаты вершин октаэдра; по 3 координаты для каждой вершины
	static GLint vertices[] = { -R, 0, 0,
		0, 0, R,
		0, R, 0,
		R, 0, 0,
		0, -R, 0,
		0, 0, -R };

	static GLfloat colors[] = { 1.0, 0.2, 0.2,
		0.2, 0.2, 1.0,
		0.8, 1.0, 0.2,
		0.75, 0.75, 0.75,
		0.35, 0.35, 0.35,
		0.5, 0.5, 0.5	};
	//включение массивов вершины и цвета
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);
	//указываем размер этих массивов (сколько элементов будет прочитано за один проход)
	glVertexPointer(3, GL_INT, 0, vertices); //3 - потому что 3 координаты для каждой вершины
	glColorPointer(3, GL_FLOAT, 0, colors);
}

void display(void)
{
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT);
	glLoadIdentity();
	glTranslatef(20.0, 20.0, -60.0);
	//8 вызовов по числу граней (пронумерованы выше)
	glDrawElements(GL_QUADS, 3, GL_UNSIGNED_BYTE, a1);
	glDrawElements(GL_QUADS, 3, GL_UNSIGNED_BYTE, a2);
	glDrawElements(GL_QUADS, 3, GL_UNSIGNED_BYTE, a3);
	glDrawElements(GL_QUADS, 3, GL_UNSIGNED_BYTE, a4);
	glDrawElements(GL_QUADS, 3, GL_UNSIGNED_BYTE, a5);
	glDrawElements(GL_QUADS, 3, GL_UNSIGNED_BYTE, a6);
	glDrawElements(GL_QUADS, 3, GL_UNSIGNED_BYTE, a7);
	glDrawElements(GL_QUADS, 3, GL_UNSIGNED_BYTE, a8);
	glFlush();
}

void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(120, (GLdouble)w / h, 1.0, 100.0);//насколько широко открыто око камеры (120 градусов)
	glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(350, 350);
	glutInitWindowPosition(100, 100);
	glutCreateWindow(argv[0]);
	setupPointers();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMainLoop();
	return 0;
}
Изображения
Тип файла: png октаэдр.png (49.2 Кб, 100 просмотров)
KhNJu вне форума Ответить с цитированием
Старый 04.04.2017, 06:13   #2
ichi
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 138
По умолчанию

Код рабочий.
Поигрался с параметрами в твоем коде, поставил радиус R=2, вместо

Код:
glTranslatef(20.0, 20.0, -60.0);
написал

Код:
glTranslatef(0.0, 0.0, -5.0);
glRotatef(-50.0, 1.0, 0.0, 0.0);
исправил везде в функции glDrawElements параметр GL_QUADS на GL_TRIANGLES

Смотри поравленный код:

Код:
#include <GL/glut.h>
#include <stdlib.h>


int R = 2;

GLubyte a1[] = { 0, 1, 2 };
GLubyte a2[] = { 1, 3, 2 };
GLubyte a3[] = { 0, 4, 1 };
GLubyte a4[] = { 1, 4, 3 };
GLubyte a5[] = { 0, 5, 2 };
GLubyte a6[] = { 2, 5, 3 };
GLubyte a7[] = { 0, 5, 4 };
GLubyte a8[] = { 5, 4, 3 };

void setupPointers(void)
{
    static GLint vertices[] = { -R, 0, 0,
		0, 0, R,
		0, R, 0,
		R, 0, 0,
		0, -R, 0,
		0, 0, -R };

	static GLfloat colors[] = { 1.0, 0.2, 0.2,
		0.2, 0.2, 1.0,
		0.8, 1.0, 0.2,
		0.75, 0.75, 0.75,
		0.35, 0.35, 0.35,
		0.5, 0.5, 0.5	};

	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);

	glVertexPointer(3, GL_INT, 0, vertices);
	glColorPointer(3, GL_FLOAT, 0, colors);
}

void display(void)
{
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT);
	glLoadIdentity();
	glTranslatef(0.0, 0.0, -5.0);
	glRotatef(-50.0, 1.0, 0.0, 0.0);
	//glTranslatef(20.0, 20.0, -60.0);

	glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, a1);
	glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, a2);
	glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, a3);
	glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, a4);
	glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, a5);
	glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, a6);
	glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, a7);
	glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, a8);
	glFlush();
}

void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(120, (GLdouble)w / h, 1.0, 100.0);
	glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(350, 350);
	glutInitWindowPosition(100, 100);
	glutCreateWindow(argv[0]);
	setupPointers();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMainLoop();
	return 0;
}
Скриншот, что получилось:
Изображения
Тип файла: png ogl_p2.png (14.7 Кб, 97 просмотров)
ichi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение октаэдра (OpenGL) KhNJu Общие вопросы C/C++ 0 02.04.2017 22:17
OpenGL построение куба ZotaC Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 20.02.2012 13:08
Послойное построение в OpenGL skeydee Мультимедиа в Delphi 2 19.12.2011 23:25
Паскаль, графика. Вращение октаэдра вокруг осей координат. San-ch Паскаль, Turbo Pascal, PascalABC.NET 1 28.02.2011 04:25
Вращения закрашиваемого октаэдра kast333 Паскаль, Turbo Pascal, PascalABC.NET 0 10.07.2009 21:53