Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Здравствуйте. Спасибо за проект. У меня вопрос, по какой причине определение принадлежности точки многоугольнику работает некорректно, если координаты из больших чисел состоят, например: int[] vertex = new int[] {...
Сейчас проверила нашла причину не запускания // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; //вот тут...
Ну..кажется что то пошло не так http://pp.usera...
Пример, к которому вы оставили комментарий строит именно то самое изображение на языке с#, которое вам необходимо. Отличается только цветовая палитра.

Счетчики и рейтинг

Рейтинг@Mail.ru
Язык программирования: 
C/C++
Среда программирования: 
Visual Studio 2015

#include <glut.h>
#include <math.h>
#define GL_PI 3.1415
 
GLfloat OX = 200;
GLfloat OY = 200;
GLfloat OZ = 200;
 
GLfloat xRot = 50.0f;
GLfloat yRot = 20.0f;
GLfloat x, y, z, angel;
 
GLfloat sizes[2];//размер точек
GLfloat step;//запоминаем поддерживаемый инкремент точек
GLfloat curSize;//размер текущ точки
 
 
void Draw()
{
	glClear(GL_COLOR_BUFFER_BIT);//очищаем окно исп тек цвет очистки
	glBegin(GL_LINE);
	glNormal3f(0.0, 1.0, 0.0);//нормаль для освещения не будет стоять на месте,
	//она будет поворачиваться вместе с спиралькой под таким же углом
	//можно зафиксировать с помощью glPushMatrix() и glPopMatrix()
	glEnd();
	glPushMatrix();//запоминаем матрицу
	glRotatef(xRot, 0.0f, 1.0f, 0.0f);
	glRotatef(yRot, 0.0f, 1.0f, 1.0f);
	glGetFloatv(GL_POINT_SIZE_RANGE, sizes);//минимальный поддерживаемый размер точки будет возвращен в Sizes [0], а максимальный поддерживаемый размер будет записан в Sizes [ 1 ]
	glGetFloatv(GL_POINT_SIZE_GRANULARITY, &step);//найти наименьший поддерживаемый инкремент между размерами пикселей
	//задаем исходный размер точек
	curSize = sizes[0];
	z = -100.0f;	
	for (angel = 0.0f; angel <= (2.0f*GL_PI)*3.0f; angel += 0.1f)
	{
		x = 100.0f*sin(angel);
		y = 100.0f*cos(angel);
		glPointSize(curSize);
		glBegin(GL_POINTS);
		glColor3ub(255, 128, 0);//золотой
		glVertex3f(x, y, z);//точки спиральки
		glEnd();
		z += 1.0f;
		curSize += step;
	}
	glEnd();
	glPopMatrix();//сброс матрицы
	glutSwapBuffers();//очищаем очередь текущих команд и переключаем буферы
}
 
void Timer(int)
{
	xRot++;
	glutPostRedisplay();//можно заменить на функцию Draw()
	glutTimerFunc(20, Timer, 1);
}
 
void Timer2(int)
{
	yRot++;
	glutPostRedisplay();
	glutTimerFunc(10, Timer2, 1);
}
 
void Init()
{
	glClearColor(0.0, 0.0, 0.0, 1.0);
	glMatrixMode(GL_PROJECTION);//тип матрицы - проекции
	glLoadIdentity();//сброс матриц
	glOrtho(-OX, OX, -OY, OY, -OZ, OZ);//сетка 3Д с началом координат в центре
	glMatrixMode(GL_MODELVIEW);
 
}
 
float ambient[] = {0.3, 0.3, 0.3, 1.0};
float diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
float black[] = {0.0, 0.0, 0.0, 1.0};
float lpos[] = {OX, 0, 0, 1.0};
 
int main(int argc, char** argv)//кол-во аргументов в командной строке,их описание в виде указателя на строку
{
	//инициализация
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowSize(2*OX, 2*OY);
	glutInitWindowPosition(500, 200);
	//glShadeModel(GL_SMOOTH);//режим сглаживания цветов по умолчанию FLAT-не гладко а поп последнему
	glutCreateWindow("3D scene");
	//Регистрация
	glutDisplayFunc(Draw);
	glutTimerFunc(20, Timer, 1);
	glutTimerFunc(10, Timer2, 1);
	glEnable(GL_POINT_SMOOTH);//режим сглаживание точек из квадратных в круглые
 
	glEnable(GL_LIGHTING);//освещение
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, black);//убираем рассеянный свет
	glEnable(GL_LIGHT0);//один источник света
	glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);//тусклый рассеянный свет
	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);//диффузный белый 
	glLightfv(GL_LIGHT0, GL_POSITION, lpos);//расположен в точке lpos
	glEnable(GL_COLOR_MATERIAL);//освещаем окрашенный предмет без текстур
	glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);//спереди и сзади, ведь предмет анимированый, потом указываем, что свет и диффузный и рассеянный
 
	Init();
	glutMainLoop();/* Запуск механизма обработки событий */
	return 0;
}

Прикрепленный файлРазмер
hahulina_demo_spiralka.zip13.31 кб