Coding Challenge

Поделиться
HTML-код
  • Опубликовано: 15 дек 2024

Комментарии • 267

  • @cicciobombo7496
    @cicciobombo7496 6 лет назад +144

    19:00 technically the light source is infinitely far away
    19:43 applying the X matrix to the PVector, then applying the Y and Z matrixes is the same as applying a single XYZ matrix. This XYZ is made matmultipling Z with Y and then the result with X. The order matters.
    Graphically Z×(Y×(X×V)) == (Z×Y×X)×V

    • @TheCodingTrain
      @TheCodingTrain  6 лет назад +44

      Thank you for these corrections! That's especially important pointing out the "infinite distance" of the light source. I will pin this comment!

    • @ericvega9160
      @ericvega9160 4 года назад

      @@TheCodingTrain ruclips.net/video/6_sUVhH7VfU/видео.html

    • @ericvega9160
      @ericvega9160 4 года назад

      @@TheCodingTrain sorry again, can you give me any advice how to draw all faces the math or something, thanks

    • @kun4i_135
      @kun4i_135 3 года назад

      I understood everything absolutely.

    • @sethmobit
      @sethmobit 3 года назад +1

      If we put to spin 90°, it doesn't spin exactly a quarter of the cube. And if we put to add +1 to angle at each second, from 0 to 90, it spins 360° some times instead only a quarter for one time. Why we couldn't simply put to rotate the exactly angle that we want?

  • @ThankYouESM
    @ThankYouESM 3 года назад +87

    I really felt the need to learn how to create 3D from scratch for the sake of my own sanity, so thank you again.

  • @Molenkof
    @Molenkof 6 лет назад +53

    The way this guy speaks and gestures had me on the edge of my seat throughout the video

  • @wheellan
    @wheellan 4 года назад +56

    I've been a professional developer for like, 3 years now, but this dude is still too much fun and I wish I had found him in college.

    • @kluplau
      @kluplau 4 года назад +6

      I've been a professional developer for 15 years and still very much enjoy watching him. ☺️

  • @cmanshopdopler9354
    @cmanshopdopler9354 6 лет назад +97

    Not the hero we deserve, but the hero we need

  • @beastbomber2316
    @beastbomber2316 3 года назад +26

    Here is a python version for everyone :P
    Make sure you have gasp and numpy
    from gasp import *
    import numpy as np
    #Settings
    back = color.BLACK
    dot = color.WHITE
    linec = color.GRAY
    scale = 200
    timestep = 0.05
    distance = 2
    #Dont mess with the ones below
    centerx = 0
    centery = 0
    angle = 0
    points = np.array([
    [-0.5, -0.5, -0.5],
    [0.5, -0.5, -0.5],
    [0.5, 0.5, -0.5],
    [-0.5, 0.5, -0.5],
    [-0.5, -0.5, 0.5],
    [0.5, -0.5, 0.5],
    [0.5, 0.5, 0.5],
    [-0.5, 0.5, 0.5]
    ])
    def draw():
    rotationZ = np.array([ #These have to be inside the function because angle will still static when initiailzing.
    [np.cos(angle), -np.sin(angle), 0],
    [np.sin(angle), np.cos(angle), 0],
    [0, 0, 1]
    ])
    rotationX = np.array([
    [1, 0, 0],
    [0, np.cos(angle), -np.sin(angle)],
    [0, np.sin(angle), np.cos(angle)],
    ])
    rotationY = np.array([
    [np.cos(angle), 0, -np.sin(angle)],
    [0, 1, 0],
    [np.sin(angle), 0, np.cos(angle)]
    ])
    projected = []
    for v in points:
    rotatedY = np.matmul(rotationY, v)
    rotatedX = np.matmul(rotationX, rotatedY)
    rotatedZ = np.matmul(rotationZ, rotatedX)
    z = 1 / (distance - rotatedZ[2])
    projection = np.array([
    [z, 0, 0],
    [0, z, 0]
    ])
    projected2d = np.matmul(projection, rotatedZ)
    projected2d = projected2d * scale
    point(projected2d[0], projected2d[1])
    projected.append(projected2d)
    for i in range(4):
    connect(i, (i + 1) % 4, projected)
    connect(i + 4, ((i + 1) % 4) + 4, projected)
    connect(i, i + 4, projected)
    def createWindow():
    begin_graphics(width=800, height=600, title="3D Renderer", background=back)
    return 400, 300
    def point(x, y):
    Circle((x + centerx, y + centery), 2, True, dot, 5)
    def connect(i, j, points):
    a = points[i]
    b = points[j]
    Line((a[0] + centerx, a[1] + centery), (b[0] + centerx, b[1] + centery), linec)
    def clear():
    clear_screen()
    centerX, centerY = createWindow()
    centerx = centerX
    centery = centerY
    while True:
    draw()
    time.sleep(timestep)
    clear()
    angle = angle + 0.1

  • @ArthurCousseau
    @ArthurCousseau 6 лет назад +5

    I've been working in 3d game development for nearly 2 years now, and still I learn a lot from your videos! Your work here is a real goldmine, and really accessible to future generations of coders. That's awesome.

  • @kevnar
    @kevnar 6 лет назад +11

    Coding Challenge for you, Daniel: Create a 2D maze (as in your maze challenge), then render it in first person perspective using points and lines as in this challenge. Let the user walk around in it with keyboard clicks and mouse looking.
    I attempted this years ago in Visual Basic 6.0, without knowing any of this matrix math. It nearly broke my brain.

    • @loafy8532
      @loafy8532 6 лет назад

      that would be fun, but probably would take a very long time to do

  • @gathorn
    @gathorn 6 лет назад +7

    the explanation and the analogy with the shadow were just amazing

  • @lefantastique59
    @lefantastique59 2 года назад +4

    This video inspired me to code my own 3D modelisation software for my final school project. So thank you so much!

  • @eagle32349
    @eagle32349 8 месяцев назад +1

    26:29 Here is the algorithm:
    int k = 0;
    for (int i = 1; i < 5; ++i) { int l = 1;
    for (int j = 1; j < 5; ++j) drawLine(hdc, p[k], p[l += j]);
    k += i;
    }

  • @Jianju69
    @Jianju69 6 лет назад +3

    You're so good-natured that you make coding fun.

  • @hexcodeff6624
    @hexcodeff6624 4 года назад +60

    18:44
    "This works to fast"
    -no programmer ever

  • @azyfloof
    @azyfloof 6 лет назад +37

    "I'm going to reward myself with a piece of space melon"
    This is the future :P

  • @Jaultaub
    @Jaultaub 6 лет назад +53

    I always wondered how 3D rendering works. Never thought that it was that 'easy'.
    I now really want to build this in C and draw 3D stuff to the console!

    • @Dzatoah
      @Dzatoah 6 лет назад +2

      You cant draw in a Console i think

    • @xxslajerxx8890
      @xxslajerxx8890 6 лет назад +10

      Well... he can draw box using - and | so he kinda can create 3d stuff in console.

    • @Jaultaub
      @Jaultaub 6 лет назад +2

      @@xxslajerxx8890 that is what i will be doing.

    • @Jaultaub
      @Jaultaub 6 лет назад

      I don't know if it worked but I at least tried to share my code:
      I have added the code and video to the contributions! Feel free to check it out!
      Edit: Please don't mind the commented out garbage in the main function, I forgot that it was there and now I don't know how to change the file.

    • @Jaultaub
      @Jaultaub 6 лет назад +3

      Therefore I will just add a link to the code: down
      +
      +
      +
      edit: gist.github.com/spulilol/4732968c3073faf8a42d2b7477caf929

  • @morto360
    @morto360 6 лет назад +3

    AMAZING!!!! If somebody asked me to do this, I wouldnt even dare to try since I thought is super complex... had no idea it can be so easy!!

  • @allurbase
    @allurbase 6 лет назад +4

    Good that you fixed that extra zero, was making me crazy that it was working even though that typo

  • @benny.6588
    @benny.6588 2 года назад +1

    you are really a genious...i was maing something like this for fun in 2000 year, but i did not reach so far, and with this deep understaning, you are my inspirational mentor , thanks dude

  • @Naej7
    @Naej7 6 лет назад +13

    OMG when you applied the perspective the first time, I couldn’t see the cube in the right way ! I was just seeing a kind of jelly wobbling xD

  • @mikee.
    @mikee. 6 лет назад +5

    Wow processing is amazingly simple!

    • @PandoraMakesGames
      @PandoraMakesGames 6 лет назад +4

      Yeah, I've made some cool things with it. IDE could be a little better, but the framework is great.

  • @nvadot1633
    @nvadot1633 6 лет назад +25

    Shoot, now I'm hyped to try implement this myself... Well, here goes my night

  • @oeq57
    @oeq57 4 года назад +1

    Was doing this at work today, came back to your video for reference. Thanks Dan :D

  • @Pilosofia
    @Pilosofia 2 года назад

    in my university they told us to build 3d objects from scratch. you do a crazy things with this library. I can't imagine myself build something similar but I will try

  • @rodneykingston6420
    @rodneykingston6420 4 года назад

    Any book or tutorial on WebGL or OpenGL should start with exactly the material covered in this video and the previous one, before any GL code is even introduced. Showing how matrix multiplication of vertexes work and how specific matrices can be utilized with point and line drawing primitives of a 2D library to achieve 3D effects - WOW! Brilliant. Just Brilliant. Thanks for clearing up a previously foggy area for me.

  • @lidestudios5094
    @lidestudios5094 2 года назад

    Exactly the type of information I've been searching for -- thanks for taking the time to make this and explain everything! I'll create something epic in the future with this power

  • @gloubiboulgazeblob
    @gloubiboulgazeblob 5 лет назад

    First nice and easy explanation of 3D rendering I see in my life. Thanks !!!

  • @franeklubi
    @franeklubi 6 лет назад +2

    Yes! Thank you Dan, you're making me so happy with these videos! :D

  • @camerobaird5939
    @camerobaird5939 Год назад

    Why did that make sense in the most confusing way possible? Thank you for this

  • @woobie5649
    @woobie5649 4 года назад +1

    This a best explanation i've seen in youtube about this theme. Thank you so much

  • @alfonsoknows3318
    @alfonsoknows3318 6 лет назад +1

    i just did this coding challenge myself in processing. But as i just learned quaternions, i did all the rotating thingies with quaternions instead of matrices. It was veeery satisfying, seeing the cube rotate in the end around really any 3d axis.....

    • @TheCodingTrain
      @TheCodingTrain  6 лет назад +2

      Did you watch the 3Blue1Brown video? I am excited to try some Quaternion examples!

    • @alfonsoknows3318
      @alfonsoknows3318 6 лет назад +1

      @@TheCodingTrain Yes i did. That's where i got the idea from actually... After watching the 3b1b video i read a few university lecture notes about quaternions and 3d rotations and when i then saw your video right here, i thought i could combine the two...

  • @Looki2000
    @Looki2000 2 года назад +1

    you can caclculate the focal length for perspective projection with "focal_length = window_height/2 * cot(fov) / 2)". Dont forget to remove that scaling at 21:09

  • @ricardo.mazeto
    @ricardo.mazeto 6 лет назад +3

    Daniel, you're so close to make a full 3D graphics engine!

  • @jeeaile5835
    @jeeaile5835 6 лет назад +4

    I don’t watch the entire video but i’ve already liked

  • @phos4us
    @phos4us 5 лет назад +1

    my algorithm for drawing lines is just an array of 12 smallers arrays of 2 that store the two indices needed for each line and it cycles through it.

  • @rebornreaper194
    @rebornreaper194 Год назад

    I like your channel. You have such a great attitude, and you're clearly knowledgeable -- but you also show that it's ok not to know everything. You foster a great attitude towards ongoing learning. 😄👏

  • @beaverjoe9171
    @beaverjoe9171 6 лет назад

    I saw the content on the slack several days ago and I can saw it on RUclips now! AMAZING

  • @giorgosd3624
    @giorgosd3624 6 лет назад +5

    Nice video, looking forward into higher dimensions!
    Also a guest video would be nice, been a long time since the last

  • @Guysudai1
    @Guysudai1 6 лет назад +11

    I did the same thing in assembly as a school project(only for more shapes)

    • @nvadot1633
      @nvadot1633 6 лет назад +2

      Guysudai1 in assembly?? O_o mind sharing the source code, you got me curious...

    • @Guysudai1
      @Guysudai1 6 лет назад +2

      uploaded it to github.com/guysudai1/asm-project

    • @nvadot1633
      @nvadot1633 6 лет назад +2

      Guysudai1 holy.cow, that's impressive!! Thanks for sharing!!

    • @Guysudai1
      @Guysudai1 6 лет назад

      @@nvadot1633 no problem!

    • @otesunki
      @otesunki 6 лет назад +2

      Woah, In ASSEMBLY!?!??!?! if you can do that, you can do anything!

  • @kartoffellicht863
    @kartoffellicht863 2 года назад

    Love it! love everything! Love coding! Love examples! Love humor! EVERYTHING!!

  • @2001hyundaisantafe
    @2001hyundaisantafe 4 года назад

    thanks to your tutorial i created something that does essentially the same thing in pico8. this is a-ma-zing, keep it up

  • @kantyDarius
    @kantyDarius 6 лет назад +1

    awesome, i´d made a program in visual basic a couple years ago that use topographic images of mars´s surface transforming the colors and position of each pixel into an array of values then pass this values to the program por render in 3d with zoom in, zoom out, rotation, water flood simulation and a couple of features more (sorry por my english)

  • @cashel1111
    @cashel1111 6 лет назад +1

    i know you just uploaded this, but would love to download the code :)
    that perspective explanation is the first that has made sense to me, keep it up

    • @TheCodingTrain
      @TheCodingTrain  6 лет назад

      You can find it at thecodingtrain.com! (Oh, actually the page is broken for some reason, looking into it.) Code is here: github.com/CodingTrain/website/tree/master/CodingChallenges/CC_112_3D_Rendering

  • @unremarkable-nl
    @unremarkable-nl 6 лет назад +6

    16:20 i was screaming at my screen for the missing comma and extra 0

  • @alexfish7792
    @alexfish7792 Год назад +1

    31:15 was the best part 🤣

  • @seth-blank
    @seth-blank Год назад

    Finally someone actually explained projection matrix's :D

  • @flwi
    @flwi Год назад

    Awesome video! Just what I needed for my advent of code problem

  • @kevnar
    @kevnar 4 года назад

    In a past life, Daniel was a mad scientist.

  • @kirbofn524
    @kirbofn524 Год назад

    Anyone following 4 years later… at the point where you connect the lines, simply in the for v : points loop, save the last screen coordinate in a non loop local variable (as in declared outside) then check, if it has been initiated (had a value) then draw a line between it and the current point

  • @vladthe_cat
    @vladthe_cat Год назад

    6:34 omg that looks familiar!
    Thank you Linear Algebra & Matrix Theory!

  • @emteiks
    @emteiks 2 года назад

    A Giant at work. Thanks for making this video!

  • @juicepops7819
    @juicepops7819 4 года назад +9

    13:26 everytime I get an error in my code

  • @stalkerkk
    @stalkerkk 4 года назад

    Literally no body able to explain that simple projection matrix that simple, I was to give up 3d programming and my RUclips shows your video.

  • @silvertakana3932
    @silvertakana3932 3 года назад

    Shiffman “Oh boy! this work too fast. I didn’t want it to work that fast”.
    All other programmers drop their mouth

  • @sakul_the_one4821
    @sakul_the_one4821 18 дней назад

    Perfect for my Ti-84 CE-T Calculator

  • @sukhWins
    @sukhWins 4 года назад

    My favorite channel

  • @MattBee2k2
    @MattBee2k2 6 лет назад

    Love the videos and your energy man!

  • @gibbermagash5559
    @gibbermagash5559 6 лет назад +2

    So I ran into two erros I can't fix. "The function "matmul()" expects parameters like "matmul(float[ ][ ], PVector)" and "Duplicate local variable v". I couldn't find an error in my code so I copied the codes from the links into the P3 editor and got the same errors.

  • @DogwafflDan
    @DogwafflDan 6 лет назад

    Enjoyed this one quite a lot!

  • @tonysfun
    @tonysfun 5 лет назад

    Very talented young man!!! Love your video!

  • @roshanpawara8717
    @roshanpawara8717 6 лет назад +2

    I have the same shirt. Same pinch!

  • @puppergump4117
    @puppergump4117 3 года назад

    I got everything right (using cpp) but I have a couple problems.
    Firstly, the z values separate the two layers of cube opposite each other. Basically I now have two squares rotating around an empty space.
    It also keeps rotating around the upper left corner (the origin). I tried subtracting the point's position with the cube's position and it kind of centered, but it always rotates around with the upper left point pointing toward the rotation point. I cannot get the rotation point to be inside the cube. When I tried, everything froze.
    The worst part is that I just did exactly what you did. I can only guess that there are more 3d helping tools in processing, even without the 3d functions.

  • @int16_t
    @int16_t 4 года назад

    I hope you defined the direction of x y z.
    It's quite confusing whether z is the vertical axis or y.

  • @sugiono2801
    @sugiono2801 4 года назад +1

    should i learn linear algebra or some math and physics for my computer graphics class? i really didnt understand how rotation works

    • @sugiono2801
      @sugiono2801 4 года назад +1

      please someone help me

    • @hodayfa000h
      @hodayfa000h 5 месяцев назад

      You probably do by now (;

  • @kimung203
    @kimung203 6 лет назад +3

    The coding train: I finished a 3d cube
    Tesseract: hold my beer
    The coding train: hahahaha **breathes** no you
    Penteract: hold my vodka
    The coding train: oh hell no

  • @bakisha
    @bakisha 5 лет назад

    And here i am, trying to search a way to program arduino 8x8x8 RGB led cube to do rotating cube animation. Interesting video, i found some useful info, plus that part in 24:50...

  • @alexfagan6249
    @alexfagan6249 4 года назад +4

    ive been following along using python, so far everything works, until i add perspective. Anyone know the original perspective formula i should use?

  • @4teapo
    @4teapo 3 года назад +1

    30:27 WOW I just discovered something super cool! I am currently very tired and so my brain registered the sides wrongly. The small face, the back face, was to me seen as the front face. This means that it looked like a suuuper weird shape (similar to how a rotating tesseract may look when it comes to certain factors). I then paused the video, and basically reregistered the sides of the cube. Then it appeared as it should have from the start. Am I really the only one?

    • @gummifer
      @gummifer 2 года назад

      This happened to me. I can switch which version of the cube I'm observing by blinking. Kind of trippy.

  • @zacharymcarthur9013
    @zacharymcarthur9013 6 лет назад +1

    At 32:00 why did the cube all the sudden lost the distortion?

    • @trousersnake81
      @trousersnake81 3 года назад

      wondering the same thing, i think it's because points displayed in front of you are actually supposed to be behind you and not visible? did you ever find an answer to this? sorry to necro

  • @DerSpielerMabuse
    @DerSpielerMabuse 6 лет назад +2

    "I can like DISTORT THE WORLD" followed by evil laughter. Fantastic video as usual, thanks Dan

  • @cazino4
    @cazino4 5 лет назад

    Great videeo as ever. Well done!!

  • @inferious777
    @inferious777 4 года назад

    Im writing this in javascript canvas from scratch. My current rotation axis is the axes themselves (x,y,z), trying to find a way to move it to the midpoint of the object.

    • @inferious777
      @inferious777 4 года назад

      nvm, solved it by translating all points back to the center and translate it back after.

  • @Mustafaq9
    @Mustafaq9 6 лет назад

    Hey Dan, you want to make sure your rotation matrix for the Y axis is correct. The signs on the sin(angle) get swapped for Y, I don't think you've done that.

    • @TheCodingTrain
      @TheCodingTrain  6 лет назад

      Can you point me to a timecode where I got it wrong? Or file an issue related to the code here? github.com/CodingTrain/website/issues

    • @Mustafaq9
      @Mustafaq9 6 лет назад

      @15:34 is where you created the Y rotation matrix. It should be
      [cos 0 sin
      0 1 0
      -sin 0 cos]

  • @androidworld3239
    @androidworld3239 4 года назад

    could i know where do you get (draw and render functions)?
    thank you

  • @yotubeaccoutsuperawesome
    @yotubeaccoutsuperawesome 5 лет назад

    Where can I learn more about this? I'm hoping to learn as much as possible. I really need to improve my canvas game.

  • @freerunner1508
    @freerunner1508 5 лет назад

    You insane coder

  • @keevitajamees
    @keevitajamees 6 лет назад +8

    for(int i = 0; i < codingChallenge.length; i++){
    println("thank you Dan for doing what you are doing");
    println("like your Coding Challenge nr: " + i);
    }

    • @ConphallL
      @ConphallL 5 лет назад

      @Yuri Lopes
      There doesn't have to be any space, because "println();" moves to the next line after printing the text.

  • @celiacasimiro465
    @celiacasimiro465 4 года назад +4

    5:01 Why do I feel like that book might have an exam based of it....
    A) Look at page 8. Find an example of the number 3?....
    E.t.c

  • @ScaredHelmet
    @ScaredHelmet Год назад

    How can you change it so when you move the cube up, down, left or right, it still spins around its own center instead of the center of the screen?

  • @bennguyen1313
    @bennguyen1313 3 года назад

    Do you have any suggestions on how to plot live-data, that comes from the usb/serial-port? P5JS , PixiJS , ZIMJS, TwoJS?
    For example, not sure which package would best keep up drawing a simple line graph, as the data that comes streaming in, but I'd *LOVE* to use P2D, maybe with Python!

  • @chaos6094
    @chaos6094 6 лет назад +1

    Amazing video, thank you!

  • @peterlous853
    @peterlous853 6 лет назад +1

    Nice coding challange! How do you prevent division by zero when doing the perspective projection (i.e. distance - rotated.z = 0)?

  • @hashamyounas3864
    @hashamyounas3864 Год назад

    where to get all that java code?

  • @pareshkumarsahoo3421
    @pareshkumarsahoo3421 4 года назад

    Can you please send this code I am getting error.and please tell which app should I use for java in my phone

  • @MrEven9401
    @MrEven9401 6 лет назад

    Very interesting video, math is just amazing.

  • @gillesvismara5228
    @gillesvismara5228 6 лет назад

    Thank you, thank you for everything!

  • @GeneralPet
    @GeneralPet 4 года назад

    I know this is done in processing, but there's got to be some some way to use hardware acceleration for matrix operations.

  • @BaronVonTacocat
    @BaronVonTacocat 6 лет назад

    Cool video, homie!

  • @tiktoks4579
    @tiktoks4579 Год назад

    it's like a four dimensional hyperspace

  • @acd2377
    @acd2377 2 года назад

    I wonder how to draw colored faces so that only front ones are visible

  • @hamzaf19
    @hamzaf19 3 года назад

    I love your videos and thanks you helped me a lot with that video tho!

  • @iosgamer158
    @iosgamer158 6 лет назад

    Really interesting video thank you and keep up the good work 😃

  • @_rgrtht
    @_rgrtht 6 лет назад +2

    i love your channel

  • @vahe.gevorgyan
    @vahe.gevorgyan 2 года назад

    Where can i find functions that he has written before and using now?

  • @NOCTUMSEMPRA
    @NOCTUMSEMPRA 4 года назад

    Lol, dude. You are crazy but you are brilliant, and so was your video. First video I've seen from you. Plain subscribe, of course.
    I hope I can understand these topics because I would LOVE to be able to make a 2D perspective based tennis game (like Mario Tennis for Gameboy Advance) but with the aesthetics and fun of a Kunio-kun no-Nekketsu game.
    Hugs from Argentina.
    P.S: Excuse my awkward English by the way.

  • @swatantramukherjee
    @swatantramukherjee 6 лет назад

    How to decrease rotation speed?

  • @kkingofplayerr
    @kkingofplayerr 6 лет назад

    If we use pictures, instead of lines and dots?

  • @ArunKumar-tl1zu
    @ArunKumar-tl1zu 4 года назад

    What will the projection matrix be if the camera will be in some other point say (10, 20, 7)

  • @deltakid0
    @deltakid0 4 года назад

    30:27 I have a problem in my mind because sometimes I can see what Daniel intended it to be and sometimes I see a deformed cube, is that only happening to me?

    • @Hello-qg4yk
      @Hello-qg4yk 4 года назад

      You mean distance = 1? Only happens there. Not at any other distance

  • @truefiasco2637
    @truefiasco2637 6 лет назад

    I would really like to see how you'd render 4d rotations as they look really cool, I've tried doing it in Processing without any success, I've been able to "rotate" a hyper cube in "4d "

  • @mindaugasdudenas624
    @mindaugasdudenas624 6 лет назад

    Thank you for this, but I try for a couple of hours to understand how I could do the same with the planes ( begin shape end shape ). So I would have a fill over it, but it just does not work in my head so far. Any guidance would be much appreciated.