Изучение уравнений проекции: методы и примеры кода для 3D-графики

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

Методы и примеры кода:

  1. Перспективная проекция.
    Перспективная проекция широко используется для создания реалистичных 3D-сцен. Он имитирует то, как объекты кажутся меньше по мере удаления от зрителя. Ниже приведен пример проекции перспективы в Python с использованием библиотеки Pygame:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
def perspective_projection():
    pygame.init()
    display = (800, 600)
    pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
    gluPerspective(45, (display[0] / display[1]), 0.1, 50.0)
    glTranslatef(0.0, 0.0, -5)
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
        glRotatef(1, 3, 1, 1)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        Cube()
        pygame.display.flip()
        pygame.time.wait(10)
def Cube():
    vertices = (
        (1, -1, -1),
        (1, 1, -1),
        (-1, 1, -1),
        (-1, -1, -1),
        (1, -1, 1),
        (1, 1, 1),
        (-1, -1, 1),
        (-1, 1, 1)
    )
    edges = (
        (0, 1),
        (1, 2),
        (2, 3),
        (3, 0),
        (4, 5),
        (5, 6),
        (6, 7),
        (7, 4),
        (0, 4),
        (1, 5),
        (2, 6),
        (3, 7)
    )
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()
perspective_projection()
  1. Ортографическая проекция.
    Ортографическая проекция – это метод, позволяющий сохранять относительные размеры объектов независимо от их расстояния. Он широко используется в инженерных и архитектурных приложениях. Вот пример орфографической проекции с использованием библиотеки Three.js в JavaScript:
const scene = new THREE.Scene();
const camera = new THREE.OrthographicCamera(
  window.innerWidth / -2,
  window.innerWidth / 2,
  window.innerHeight / 2,
  window.innerHeight / -2,
  1,
  1000
);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.z = 5;
function animate() {
  requestAnimationFrame(animate);
  cube.rotation.x += 0.01;
  cube.rotation.y += 0.01;
  renderer.render(scene, camera);
}
animate();
  1. Параллельная проекция.
    Параллельная проекция, также известная как ортогональная параллельная проекция, аналогична ортогональной проекции, но не учитывает перспективу. Его часто используют в технических чертежах и компьютерном проектировании. Вот пример параллельного проецирования с использованием библиотеки OpenGL на C++:
#include <GL/glut.h>
void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glBegin(GL_TRIANGLES);
    glColor3f(1.0, 0.0, 0.0);
    glVertex3f(-0.6, -0.4, 0.0);
    glColor3f(0.0, 1.0, 0.0);
    glVertex3f(0.6, -0.4, 0.0);
    glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.6, 0.0);
    glEnd();
    glFlush();
}
int main(int argc, char argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(400, 400);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Parallel Projection");
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

Уравнения проекции необходимы для преобразования 3D-объектов в 2D-представления в области компьютерной графики. В этой статье мы исследовали три распространенных метода проекции: перспективную проекцию, ортогональную проекцию и параллельную проекцию. Мы предоставили примеры кода на Python, JavaScript и C++, чтобы продемонстрировать реализацию этих методов. Понимая и применяя эти уравнения проекции, разработчики могут создавать визуально привлекательную и реалистичную 3D-графику.