πŸ”§ Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ 3D Π΄Π²ΠΈΠΆΠΎΠΊ Π½Π° Python: пошаговоС руководство

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ 3D Π΄Π²ΠΈΠΆΠΎΠΊ Π½Π° Python Для создания 3D Π΄Π²ΠΈΠΆΠΊΠ° Π½Π° Python Π΅ΡΡ‚ΡŒ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ². Один ΠΈΠ· Π½ΠΈΡ… - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Pygame, которая прСдоставляСт всё Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для создания ΠΈΠ³Ρ€. Π’ΠΎΡ‚ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Pygame для создания 3D Π΄Π²ΠΈΠΆΠΊΠ°:

import pygame
from pygame.locals import *

pygame.init()

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ
screen = pygame.display.set_mode((800, 600), DOUBLEBUF | OPENGL)

# НастраиваСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ OpenGL
glClearColor(0, 0, 0, 1)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LESS)

# Основной Ρ†ΠΈΠΊΠ» ΠΈΠ³Ρ€Ρ‹
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

    # ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ экран ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ отрисовки
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()

    # Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ для отрисовки 3D ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

    pygame.display.flip()
    pygame.time.wait(10)

Π­Ρ‚ΠΎ простой Π·Π°Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°, которая создаСт ΠΎΠΊΠ½ΠΎ ΠΈ настраиваСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ OpenGL. Π’Π½ΡƒΡ‚Ρ€ΠΈ основного Ρ†ΠΈΠΊΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ для отрисовки 3D ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΊΡƒΠ±Ρ‹, сфСры ΠΈ Ρ‚.Π΄. НадСюсь, эта информация ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ созданиС своСго 3D Π΄Π²ΠΈΠΆΠΊΠ° Π½Π° Python! Π£Π΄Π°Ρ‡ΠΈ! πŸš€

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ 3D Π΄Π²ΠΈΠΆΠΎΠΊ Π½Π° Python

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ 3D Π΄Π²ΠΈΠΆΠΊΠ° Π½Π° Python ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ для программистов, ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈΠ³Ρ€ ΠΈΠ»ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ 3D Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим основныС шаги, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ позволят Π²Π°ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ собствСнный 3D Π΄Π²ΠΈΠΆΠΎΠΊ Π½Π° Python.

1. Установка Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ 3D Π΄Π²ΠΈΠΆΠΊΠ°, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ вас установлСны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

  • Pygame - Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для создания ΠΈΠ³Ρ€, содСрТащая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ 2D ΠΈ 3D Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ.
  • NumPy - Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивами ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ опСрациями, часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅.
  • PyOpenGL - Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с OpenGL Π½Π° языкС Python.

УстановитС эти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² pip:

pip install pygame numpy pyopengl

2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° прилоТСния

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Pygame, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ для вашСго 3D ΠΌΠΈΡ€Π°. ΠŸΡ€ΠΈ создании ΠΎΠΊΠ½Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ:

import pygame

# Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Pygame
pygame.init()

# Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠΊΠ½Π°
WIDTH = 800
HEIGHT = 600

# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° Pygame
window = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Мой 3D двиТок")

3. ΠžΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠ° 3D ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Для отрисовки 3D ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²Π°ΠΌ понадобится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ PyOpenGL. НачнСм с Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° .obj:

from OpenGL.GL import *
from OpenGL.GLUT import *

def load_model(filename):
    # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°
    
    ...

model = load_model("model.obj")

ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ OpenGL (Ρ‡Π΅Ρ€Π΅Π· PyOpenGL) для отрисовки ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π° сцСнС:

def draw_scene():
    # ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Π±ΡƒΡ„Π΅Ρ€Π° экрана ΠΈ установка ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ
    
    ...
    
    # ΠžΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ
    glBegin(GL_TRIANGLES)
    for face in model.faces:
        for vertex in face.vertices:
            glVertex3f(*vertex)
    glEnd()

while True:
    # ΠžΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠ° сцСны
    draw_scene()
    
    # ОбновлСниС окна Pygame
    pygame.display.flip()

4. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠ³ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с вашим 3D Π΄Π²ΠΈΠΆΠΊΠΎΠΌ, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ клавиш ΠΈ ΠΌΡ‹ΡˆΠΈ. НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стрСлок Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅:

def handle_events():
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                pygame.quit()
                sys.exit()
            elif event.key == pygame.K_LEFT:
                # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° наТатия стрСлки Π²Π»Π΅Π²ΠΎ
                ...
                
            elif event.key == pygame.K_RIGHT:
                # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° наТатия стрСлки Π²ΠΏΡ€Π°Π²ΠΎ
                ...
                
            elif event.key == pygame.K_UP:
                # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° наТатия стрСлки Π²Π²Π΅Ρ€Ρ…
                ...
                
            elif event.key == pygame.K_DOWN:
                # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° наТатия стрСлки Π²Π½ΠΈΠ·
                ...
                
while True:
    handle_events()
    
    # ΠžΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠ° сцСны ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° Pygame
    draw_scene()
    pygame.display.flip()

5. ΠžΡΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈ тСкстурированиС

Для придания рСалистичности Π²Π°ΡˆΠ΅ΠΌΡƒ 3D ΠΌΠΈΡ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ освСщСниС ΠΈ тСкстурированиС. РСализация этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° Π²Π°Ρ€ΡŒΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ. НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡˆΠ΅ΠΉΠ΄Π΅Ρ€Ρ‹ OpenGL для создания эффСктов освСщСния ΠΈ тСкстурирования:

def setup_lighting():
    # Настройка источников свСта

    ...

def setup_textures():
    # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ настройка тСкстур

    ...

while True:
    setup_lighting()
    setup_textures()
    handle_events()
    draw_scene()
    pygame.display.flip()

6. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° 3D Π΄Π²ΠΈΠΆΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, особСнно Π½Π° устройствах со слабым Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌ обСспСчСниСм ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ отрисовкС слоТных сцСн. Для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ стратСгии:

  • ИспользованиС ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ ΠΎΡ‚ΡΠ΅Ρ‡Π΅Π½ΠΈΡŽ (frustum culling) для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Π³Π΅ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ.
  • Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сцСны Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ рСализация систСмы ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (LOD), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Π³Π΅ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΡŽ дальшС ΠΎΡ‚ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹.
  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²ΠΈΠ΄Π΅ΠΎΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΈ использовании тСкстур.
  • ИспользованиС ΡˆΠ΅ΠΉΠ΄Π΅Ρ€ΠΎΠ² для вычислСний Π½Π° графичСском процСссорС (GPU).

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрСли основныС шаги ΠΏΠΎ созданию 3D Π΄Π²ΠΈΠΆΠΊΠ° Π½Π° Python. ΠœΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ с установки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, создания ΠΎΠΊΠ½Π° прилоТСния, отрисовки 3D ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°, добавлСния освСщСния ΠΈ тСкстурирования, Π° Ρ‚Π°ΠΊΠΆΠ΅ рассмотрСли стратСгии ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. НадСюсь, эта ΡΡ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ для вас Π² ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 3D Π΄Π²ΠΈΠΆΠΊΠΎΠ² ΠΈ создании своих собствСнных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

Π£Π΄Π°Ρ‡ΠΈ Π² Π²Π°ΡˆΠΈΡ… программистских начинаниях!

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

ΠŸΠΈΡˆΡƒ 3D Π”Π²ΠΈΠΆΠΎΠΊ Π½Π° Python [ Pygame + Numpy ]

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ 3D Π˜Π³Ρ€Ρƒ Π½Π° Python с Нуля [ Pygame ]

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ 3D ΠΈΠ³Ρ€ Π½Π° Python ursina

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

🎲Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°Π½Π΄ΠΎΠΌΠ½ΠΎΠ΅ число Π² Python? Π›ΡƒΡ‡ΡˆΠΈΠΉ способ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°πŸ”’

πŸ’‘ Анализируя S Π² Python: Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΈ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ смс Π±ΠΎΠΌΠ±Π΅Ρ€ Π½Π° ΠΏΠΈΡ‚ΠΎΠ½Π΅: простой Π³Π°ΠΉΠ΄ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ

πŸ”§ Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ 3D Π΄Π²ΠΈΠΆΠΎΠΊ Π½Π° Python: пошаговоС руководство

πŸ”Ž Как ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список Π² Python ΠΏΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚Ρƒ: простой ΠΈ эффСктивный способ

Как ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² Python? 🐍 ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Π³ΠΈΠ΄ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈ объяснСниями

πŸ” Как Π½Π°ΠΉΡ‚ΠΈ список Π² спискС python: самый простой способ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ