Все несложно. У нас стена, это квадрат на карте, у которого есть только координаты левого верхнего угла, допустим (100, 100) и размер стороны квадрата 100. И, например, у нашего луча сейчас координаты (113, 159). Так вот, чтобы определить в каком квадрате наш луч, необходимо целочисленно поделить координаты луча и затем умножить их на размер квадрата. ( (113 // 100) * 100, (159 // 100) * 100 ) = (100, 100). То есть, мы попали в квадрат, и проверку на этом завершаем.
@@StandaloneCoder спасибо! Теперь всё ясно. Я просто упустил тот момент, что мы как бы рисуем луч не сразу целиком, а постепенно, и на каждом шаге проверяем находится ли он в квадрате. Я просто думал, что мы сразу целиком рисуем луч) И ещё раз прошу продолжать делать видео. Не забрасывайте это дело))
@@StandaloneCoder Здравствуйте, спасибо за урок, отлично объясняете, но у меня проблема такая вот,у меня все получилось отлично только вот лучи на экране остаются и когда я двигаюсь они тоже показывают направление, я про лучи которые показывают обзор, когда вы сделали графику от 2д до 3д то у вас они исчезли а у меня нет:(
Спасибо ОГРОМЕЙНЕШЕЕ за столь изложенный гайд! Не ожидал от себя, что разберусь полностью в такой проекции. Функция enumerate() конечно неплохая, но когда о ней ничего не знаешь, ловишь себя на мысли, что непонятно, что вообще она вытворяет в программе. Положа руку на сердце напишу, что следующий алгоритм наверное более понятный и дружелюбный для такой цели, как граббинг всех координат квадратов: world_map = [] y=0 for line in text_map: x=0 for sign in line: if sign == 'w': world_map +=[(x*tilesize, y*tilesize)] x += 1 y += 1
@@sadboy8538 я хоть и не вовремя, но у меня такая проблема возникла, лучи, что должны сталкиваться со стенами и поворачивать вместе с игроком не поворачивается, сам игрок поворот делает спокойно, а лучи нет. Я, может быть, что-то пропустил, но я несколько раз перепроверил код, не могу найти причину.
Очень информативное видео, даже не думал, что случайно наткнусь на такой шедевр. За 1 присест посмотрел все части и прям очень понравилось. Однозначно лайк💪
огромное спасибо за ваш труд! единственная серия роликов в которой подробно и понято рассказано про ray casting, по вашим видео сделал шутер на C++ и библиотеке sfml
Офигеть вы крутой программист-математик! Вот зря я науки не учил... Вообще крутой специалист! Удачи и хорошего вам будущего и побольше такие видео выкладывайте!!! Вам бы профессором в университете быть + науки преподавать разные, помимо программирования!
Добрый день и спасибо большое за видео, недавно начал изучать питон и сделал 1 игру в виде галаги. На основе данных уроков сделаю 2 проект. Большое спасибо за ваш труд.
Я вот бедолага-аналитик, изучал python для построения нейронных сетей и анализов, но всегда хотелось игры делать. Но не их готовых конструкторов, как юнити и анреал, а что бы самому понимать и прописывать физику и законы мироздания. Везде читаю - нужен только Си. питон - тормоз, игры на нем не лепят. И чо. мне язык что ли переучивать? Причем в ущерб математическим возможностям питона. нееее, я начал верить, что найдется спаситель - и покажет мне всю мощь математики и лучшего для нее языка программирования. ЧУВАК СПАСИБО, ТЫ ТОТ САМЫЙ СПАСИТЕЛЬ!!
По поводу момента поворота линии в 5:35 Перемещение точки осуществляется путём нажатия W, A. S, D. И у многих затем появляются вопросы на подобии: "У меня линия постоянно смотрит вправо". Изменение поворота линии осуществляется путём нажатия кнопок со стрелочками .
Пиздец! Да я бы в жизни сам не разобрался! И Тут даж бутылка бы не помогла... Теперь все понятно! Спасибо тебе огромное! Буду разбираться более конкретно что до как по твоему коду, а то с первого раза не все в голове уложилось. ))) Как сделаю игру обязательно скину тебе ;) P.S. Первый!))
Мужик кайф. но делай просто угол направления = direction а вперед вбок и назад - это direction+90 direction-90 direction -180 имея угол - расчитай вектор горизонтальной скорости и вертикальной скорости - x += cos(direction) y += sin(direction) вроде так. и так ты и пулю кастовать можешь. не только шаг.. или ты об этом и сказал я хз) * что я имею ввиду -ОДНА формула для всех движений игрока :) зависящая от view_direction
И наложение текстур интересно, и оптимизационная часть, сам бы 100 лайков поставил, если бы мог) Оптимизация, часом, не использованием формул нахождения персечения двух отрезков?
не ну я подофигел кончено я не думал что в питоне хпхпхахаха это возможно))) респект. рендеринг конечно я понимаю что это основы основ но СУПЕРСКИ сделан ои подано
Привет. Спасибо за видео, очень подробно. Один момент, я немного переработал принцип формирования карты и часть настроек перенес в json файл, после чего справа появилась черная полоса. От чего так могло произойти?
В следующий раз если делаете серию видосов, размещайте плиз на главной картинке номер серии (части), а то когда репостишь ваши видосы например в вк, то там приходится помучиться, чтобы понять где какая час обучающего ролика.
Ура ты сделал урок! Интересно будет узнать про текстурирование))) И у меня есть проблема. Что бы повернуть игрока мне каждый раз приходится тыкать на кнопку. Как сделать, что бы поворачивался если зажать, а не каждый раз тыкать?
Хорош чувак, пришлось правда на 0,75 смотреть, ибо кодишь быстро, я не успевал. А так, мути еще уроки (: P.S. Я бы посоветовал начать с саааамого начала с установки python, где качать и как, совсем для нубов (для меня) Ы
Отличный туториал, сам по нему делал игру, но я тут понял, что рейкастинг немного тупая технология, я хочу сказать что мы знает координаты игрока и его угол поворота и мы знаем всю карту, более того, карта состоит из квадратов, значит мы можем провести вектор от точки игрока до вершины и получить сразу ее координаты, так делать для каждого элемента карты, что в поле зрения и что виден. Затем получив лишь нижнюю точку вершины уже на экране можно получить верхнюю просто отразив её относительно горизонта, затем получить второе ребро точно также, затем залить это полигоном.
Я реализовал это, но ещё карта - это набор вершин. Это было чуточку труднее рейкастинга, но оно того стоит! Суть такова: Перемещаем систему координат к камере, поворачиваем систему координат на угол поворота камеры. находим проекции векторов от вершин к камере с экраном. На основе расстояния вычитываем размер. там где была проекция - строим отрезок заданного размера. добавляем вершины в стек и рисуем полигон. Вуаля! У меня на карте с +-300 вершинами 400 фпс. Это получается какой-то полигональный рейкастинг, но без рейкастинга.
на моменте отрисовки лучей начинает сильно лагать, не могу понять с чем это связано, ноутбук далеко не кирпич. А уроки в целом отличные, узнал очень много нового p. s. посмотрел следующий ролик про оптимизацию и все понял, спасибо)
11:00 Можно было инициализировать х и у за пределами цикла, который шёл в глубину, и рисовать линии также за его пределами: так в разы быстрее работает програма
Классный получился проект, лайк! Только скажи пожалуйста, в каком редакторе ты делаешь код? Через cmd не получается открыть окно, а через IDLE не хочу. Буду премного благодарен))
с одной стороны я видел как другой чувак делал это С++, но у него было нихрена не понятно, а ты объяснил это сначала показав на 2Д потом только перейдя на 3Д . Спасибо огромное просто лучший
Очень круто, но я немного не допёр по какому принципу ты определил пересечение со стенами)))
Все несложно. У нас стена, это квадрат на карте, у которого есть только координаты левого верхнего угла, допустим (100, 100) и размер стороны квадрата 100. И, например, у нашего луча сейчас координаты (113, 159). Так вот, чтобы определить в каком квадрате наш луч, необходимо целочисленно поделить координаты луча и затем умножить их на размер квадрата. ( (113 // 100) * 100, (159 // 100) * 100 ) = (100, 100). То есть, мы попали в квадрат, и проверку на этом завершаем.
@@StandaloneCoder спасибо! Теперь всё ясно. Я просто упустил тот момент, что мы как бы рисуем луч не сразу целиком, а постепенно, и на каждом шаге проверяем находится ли он в квадрате. Я просто думал, что мы сразу целиком рисуем луч) И ещё раз прошу продолжать делать видео. Не забрасывайте это дело))
@@StandaloneCoder Здравствуйте, спасибо за урок, отлично объясняете, но у меня проблема такая вот,у меня все получилось отлично только вот лучи на экране остаются и когда я двигаюсь они тоже показывают направление, я про лучи которые показывают обзор, когда вы сделали графику от 2д до 3д то у вас они исчезли а у меня нет:(
@@StandaloneCoder привет, а какую среду программирования ты используешь?
@@guitaresstv6777 PyCharm
Спасибо ОГРОМЕЙНЕШЕЕ за столь изложенный гайд! Не ожидал от себя, что разберусь полностью в такой проекции.
Функция enumerate() конечно неплохая, но когда о ней ничего не знаешь, ловишь себя на мысли, что непонятно, что вообще она вытворяет в программе. Положа руку на сердце напишу, что следующий алгоритм наверное более понятный и дружелюбный для такой цели, как граббинг всех координат квадратов:
world_map = []
y=0
for line in text_map:
x=0
for sign in line:
if sign == 'w':
world_map +=[(x*tilesize, y*tilesize)]
x += 1
y += 1
Ну, теперь у меня есть стимул учить математику с синусами и косинусами. Ты лучший)
а што делать есле нехочет поворачивать я все проверил
@@ronews4723 учить русский язык
@@Yan_Yagellon и зач он мне
@@ronews4723 ахвхахх логично))
Тригонометрия называется
Вот спасибо, ну хоть один нормальный человек!!!
а што делать есле нехочет поворачивать я все проверил
@@ronews4723 if keys[pygame.K_LEFT]:
self.angle -= 0.02
if keys[pygame.K_RIGHT]:
self.angle += 0.02
@@sadboy8538 я хоть и не вовремя, но у меня такая проблема возникла, лучи, что должны сталкиваться со стенами и поворачивать вместе с игроком не поворачивается, сам игрок поворот делает спокойно, а лучи нет. Я, может быть, что-то пропустил, но я несколько раз перепроверил код, не могу найти причину.
@@shangtsung9935 даже не знаю что нужно сделать :(
@@sadboy8538 печально, но все равно спасибо.
You know this is good content when you don't understand Russian but still get entertained. Keep up the good work!
афигеть, в 15мин пояснить как делать 3д лабирин с ходьбой, это круто.
Ага, был бы другой автор, растянул бы видео на час
а што делать есле нехочет поворачивать я все проверил
@@ronews4723 Решил?
16 минут 14 секунд)
@@ronews4723 решил?
Очень информативное видео, даже не думал, что случайно наткнусь на такой шедевр. За 1 присест посмотрел все части и прям очень понравилось. Однозначно лайк💪
огромное спасибо за ваш труд! единственная серия роликов в которой подробно и понято рассказано про ray casting, по вашим видео сделал шутер на C++ и библиотеке sfml
Ля, видео новое, всё понятно объясняется, как же я рад что нашёл это видео
Спасибо огромное! Лучшее объяснение алгоритма рэйкастинга из тех, что мне удалось найти, в том числе и на английском языке!
лучшее видео что я видел по играм, столько новой и полезной информации, а главное - кратко и понятно.
Не везло вам, видать, с рекоммендациями от ютуба.
Офигеть вы крутой программист-математик! Вот зря я науки не учил... Вообще крутой специалист! Удачи и хорошего вам будущего и побольше такие видео выкладывайте!!! Вам бы профессором в университете быть + науки преподавать разные, помимо программирования!
Несколько раз пересматривал видосик, очень помогло написать свою игру. Эта озвучка такая клёвая, жаль новые видео не с ней. Спасибо за контент.
Я никогда раньше не думал, что математика может когда-то пригодиться в таком масштабе. Я просто охренел от твоих знаний. Лайк и подписка однозначно!
Enjoyed reading through the code!
Very didactic!
Thanks man!
Вы лучший! было бы не плохо, если вы посвятите несколько видео уроков, нейронным сетям, с нуля естественно)
Ваууууууууууууууууу, никогда не думал что 3d игру создавать очень просто, а то создавал раньше только 2d, думал другое сложно
Это же Hovertank 3D! Просто история жанра FPS перед глазами) Просто нереальное спасибо!
Надеюсь выйдет 2ая часть урока!👍👍
Да, стал работать над второй частью
Бля чел, ты лучший
Реально развивающая тема а не питон за час у Хауди хо
Типичный Хауди Хо: Ого! Ты умеешь писать команду print()! Теперь напиши 4Д игру с шейдерами и HD персонажами на Python только с модулем pygame!
Бро ты легенда только благодаря тебе смог понять принцип работы "простых" Игр и делать их зная базу питона
молоца ❤ 😊
Я также смотрел ваш урок по деланью змейки. Тоже классно!
Дядя ты гений. Так все быстро сделал. Браво.
Лучший .Очень и очень интересно, а главное круто.
Делаю 3д игру на JavaScript + CanvasAPI по вашим урокам)
Очень интересно, я понял как всё работает, уже до конца. Спасибо
Рад слышать!
Я только начал смотреть но уже очень круто, возможно такими темпами на день рождения брата сделаю ему рейкастинг одной игры которую он любит ещё с ps1
Большое спасибо за видео. Честно ,удивился , когда узнал что можно делать 3д игры в Python с помощью математики
Подписка и лайк с меня
Добрый день и спасибо большое за видео, недавно начал изучать питон и сделал 1 игру в виде галаги. На основе данных уроков сделаю 2 проект. Большое спасибо за ваш труд.
Don't understand a word of russian but it's really cool !
как человеку, с бухты барахты поставленному на должность техартиста, удивительно было узнать, что под капотом.
Я вот бедолага-аналитик, изучал python для построения нейронных сетей и анализов, но всегда хотелось игры делать. Но не их готовых конструкторов, как юнити и анреал, а что бы самому понимать и прописывать физику и законы мироздания. Везде читаю - нужен только Си. питон - тормоз, игры на нем не лепят. И чо. мне язык что ли переучивать? Причем в ущерб математическим возможностям питона. нееее, я начал верить, что найдется спаситель - и покажет мне всю мощь математики и лучшего для нее языка программирования. ЧУВАК СПАСИБО, ТЫ ТОТ САМЫЙ СПАСИТЕЛЬ!!
Почему я никогда не знал об этом канале! Вау!
По поводу момента поворота линии в 5:35
Перемещение точки осуществляется путём нажатия W, A. S, D. И у многих затем появляются вопросы на подобии: "У меня линия постоянно смотрит вправо".
Изменение поворота линии осуществляется путём нажатия кнопок со стрелочками .
У меня линия постоянно смотрит вправо, при этом не реагирует на стрелочки или еще что то что могло их напоминать. что делать?
@@SteelNoodles29 тоже самое, я хз что делать
Что делать если вообще не двигается? В 3D не работает, а в 2D спокойно?
Что делать если линия не ходит за игроком
Спасибо автору и конечно Джону Кармаку! Автор где ты этому научился ???? скажи ??? ресурс про математику??
Пиздец! Да я бы в жизни сам не разобрался! И Тут даж бутылка бы не помогла... Теперь все понятно! Спасибо тебе огромное! Буду разбираться более конкретно что до как по твоему коду, а то с первого раза не все в голове уложилось. ))) Как сделаю игру обязательно скину тебе ;)
P.S. Первый!))
Не первый) он первее о моей узнал
Ура, спасибо! Ты услышал меня
Топ, хоть и голосом робота но это ничуть не мешат
У него микрафона нету
голосом робота даже круче
David Beats + программирование
Чел ты гений
Спасибо большое, ты заслуживаешь больше подписчиков!
Поздравляю с сотней подписчиков!
Спасибо!
Интересно и прикольно, конечно много вещей тут мне пока не понятны но многое от сюда тоже можно взять
Пора делать свой Wolfenstein 3d
hi, i just want to say that I REALLY appreciate the english subtitles!
I don't understand any word but this man is a genius
Yeah but as far as understood
Мужик кайф.
но делай просто угол направления = direction
а вперед вбок и назад - это direction+90 direction-90 direction -180
имея угол - расчитай вектор горизонтальной скорости и вертикальной скорости -
x += cos(direction)
y += sin(direction)
вроде так.
и так ты и пулю кастовать можешь. не только шаг..
или ты об этом и сказал я хз)
* что я имею ввиду -ОДНА формула для всех движений игрока :)
зависящая от view_direction
И наложение текстур интересно, и оптимизационная часть, сам бы 100 лайков поставил, если бы мог) Оптимизация, часом, не использованием формул нахождения персечения двух отрезков?
нет, я предложу использование своей версии DDA алгоритма
@@StandaloneCoder Интересно
годная инцтрукция. спасибо
сегодня буду пробовать
Ты лучший челлл, продолжай дальше
Спасибо! Луди думают что 3д это блендер, 3д макс и т.д. Нет! Это просто работа нашего МОЗГА... Очень наглядно и по русски. Спасибо!
Крутой гайд. Спасибо!
лайк и подписка! Продолжай, дружище.
Учу питон неделю)) но походу зайду сюда позже))))
не ну я подофигел кончено я не думал что в питоне хпхпхахаха это возможно)))
респект.
рендеринг конечно я понимаю что это основы основ но СУПЕРСКИ сделан ои подано
запомни, в любом языке программирования возможно всё, кроме того, что нарушает законы физики
Оч круто!!! Расскажи про натягивание текстур на такие стены
Храни тебя господь
Ты молодец продолжай
Будь здоров
Многие моменты не понял. Но узнал много полезного.
Кто лайк зажал? Раскошеливайтесь жмоты!
а што делать есле нехочет поворачивать я все проверил
да ты просто рукожоп, у меня лично все работает
@@ronews4723 да
@@doctor7628 токсик
Это магия какая-то!)
Ты очень крутой, спасибо тебе.
за такое грех лайк не поставить
Все: Нужна математика, говорили они!
Я: Не нужна математика, говорили они!
Завтра попробую есле время будет, а так все прикольно
Привет. Спасибо за видео, очень подробно. Один момент, я немного переработал принцип формирования карты и часть настроек перенес в json файл, после чего справа появилась черная полоса. От чего так могло произойти?
Спасибо папаша за это видео 3 питона хорошого обяснения
это очень хороший урок!!! лайк, подписка, колокольчик этому человеку :-)
Все спасибо пошел делать guns of bullshit
Отличные ролики. Вопрос, как такой голос повествователя генерируется? )
В следующий раз если делаете серию видосов, размещайте плиз на главной картинке номер серии (части), а то когда репостишь ваши видосы например в вк, то там приходится помучиться, чтобы понять где какая час обучающего ролика.
Не уходи пж НЕЕЕЕЕЕЕЕЕЕЕТ!
Спасибо тебе большое. Помог при вызове других файлов.
Я 0 в питоне, но уже хочу игру такую, хоть повторить...
lol, лишнюю скобку дописал и полчаса мучался с типами данных, урок отличный
Контент годный но новичкам это понять и за помнить очень сложно
Если бы такую математику преподавали в вузе, я бы ее учил
Спасибо! Очень классное видио!
Очень круто спасибо большое)))
В Pycahrm есть шаблон prop, который автоматически вставляет свойство. И геттеры, и сеттеры, и делетеры тоже. На 4:14 пригодился бы
Ура ты сделал урок! Интересно будет узнать про текстурирование))) И у меня есть проблема. Что бы повернуть игрока мне каждый раз приходится тыкать на кнопку. Как сделать, что бы поворачивался если зажать, а не каждый раз тыкать?
Возьми принцип управления из этого видео и тыкать больше не придется
Хорош чувак, пришлось правда на 0,75 смотреть, ибо кодишь быстро, я не успевал. А так, мути еще уроки (:
P.S. Я бы посоветовал начать с саааамого начала с установки python, где качать и как, совсем для нубов (для меня)
Ы
с самого начала поройся на ютубе и в гугле, контента хватает, зачем человеку время тратить на совсем уж простые вещи!?
@@Vitaliy-ct2wv ты не представляешь на сколько люди могут быть тупыми..
@@truenickname2015 если хочешь сделать игру с нуля - ИЗУЧИ ЯЗЫК
хотя-бы не полностью, но ИЗУЧИ
Отличный туториал, сам по нему делал игру, но я тут понял, что рейкастинг немного тупая технология, я хочу сказать что мы знает координаты игрока и его угол поворота и мы знаем всю карту, более того, карта состоит из квадратов, значит мы можем провести вектор от точки игрока до вершины и получить сразу ее координаты, так делать для каждого элемента карты, что в поле зрения и что виден. Затем получив лишь нижнюю точку вершины уже на экране можно получить верхнюю просто отразив её относительно горизонта, затем получить второе ребро точно также, затем залить это полигоном.
Я реализовал это, но ещё карта - это набор вершин.
Это было чуточку труднее рейкастинга, но оно того стоит!
Суть такова:
Перемещаем систему координат к камере,
поворачиваем систему координат на угол поворота камеры.
находим проекции векторов от вершин к камере с экраном.
На основе расстояния вычитываем размер.
там где была проекция - строим отрезок заданного размера.
добавляем вершины в стек и рисуем полигон.
Вуаля! У меня на карте с +-300 вершинами 400 фпс.
Это получается какой-то полигональный рейкастинг, но без рейкастинга.
Спасибо за урок только хотел спросить почему вы область видимости FOV задаете [math.pi / 3] ?
Это угол в радианах. π радианов - 180 градусов. Соответственно, π / 3 - 60 градусов поля зрения
на моменте отрисовки лучей начинает сильно лагать, не могу понять с чем это связано, ноутбук далеко не кирпич. А уроки в целом отличные, узнал очень много нового
p. s. посмотрел следующий ролик про оптимизацию и все понял, спасибо)
@SEMKI TV у меня сильно лагает, как решить?
по моему бро слишком крут
Привет, спасибо за урок. можешь пожалуйста сказать как сделать так чтобы игрок сталкивался со стенами
Спасибо огромное помог выручил лайк!!!!
11:00
Можно было инициализировать х и у за пределами цикла, который шёл в глубину, и рисовать линии также за его пределами: так в разы быстрее работает програма
Спасибо за урок! Как раз 3д игру делаю )
Привет бро ты куда пропал
Просто топ, я всё понял сразу же)))
Ты молодец продолжай. молодец
я делал всё как ты делал, перевел в 3D а игрок не ходит вообще... только может влево и вправо поворачиваться, помоги
Классный получился проект, лайк! Только скажи пожалуйста, в каком редакторе ты делаешь код? Через cmd не получается открыть окно, а через IDLE не хочу. Буду премного благодарен))
Это PyCharm
@@coderlweer7060 Если хочешь могу научить всем фишкам
@@yuliyaparamonova5596 здравствуйте, у меня есть к вам пара вопросов про PyCharm
Наконец я понял тригонометрию
Автор : все мы прекрасно знаем * какая-то формула из тригонометрии*
Я тот который не понимает триганометрию : :/
У меня луч зелёный не так вертится, подскажи что делать. Вроде код чисто такой же как и у тебя
Это наверное учитель математик решил сделать мативацию учить его урок)))
Спасибо огромное, сильно помог, очень интересно
Бля, этот голос просто топчик😂😂
с одной стороны я видел как другой чувак делал это С++, но у него было нихрена не понятно, а ты объяснил это сначала показав на 2Д потом только перейдя на 3Д . Спасибо огромное просто лучший