В это видео я покажу вам как сделать простенькую 3D Игру на Python за 20 минут без движка. Если вы хотите продолжения, то покажите это своей активностью, всем удачи :) Код: github.com/MaynixX/RayCasting...
Нет, Doom - это не рейкастинг, а сканлайн (растеризация) из 2d-BSP. Технологии очень разные. Raycasting осуществляет растеризацию за счёт того, что обходит лучом поверхности, Doom осуществляет "растеризацию" обходя сегменты из bsp дерева, и выполняя прямую растеризацию (scanline), без использования лучей!!! В ratcasting лучи используются для определения того, что попало в зону видимости, при использовании прямой растеризации, нам надо думать как отсечь невидимое пространство - для этого Кармак использовал двоичное двумерное дерево. Сильверман, напротив, определял видимость методом порталов, но точно так-же использовал прямую растеризацию (без лучей). Тут аналогия с растеризацией в полигоны и лучевой трассировкой в современных играх (технологии одни и те-же, только уже на аппаратно-шейдерном уровне).
На C# (System.Drawing библеотка) создавал по твоему туториалу. Было увлекательно. Только я сразу сделал List единственное у меня Y, ещё есть допустим если у обьета Y - 100, при приблежении к нему он будет спускаться в низ, но думаю разберусь как пофиксить
Xaйль. Наверное, не первый вопрос подобного рода, но: Не имеет ли автор канала что-то общее со StandaloneCoder? Скажем так, очень похожи) Но это ни в коей мере не упрёк P.S. а можно увидеть ролик по языку Cython и его интеграции с Python?
@@underwater5555 тут нужно делать уже матрицы нампая, но можно сделать псевдо 3d, чтоб просто блоки перемещались вверх-вниз относительно позици игрока по третей оси
1. я первый 2. как можешь подсказать как сделать повороты вверх и вниз у меня проекция 3d вот так сделана: depth, offset, texture = (depth_v, yv, texture_v) if depth_v < depth_h else (depth_h, xh, texture_h) offset = int(offset) % TILE depth *= math.cos(player_angle - cur_angle) depth = max(depth, 0.00001) proj_height = int(PROJ_COEFF / depth) casted_walls.append((depth, offset, proj_height, texture)) cur_angle += DELTA_ANGLE return casted_walls заранее спасибо Изменено: TILE это размер стены(100х100) с остальным я думаю разберёшся и ещё раз заранее спасибо
привет) ну это 2.5 3d, там уже повороты вниз вверх делать если не фейковые, то нужно добавлять z ось - вверх-вниз. можно сделать фейк перемещение камеры вверх-вниз. то есть когда допустим игрок нажимает стрелку вверх, текстуры/стены чуть поднимаются наверх. могу это показать в следующих сериях, но это будет выглядеть немного нереалистично
Хотелось бы сделать игру в похожей манере но чуть круче она называется Power slave выходила на ps1 любимая игрушка детства моего брата так что хотел бы её сделать (но мне кажется там рейкастинга будет недостаточно)
Афигеть!ну прям как я,убигаешь от закона програмиста и ищешь развлечения на python,я охренительно много веселых возможностей нашел в этом языке,если хочешь мы можем объеденится,только я не снимаю видео!
Привет, хорошее видео, понравилось, но решил написать на ascii графике(отрисовке) Не могу решить проблему с рыбий глаз, можешь подробнее рассказать что сделать да бы его убрать? Заранее спасибо
#импорты import math import curses import locale from math import pi, cos, sin #Положение и направление(поворот игрока, координаты) POS_X, POS_Y, POS_A = 2, 2, 0 player_angle = POS_X,POS_Y,POS_A # Ширина угла (радианы) так же угол обзора от первого лица FOV = pi / 2 # разрешение шага луча(дальность полета отображения) RESOLUTION = 0.1 # Максимальная глубина прорисовки DEPTH = 36 # Скорость игрока вперед назад за одно нажатие SPEED = 0.3 # скорость повотора игрока в радианах ROTATION_SPEED = 0.1 # Наша карта строчкой MAP = """ ×××××××××××××××××× ×................................× ×................................× ×................................× ×××××××××××××××××× """ """ Форматирует карту в одну строку без переносов для лучшего поиска(будет читать как одна строка для оптимизации прорисовки) :param string_map: MAP :return: форматированная карта, ширина, высота в блоках""" def make_map(string_map): rows = string_map.strip().split(' ') h = len(rows) w = len(rows[0]) return string_map.replace(' ', ''), w, h def main_3dwalk(screen): # оптимизация отображения юникода locale.setlocale(locale.LC_ALL, '') # кнопки не печатаются на экране при нажатии(управление) curses.noecho() #убирает курсор с экрана curses.curs_set(0) #цвет режим, палитра curses.start_color() curses.use_default_colors() # форматируем карту и получаем ее размеры(обьединение параметров для удобства в один метод создания карты) level_map, map_width, map_height = make_map(MAP) def get_block(x, y): """По координатам на карте возращает символ блока(прорисовка , для понимания отртсовки) × - это стена, все остальное свободное пространство x: колонка y: строка return: сивмвол блока грубо говоря цыкл прорисовки и возвращение при обратном перемещении""" x, y = int(x), int(y) if 0
Какая у вас версия Python? Попробовал запустить ваш код, но идут ошибки за ошибками: AttributeError: module 'pygame' has no attribute 'display' NameError: name 'pygame' is not defined AttributeError: module 'time' has no attribute 'time_ns' Как это исправить?