Coding Challenge

Поділитися
Вставка
  • Опубліковано 19 чер 2024
  • In this video, I implement a basic ray casting engine with line segment “surfaces” and vector “rays.” The result simulates a light source casting shadows in a 2D canvas. thecodingtrain.com/challenges...
    🕹️ p5.js Web Editor Sketch: editor.p5js.org/codingtrain/s...
    🎥 Next video: • Coding Challenge #146:...
    🎥 All videos: • Coding Challenges
    References:
    🌞 SIGHT & LIGHT by Nicky Case: ncase.me/sight-and-light/
    🌞 2d Visibility from Red Blob Games: www.redblobgames.com/articles...
    💾 p5.collide2D: github.com/bmoren/p5.collide2D
    🗄 Line-line Intersection: en.wikipedia.org/wiki/Line%E2...
    Videos:
    🎥 Coding Adventure: Ray Marching: • Coding Adventure: Ray ...
    🎥 Matrix Math: • 10.6: Neural Networks:...
    🎥 Coding Challenge: Rendering Ray Casting: • Coding Challenge #146:...
    🔴 Coding Train Live 177: • Coding Train Live 177:...
    Timestamps:
    0:00:00 Introduction
    0:03:34 Coding Starts
    0:05:54 Creating a Ray Class
    0:09:16 Casting Rays And Finding Intersections
    0:19:56 Casting Multiple Rays
    0:24:41 Adding Collision Detection For Every Ray
    0:26:47 Multiple Boundaries
    0:31:23 Moving With Perlin Noise
    0:32:41 Suggestions For Improvements
    Editing by Mathieu Blanchette
    Animations by Jason Heglund
    Music from Epidemic Sound
    🚂 Website: thecodingtrain.com/
    👾 Share Your Creation! thecodingtrain.com/guides/pas...
    🚩 Suggest Topics: github.com/CodingTrain/Sugges...
    💡 GitHub: github.com/CodingTrain
    💬 Discord: / discord
    💖 Membership: ua-cam.com/users/thecodingtrainjoin
    🛒 Store: standard.tv/codingtrain
    📚 Books: www.amazon.com/shop/thecoding...
    🖋️ Twitter: / thecodingtrain
    📸 Instagram: / the.coding.train
    🎥 Coding Challenges: • Coding Challenges
    🎥 Intro to Programming: • Start learning here!
    🔗 p5.js: p5js.org
    🔗 p5.js Web Editor: editor.p5js.org/
    🔗 Processing: processing.org
    📄 Code of Conduct: github.com/CodingTrain/Code-o...
    This description was auto-generated. If you see a problem, please open an issue: github.com/CodingTrain/thecod...

КОМЕНТАРІ • 519

  • @atrumluminarium
    @atrumluminarium 5 років тому +1092

    Omg this video is so coherent and organised unlike the live stream. Your editor needs a raise Dan hahah

    • @MattRose30000
      @MattRose30000 5 років тому +35

      That's why I always wait for the edited versions, they are just so much nicer to watch.

    • @taba1950
      @taba1950 5 років тому +81

      @@MattRose30000 while true the live stream still have a unique entertaining value

    • @LuisHansenNH
      @LuisHansenNH 4 роки тому +39

      Showing your code VS coding live. That's why I hate coding interviews. It's like they say: the worst part of parallel parking are the witnesses.

    • @vintyprod
      @vintyprod 4 роки тому +8

      @@taba1950 while(true)

    • @MizhiBirb
      @MizhiBirb 4 роки тому +7

      more like a RAYS

  • @discreet_boson
    @discreet_boson 3 роки тому +136

    This man is an international treasure and should be protected at all costs

  • @MSecYT
    @MSecYT 4 роки тому +178

    6:59 "I didn't forget this time"... immediately forgets to add this to the dir.x, and dir.y

  • @cassioschneider922
    @cassioschneider922 5 років тому +85

    i've never coded anything. don't know why i watched the entire video.
    still, this is AWESOME
    thanks! cheers

    • @TheCodingTrain
      @TheCodingTrain  5 років тому +14

      You can start learning here! ua-cam.com/play/PLRqwX-V7Uu6Zy51Q-x9tMWIv9cueOFTFA.html

    • @cassioschneider922
      @cassioschneider922 5 років тому +5

      @@TheCodingTrain Thanks for replying! i'll definitely try it out :D

    • @cassioschneider922
      @cassioschneider922 4 роки тому +38

      @@nerasure actually I watched the entire playlist with the starting tutorials! I made some really cool stuff, made 3d pong, moon phases shown in 3d, a few simple games and other simple stuff just to try out p5js and learn a little
      I would definitely recommend it, Daniel is an awesome teacher, always so positive and ready to a swerve questions!

    • @kenan2386
      @kenan2386 3 роки тому +2

      :)

  • @justiceforsethrichwwg1wga160
    @justiceforsethrichwwg1wga160 5 років тому +53

    I’ve been watching your channel for awhile now....you’ve gotten way better at your presenting! Really great content! Easily one of my favorite channels.

  • @rolandferguson1209
    @rolandferguson1209 2 роки тому +1

    I haven't been programming in a while and jumping back in to your tutorials I get to see how much comedy you've added! it's great to see you so expressive

  • @nehoymenoy3845
    @nehoymenoy3845 4 роки тому +28

    It's awesome when a feature can be implemented for both visual and functional purposes.

  • @dkkoala1
    @dkkoala1 5 років тому +135

    The ray.cast method is already calculating the relative distance to each intersecting object in the form of "u", so an optimization would be to use it instead of the p5.vector.dist function. This is more efficient because p5.vector.dist uses euclidean distance, and therefore calculates square roots each time it is called, which is a heavy calculation.
    But great video as always!

    • @TheCodingTrain
      @TheCodingTrain  5 років тому +22

      Thanks for the feedback!

    • @dkkoala1
      @dkkoala1 5 років тому +15

      ​@@TheCodingTrain No problem, i always love your videos because they remind me that coding can still be beautiful. Im a machine learning master student, so your project with the self driving car interests me very much, even though i am more of a supervised learning guy. Please feel free to contact me if you need some resources for how to approach the subject. In any case you should definitely check out Arthur Juliani's Medium article about Q-learning, it is a very good resource to reinforcement learning.

    • @likeyou3317
      @likeyou3317 5 років тому +2

      So smaller "u" means dist is smaller?

    • @TheCodingTrain
      @TheCodingTrain  5 років тому +11

      @@dkkoala1 Indeed, such a great reference!

    • @dkkoala1
      @dkkoala1 5 років тому +5

      @@TheCodingTrain Another thing that could maybe speed up your training is the concept of curriculum learning. It is done by starting out training with the simplest version of your problem and then as the AI gets better raise the difficulty of your training. An example could be starting with training the AI to drive in a straight line, and when it can do that then add a bend to the track. Multiple objective functions could also be useful, first prioritizing getting to the end of the by having the distance to the goal as your loss, and afterwards using the speed at which the AI can get there instead. In this way you first ensure a basic understanding of the task and then you can optimize it make the model better and faster at the task. Unity has a great blog for curriculum learning blogs.unity3d.com/2017/12/08/introducing-ml-agents-v0-2-curriculum-learning-new-environments-and-more/

  • @nkheart4
    @nkheart4 7 днів тому

    My first goal is to learn what you teach, but I also enjoy seeing your reactions when you start coding. I see myself in you, so I love your channel because I feel the same joy you get when coding graphics like this.

  • @TheFlamingWaldo
    @TheFlamingWaldo 4 роки тому +20

    I program in Python -- I used C++ back when I was in college, but it didn't sit well with me -- and I was inspired by this to try to program some raycasting *in* python, despite my limited experience with trigonometry. I tried my best to construct as many of the math-related functions as I could from scratch, which means I made my own function for finding magnitude, normalizing lines, for projecting lines out at a specific angle, etc etc. I was worried it was going to run awful, but it's actually pretty smooth! It was difficult for me, as I've never taken a trigonometry course and I actually managed to fail remedial math once, but something about wanting to accomplish something makes me learn more. I feel really happy with myself, even if I have what would probably have been easier if I had just used built-in library functions to do my work for me. Your work always inspires me, and this is the third project I've made based off of the suggestions in your videos, so thank you so much!

    • @matiascollado9926
      @matiascollado9926 Рік тому

      How did you make the ray extend to infinity in one direction?

    • @adammoore4359
      @adammoore4359 Рік тому

      @@matiascollado9926 did you figure this out?

    • @matiascollado9926
      @matiascollado9926 Рік тому

      @@adammoore4359 I did not extend it to infinity, rather I extended it far enough that the user never sees the end of the rays

  • @god_i_hate_google5142
    @god_i_hate_google5142 5 років тому +4

    I never have time to watch all your videos but in every video ive watched you seem to be enjoying your self and I am honestly jealous that you enjoy coding this much

  • @batonator
    @batonator 5 років тому +19

    i love your enthusiasm, you make me wanna code more. I can't wait to get a PC

  • @wlockuz4467
    @wlockuz4467 Рік тому +1

    This video is simply amazing! I always used to think of Raycasting as this very complicated topic which requires a good understanding of Math but at not point did it feel like I didn't understand this video. I am blown away!

  • @HellTriX
    @HellTriX 5 років тому +10

    The end result to this one was absolutely beautiful. I think its my favorite one yet. I also cannot wait to see some NNs applied to this!

  • @NinjarioPicmin
    @NinjarioPicmin 5 років тому +2

    Yay for Nicky Case. I love a lot of their work

  • @soejrd24978
    @soejrd24978 5 років тому +2

    That plan on this project is insane!! I"m so hyped!!

  • @yourteacher4353
    @yourteacher4353 5 років тому +6

    So basically there are two kinds of people: 1) people and 2) people who brighten your day up. You Daniel is the king of kind 2.

  • @7cle
    @7cle 5 років тому +2

    Keeping this that simple, given the complexity of the subject is the mark of a rare gift Dan : intelligence! Thank you for sharing it with us. It is a pity so many are not fussed to share stupidity on social media though.

  • @Couchwurst
    @Couchwurst 4 роки тому

    Thank you for this awesome Coding Challenge! And for bringing up the reference to Nicky Case - his game and ideas are fantastic!

  • @ivankorytko1964
    @ivankorytko1964 5 років тому

    The best explanation of the work. Interesting, understandable, not boring and I was impressed that it is easy. I do not know JS, but the idea and logic is quit simple. Thanks for your videos.

  • @cidie1
    @cidie1 2 роки тому

    Thanks so much, I'm half watching for the subject and half watching because you are just so fun!

  • @DenerWitt
    @DenerWitt 5 років тому +6

    I like the light like effect at the end. when math and programming become art. Pretty.

  • @izangomez6806
    @izangomez6806 5 років тому +194

    3:25 Code bullet will help you, sure

  • @squirrel1620
    @squirrel1620 5 років тому +6

    When I was coding with unreal 2 and 3 engine, the Trace and FastTrace were used for ray tracing. It worked more or less the same, mathematics wise anyways. They pull more tricks to avoid multiplication or division because it saves time.

  • @thegoodhen
    @thegoodhen 4 роки тому +8

    This really reminds me of SLAM (simultaneous localization and mapping) visualizations in robotics. You have a robot with a LIDAR scanner and it sees the environment in exactly this way, as it casts multiple laser rays.

  • @_jonathancollins
    @_jonathancollins 3 роки тому

    This is the first time I've watched your videos, and frankly, I'm a bit disturbed by how excited you are.
    It's contagious...

  • @MagnaKay
    @MagnaKay 3 роки тому

    The enthusiasm is so contagious ahah. Good job!

  • @elliotressler4201
    @elliotressler4201 5 років тому +4

    Your enthusiasm got me excited as well. I'm sure it was worth a sub (:

  • @catherinebernard3282
    @catherinebernard3282 4 роки тому +1

    Thanks to this I managed to get a version of this working in gamemaker (studio 2). Was a lot of fun.

  • @therealstillie
    @therealstillie 4 роки тому

    That was unbelievably enjoyable to watch!!!! Thank you

  • @sonik382
    @sonik382 5 років тому +1

    I am trying to code the AI car as well...awesome you suggested that! Can't wait for the next challenge! Greetings from Italy!

  • @sushicook816
    @sushicook816 4 роки тому

    This channel is a gold mine for researchers.

  • @julianirmer5854
    @julianirmer5854 5 років тому +7

    The only channel for which I activated notifications.

  • @ValleyOfWillows
    @ValleyOfWillows 3 роки тому +19

    Making the boundaries into letters with the same color as the background and then having the lightsource just randomly go around the canvas would probably make a cool screensaver.

    • @zelioz848
      @zelioz848 8 місяців тому +2

      Yo that is sick, i'm gonna learn how to change my desktop background to something like that and program it myself

  • @massimogiardina9138
    @massimogiardina9138 5 років тому +1

    You helped me so much with this.
    How could I ever thank you?

  • @FazpyDev
    @FazpyDev 2 роки тому

    This video is so useful, I'll for sure have a look at it!

  • @thebrickccentric3728
    @thebrickccentric3728 2 місяці тому

    2 cases that the line segment intersection check here forgets to consider (which become more apparent in the next video):
    -If the ray is parallel with the wall, but also directly in line with it, the intersection check here will return empty when it should return the closer of the 2 endpoints of the wall (and the distance to it)
    -If the particle/vehicle is sitting directly on a wall (or if a wall has the same start and endpoint / 0 length), then the intersection check should return the ray's origin point (0 distance) no matter what
    Great video though; this stuff is super useful

  • @dalegriffiths3628
    @dalegriffiths3628 4 роки тому

    Fantastic - can't wait for the self driving vehicle you mentioned you'd like to do with this!

  • @scatheroy
    @scatheroy 4 роки тому

    Just awesome. Great video. Thanks, man.

  • @Briggoes
    @Briggoes 5 років тому

    always wanted to learn this! thanks!

  • @photoelectron
    @photoelectron 5 років тому

    thanks for sharing, that was pretty neat !

  • @CYXNIGHT
    @CYXNIGHT 5 років тому +6

    I used to code on Gamemaker, and was transitioning to Unity, but I came across your channel and Java is now my favourite language. I was getting discouraged from coding as Gamemaker couldn't do what I wanted, but since your channel popped up in my recommended I have sinced been coding almost every day as I never cease to find something to code, I can't thank you enough.
    I love your channel and your vibrance, I hope you never stop these videos, and live-streams!

    • @33KK
      @33KK 5 років тому

      He uses JavaScript

    • @TheCodingTrain
      @TheCodingTrain  5 років тому +1

      Thanks for this nice feedback!

  • @run4thewin357
    @run4thewin357 4 роки тому

    This is the most interesting video i saw this year

  • @Apoorvpandey
    @Apoorvpandey 5 років тому +92

    Coding train : "
    Making world a better place to live in "🌼🌼🌼

  • @proxy1035
    @proxy1035 4 роки тому +52

    2:34 when your parents ask you to do anything

  • @MrNosugarcoating
    @MrNosugarcoating 5 років тому

    Wow that looks so cool

  • @HoneyDustTheReal
    @HoneyDustTheReal 2 роки тому +6

    i'm just putting my idea here but i think it would be really cool and entertaining to combine the maze generator algorithm with the a* pathfinding algorithm to solve it and finally this one that could be implemented by redirecting the "light source" to the mouse cursor and be able to explore the maze (which would be all dark at first) and just seeing the light making it's way to the edges of the paths as we move along them, like some sort of dark exploration game

    • @Mabeloid
      @Mabeloid Рік тому +1

      sounds like 2d scanner sombre

  • @shaileshrana7165
    @shaileshrana7165 3 роки тому +5

    Light also diffuses around edges. Maybe that can be added.

  • @andrewweller5119
    @andrewweller5119 9 місяців тому

    Great, thanks fo rthis. i re wrote it all to work in Game Maker Studio and have learned soo much.

  • @reggy698
    @reggy698 5 років тому

    Love your video style. Going to have a play with this tonight see if I can make 2 rays interact with gravity and merge say red and blue to make a purple singularity that then bursts with gamma

  • @mihaisolomon2893
    @mihaisolomon2893 5 років тому +10

    I did something like this 1 month ago, but my code wasn't so explicit, thank you for the explanation

  • @DodaGarcia
    @DodaGarcia Рік тому

    That ending made me SO happy I can't even describe it

  • @itay1213141
    @itay1213141 5 років тому +1

    Great video, i love these so much 😁

  • @Jeff-Vader_head_of_catering
    @Jeff-Vader_head_of_catering 5 років тому

    Very cool! My brain melted about 1/4 of the way into the video, but, cool.

  •  4 роки тому +1

    I've been a subscriber for a while but I'm not used to watch a full video.
    That one caught me and I was able to follow easily your train of thought even tho I don't know those libraries.
    Amazing work. Programming should be exciting as you are showing!

  • @medhavimonish41
    @medhavimonish41 4 роки тому

    wow , you never fail to amaze

  • @abazur7742
    @abazur7742 5 років тому

    now after this video i can tell that you are a genius

  • @t.m.h1721
    @t.m.h1721 5 років тому

    Your video inspires me a lot

  • @notgate2624
    @notgate2624 5 років тому

    I would love a video on ray tracing! Great video!

  • @Damian_Stefann
    @Damian_Stefann 5 років тому +1

    Dude i am making videogame and i needed this! Thanks :)

  • @bluepixelmusic9463
    @bluepixelmusic9463 5 років тому +2

    finally a channel that doesnt expect me to be a master brain

  • @RhoTrepaan
    @RhoTrepaan 4 роки тому

    it looks very pretty! :D
    (and very informative, too)

  • @itoverview-awesomeandroida1492
    @itoverview-awesomeandroida1492 4 роки тому

    Congrats on 1 million! :)

  • @Edd4324
    @Edd4324 Рік тому

    I love your sticker on your laptop says never forget the this dot and you forgot it in the first part of the code! Great Video as usual!

  • @yhjeong5317
    @yhjeong5317 5 років тому

    Wow.... I really like this.. thank you!!

  • @husseinshukre3828
    @husseinshukre3828 2 роки тому

    Great video helped me build openGl program that recolor the selected polygon

  • @matteobarbieri2989
    @matteobarbieri2989 5 років тому

    this is awesome!

  • @nicolasmarques7460
    @nicolasmarques7460 4 роки тому

    Amazing thanks for share this content!

  • @a.osethkin55
    @a.osethkin55 2 роки тому

    Amazing!

  • @garychap8384
    @garychap8384 4 роки тому

    More efficiently, when trying to identify the whole area "visible" from a point ...
    For all obstacle endpoints, take their angle. Sorting the endpoints by these angles gives you a clockwise (or anticlockwise) list of points. Now it's easy to evaluate each point in turn, working around the circle to construct a convex region of points. You can then gradient fill that region, or use the region to apply dynamic lighting/shadows.
    You can even do some fairly complex stuff with this region/origin ... particularly if your 2D tiles have an extra map for a simplified 'normal' and 'height'. The height lets you suspend lighting (for some distance) along the ray, giving you tiles that cast shadows onto tiles, to cast composite shadows on floors. Orientation and Slope values per pixel let you modulate how a dynamic light affects the base texture.
    But, at its very simplest, you can just use a very weak alpha with a circular gradient to give a very subtle effect which, although it's not accurate, is subtle enough that people don't notice.
    You can have lots of fun with these regions.

  • @Bunnybobscodes
    @Bunnybobscodes Рік тому

    Great video!

  • @alexmattheis
    @alexmattheis 4 роки тому

    Very good explanation and coding.

  • @omaislindodesantos
    @omaislindodesantos 11 місяців тому

    great video really thank for doing it.

  • @Xeronimo74
    @Xeronimo74 5 років тому

    awesome tutorial!

  • @alfcnz
    @alfcnz 2 роки тому

    Impressive! 🤯🤯🤯

  • @SarcTiann
    @SarcTiann 10 місяців тому

    Super Awesome!

  • @RedMasterJV
    @RedMasterJV Місяць тому

    LMAO that "this dot" tune is great

  • @WzzupDaAwsome
    @WzzupDaAwsome 5 років тому +3

    What if you made the light that hits the walls reflect back at whatever angle it hit the wall? I've seen videos of rooms where there is a single point where light can't reflect to, it would be cool to test that out with this program.

  • @frankie_goestohollywood
    @frankie_goestohollywood 3 роки тому

    Brilliant video!!!! Thank you :-)

  • @philtoa334
    @philtoa334 3 роки тому

    beautiful .

  • @Csc5csc5
    @Csc5csc5 4 роки тому +19

    Bruh, that's a lot of energy before noon. Coffee or Red Bull?

  • @AlejandroCastilloRapper
    @AlejandroCastilloRapper 3 роки тому

    AMAZING. BOOKMARKED

  • @defforadio6428
    @defforadio6428 5 років тому

    wow! just wow!

  • @mehmetedex
    @mehmetedex 4 роки тому

    This is so cool.

  • @OrangeC7
    @OrangeC7 5 років тому +7

    You should check out CodeParade's videos on ray marching as well. There are a lot of cool things you can do with the technique! :D

  • @toxicwaste8182
    @toxicwaste8182 4 роки тому

    Coding a line would send me off the wall. Then here you are making ray casts

  • @elendil4543
    @elendil4543 2 роки тому

    This guy can make whole game engine with processing

  • @2skateboards113
    @2skateboards113 3 роки тому

    this video is awesome thanks for this :)

  • @8bit_pineapple
    @8bit_pineapple 4 роки тому +13

    ♫When A Grid's
    Misaligned With
    Another Behind
    That's a Moiré♫

    • @masonhunter2748
      @masonhunter2748 3 роки тому

      You stole it

    • @8bit_pineapple
      @8bit_pineapple 3 роки тому

      @@masonhunter2748 Yea. Credits to xkcd comics, that everyone here should read ;)

    • @masonhunter2748
      @masonhunter2748 3 роки тому

      8bitpineapple what’s the number

    • @-Burb
      @-Burb 3 роки тому

      @@masonhunter2748 1814

  • @janne_kekalainen
    @janne_kekalainen 4 роки тому

    Really cool, also I have spent about 6 hours recreating this in WPF C# It isn't the best and a resource hog, but it does mostly the same thing.

  • @imvickykumar999
    @imvickykumar999 4 роки тому +1

    You are my inspiration 🤘🤘

  • @krccmsitp2884
    @krccmsitp2884 Рік тому

    I really like your step-by-step explanations and approach to solving problems. What looked too complicated at first becomes gradually more comprehensible, and finally you think to yourself, "what, it's that simple?".

  • @My-video123
    @My-video123 3 роки тому +1

    At first I thought you are very strange guy. After several your videos I just realized it’s a gold material to be taught and implemented. Thank you mate

  • @silvertakana3932
    @silvertakana3932 2 роки тому

    15:08
    Him: Now, it’s time for me to get YOU!
    Me: *running out of my room*

  • @TSPxEclipse
    @TSPxEclipse 4 роки тому +2

    Personally I would have loved for there to be a segment added into the code for reflection/refraction, but with a simple ray vs. boundary setup on a 2D plane that would have been complete overkill.

  • @expeng5861
    @expeng5861 4 роки тому

    prefect !!!

  • @popadynetsalexander
    @popadynetsalexander 2 роки тому

    Thanks!

  • @Donahue9389
    @Donahue9389 4 роки тому

    I'm a p5 newbie, and I am curious how you are using createVector outside of the setup function. Are you in "on demand global mode"?

  • @jonmichaelgalindo
    @jonmichaelgalindo 4 роки тому

    I just tried doing this last week, and I also arbitrarily picked cast(). :-)
    Although I first intersected the ray with a polygon's bounding-box (polygons had translation/rotation/scale), then transformed the ray into the polygon's local space, then calculated the intersect depth (if any), then transformed that depth back out to the ray's space. That way I didn't have to convert all the polygons' vertices to global space, since I only need the ray's collision point for drawing.

    • @jonmichaelgalindo
      @jonmichaelgalindo 4 роки тому

      Also, it looks like you're using p5 for vector stuff, but I was just using JS.

  • @arsnakehert
    @arsnakehert 2 роки тому

    "This comes from 15 years of programming in Java"
    Oh, I can see the Vietnam flashbacks in his eyes