Как сделать проекцию 3д точки на 2д поверхность экрана «вручную» (си glut)?

Для того чтобы сделать проекцию 3D точки на 2D поверхность экрана «вручную» с использованием библиотеки GLUT на языке программирования C, вам потребуется выполнить несколько шагов. Давайте рассмотрим каждый из них подробнее.

1. Импортирование необходимых библиотек:

   #include <GL/glut.h>
   #include <math.h>

2. Объявление глобальных переменных:

   GLfloat angleX = 0.0f;   // Угол по оси X
   GLfloat angleY = 0.0f;   // Угол по оси Y
   GLfloat distanceZ = 5.0f;   // Расстояние по оси Z

3. Функция рендеринга:

   void renderScene(void) {
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) // Очистка буфера цвета и буфера глубины
       glLoadIdentity();   // Сброс текущей матрицы модели
       gluLookAt(0.0f, 0.0f, distanceZ, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f)    // Установка вида камеры

       glRotatef(angleX, 1.0f, 0.0f, 0.0f);   // Поворот по оси X
       glRotatef(angleY, 0.0f, 1.0f, 0.0f);   // Поворот по оси Y

       glBegin(GL_POINTS);   // Рисование точки
       glVertex3f(0.0f, 0.0f, 0.0f);   // Координаты точки
       glEnd();

       glFlush();   // Выталкивание всех команд в буфер
   }

4. Функция изменения размеров окна:

   void changeSize(int width, int height) {
       if (height == 0) height = 1;   // Предотвращение деления на ноль
       GLfloat aspectRatio = (GLfloat)width / (GLfloat)height;

       glViewport(0, 0, width, height);   // Установка порта вывода размером с окно

       glMatrixMode(GL_PROJECTION);   // Установка матрицы проекции
       glLoadIdentity();   // Сброс текущей матрицы проекции

       gluPerspective(45.0f, aspectRatio, 0.1f, 100.0f);   // Установка перспективного проецирования

       glMatrixMode(GL_MODELVIEW);   // Установка матрицы модели
       glLoadIdentity();   // Сброс текущей матрицы модели
   }

5. Обработка событий клавиатуры:

   void processSpecialKeys(int key, int x, int y) {
       switch (key) {
           case GLUT_KEY_LEFT:   // Движение влево
               angleY -= 0.1f;
               break;
           case GLUT_KEY_RIGHT:   // Движение вправо
               angleY += 0.1f;
               break;
           case GLUT_KEY_UP:   // Движение вверх
               angleX -= 0.1f;
               break;
           case GLUT_KEY_DOWN:   // Движение вниз
               angleX += 0.1f;
               break;
       }
       glutPostRedisplay();   // Перерисовка сцены
   }

6. Функция инициализации:

   void init(void) {
       glClearColor(0.0f, 0.0f, 0.0f, 0.0f);   // Установка цвета очистки экрана
       glEnable(GL_DEPTH_TEST);   // Включение буфера глубины
   }

7. Главная функция:

   int main(int argc, char** argv) {
       glutInit(&argc, argv);   // Инициализация библиотеки GLUT
       glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGB);   // Установка режима отображения
       glutInitWindowSize(800, 600);   // Установка размеров окна
       glutCreateWindow("3D Projection");   // Создание окна с названием

       glutDisplayFunc(renderScene);   // Установка функции рендеринга
       glutReshapeFunc(changeSize);   // Установка функции изменения размеров окна

       glutSpecialFunc(processSpecialKeys);   // Установка функции обработки событий клавиатуры

       init();   // Инициализация

       glutMainLoop();   // Основной цикл GLUT
       return 0;
   }

Вы можете запустить этот код и увидеть 3D точку, которая будет отображаться на 2D экране с возможностью вращения и масштабирования сцены при помощи клавиш клавиатуры. При желании, вы можете изменять или расширять этот код под свои нужды.