Handmade Hero»Episode Guide
Introduction to 3D Rotation Matrices
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
0:07Recap and set the stage for the day
0:07Recap and set the stage for the day
0:07Recap and set the stage for the day
1:57Run the game to demo the current state, with a few words on moving towards a more direct streaming approach
1:57Run the game to demo the current state, with a few words on moving towards a more direct streaming approach
1:57Run the game to demo the current state, with a few words on moving towards a more direct streaming approach
5:18handmade_platform.h: Remove the sort data from game_render_commands
5:18handmade_platform.h: Remove the sort data from game_render_commands
5:18handmade_platform.h: Remove the sort data from game_render_commands
9:59handmade_opengl.cpp: Make OpenGLRenderCommands() correctly push textures
9:59handmade_opengl.cpp: Make OpenGLRenderCommands() correctly push textures
9:59handmade_opengl.cpp: Make OpenGLRenderCommands() correctly push textures
14:10handmade_render_group.cpp: Make PushClipRect() call PushRenderElement()
14:10handmade_render_group.cpp: Make PushClipRect() call PushRenderElement()
14:10handmade_render_group.cpp: Make PushClipRect() call PushRenderElement()
16:41handmade_opengl.cpp: Enable OpenGLRenderCommands() to handle the cliprect case, and run the game to see it working
16:41handmade_opengl.cpp: Enable OpenGLRenderCommands() to handle the cliprect case, and run the game to see it working
16:41handmade_opengl.cpp: Enable OpenGLRenderCommands() to handle the cliprect case, and run the game to see it working
19:13todo.txt: Update the TODO list with a few words on making a freely rotatable camera
19:13todo.txt: Update the TODO list with a few words on making a freely rotatable camera
19:13todo.txt: Update the TODO list with a few words on making a freely rotatable camera
24:40Blackboard: Rotation Matrices
24:40Blackboard: Rotation Matrices
24:40Blackboard: Rotation Matrices
30:42Blackboard: Deriving a Rotation Matrix
30:42Blackboard: Deriving a Rotation Matrix
30:42Blackboard: Deriving a Rotation Matrix
36:25Blackboard: 3D Rotation Matrices
36:25Blackboard: 3D Rotation Matrices
36:25Blackboard: 3D Rotation Matrices
40:18Blackboard: 2D vs 3D Axes of Rotation
40:18Blackboard: 2D vs 3D Axes of Rotation
40:18Blackboard: 2D vs 3D Axes of Rotation
43:56Blackboard: Coordinate system handedness
43:56Blackboard: Coordinate system handedness
43:56Blackboard: Coordinate system handedness
50:45Blackboard: Rotating in 3D around the cardinal Z axis
50:45Blackboard: Rotating in 3D around the cardinal Z axis
50:45Blackboard: Rotating in 3D around the cardinal Z axis
58:28Blackboard: Generalising this to the other axes
58:28Blackboard: Generalising this to the other axes
58:28Blackboard: Generalising this to the other axes
1:10:43Blackboard: Solving for a freely movable camera, using matrix multiplication
1:10:43Blackboard: Solving for a freely movable camera, using matrix multiplication
1:10:43Blackboard: Solving for a freely movable camera, using matrix multiplication
1:23:20Blackboard: Matrix multiplication in summation notation
1:23:20Blackboard: Matrix multiplication in summation notation
1:23:20Blackboard: Matrix multiplication in summation notation
1:27:57handmade_math.h: Introduce operator*() that operates on a 4x4 matrix
1:27:57handmade_math.h: Introduce operator*() that operates on a 4x4 matrix
1:27:57handmade_math.h: Introduce operator*() that operates on a 4x4 matrix
1:37:07Blackboard: Determining the shape of the matrix product
1:37:07Blackboard: Determining the shape of the matrix product
1:37:07Blackboard: Determining the shape of the matrix product
1:39:23Blackboard: Transforming points
1:39:23Blackboard: Transforming points
1:39:23Blackboard: Transforming points
1:41:39handmade_math.h: Introduce Identity(), XRotation(), YRotation() and ZRotation()
1:41:39handmade_math.h: Introduce Identity(), XRotation(), YRotation() and ZRotation()
1:41:39handmade_math.h: Introduce Identity(), XRotation(), YRotation() and ZRotation()
1:48:04handmade_math.h: Introduce Transpose()
1:48:04handmade_math.h: Introduce Transpose()
1:48:04handmade_math.h: Introduce Transpose()
1:48:21Blackboard: Matrix Transpose
1:48:21Blackboard: Matrix Transpose
1:48:21Blackboard: Matrix Transpose
1:50:35handmade_math.h: Introduce Projection()
1:50:35handmade_math.h: Introduce Projection()
1:50:35handmade_math.h: Introduce Projection()
1:53:49handmade_opengl.cpp: Make OpenGLRenderCommands() project and transpose our matrix
1:53:49handmade_opengl.cpp: Make OpenGLRenderCommands() project and transpose our matrix
1:53:49handmade_opengl.cpp: Make OpenGLRenderCommands() project and transpose our matrix
1:55:32Step into OpenGLRenderCommands() and inspect the projection matrix
1:55:32Step into OpenGLRenderCommands() and inspect the projection matrix
1:55:32Step into OpenGLRenderCommands() and inspect the projection matrix
1:56:40handmade_math.h: Make our new operator*() and Transpose() loop over all the values
1:56:40handmade_math.h: Make our new operator*() and Transpose() loop over all the values
1:56:40handmade_math.h: Make our new operator*() and Transpose() loop over all the values
1:57:14Step into OpenGLRenderCommands() again to see the transpose working correctly
1:57:14Step into OpenGLRenderCommands() again to see the transpose working correctly
1:57:14Step into OpenGLRenderCommands() again to see the transpose working correctly
1:58:28Q&A
🗩
1:58:28Q&A
🗩
1:58:28Q&A
🗩
1:59:24a_pulsing_mage You once said that people don't really use matrices as the storage in real world things. Can you talk about the alternatives?
🗪
1:59:24a_pulsing_mage You once said that people don't really use matrices as the storage in real world things. Can you talk about the alternatives?
🗪
1:59:24a_pulsing_mage You once said that people don't really use matrices as the storage in real world things. Can you talk about the alternatives?
🗪
2:02:41desuused Will we use quaternions? Producing rotation matrix from quaternions seems a good idea
🗪
2:02:41desuused Will we use quaternions? Producing rotation matrix from quaternions seems a good idea
🗪
2:02:41desuused Will we use quaternions? Producing rotation matrix from quaternions seems a good idea
🗪
2:03:09neitchzehrer So from now on, you will only be streaming on Saturday and Sunday?
🗪
2:03:09neitchzehrer So from now on, you will only be streaming on Saturday and Sunday?
🗪
2:03:09neitchzehrer So from now on, you will only be streaming on Saturday and Sunday?
🗪
2:03:19pepevel Would it be worth investing time doing a SIMD optimization for matrix multiplication, or is it like killing ants with a rifle?
🗪
2:03:19pepevel Would it be worth investing time doing a SIMD optimization for matrix multiplication, or is it like killing ants with a rifle?
🗪
2:03:19pepevel Would it be worth investing time doing a SIMD optimization for matrix multiplication, or is it like killing ants with a rifle?
🗪
2:04:25pandamite Are you going to use simpler rotation functions that are mainly focused on smaller matrices such as your 4x4, then emphasizing another method on much larger matrices?
🗪
2:04:25pandamite Are you going to use simpler rotation functions that are mainly focused on smaller matrices such as your 4x4, then emphasizing another method on much larger matrices?
🗪
2:04:25pandamite Are you going to use simpler rotation functions that are mainly focused on smaller matrices such as your 4x4, then emphasizing another method on much larger matrices?
🗪
2:04:54felkcraft Is it worth having code for producing a full rotation matrix (x, y and z) at once instead of multiplying three different matrices?
🗪
2:04:54felkcraft Is it worth having code for producing a full rotation matrix (x, y and z) at once instead of multiplying three different matrices?
🗪
2:04:54felkcraft Is it worth having code for producing a full rotation matrix (x, y and z) at once instead of multiplying three different matrices?
🗪
2:06:23zilarrezko I'm inferring that those braces encompassing the four rows in those matrix operations aren't doing anything? (It isn't creating an extra dimension in the matrix?)
🗪
2:06:23zilarrezko I'm inferring that those braces encompassing the four rows in those matrix operations aren't doing anything? (It isn't creating an extra dimension in the matrix?)
🗪
2:06:23zilarrezko I'm inferring that those braces encompassing the four rows in those matrix operations aren't doing anything? (It isn't creating an extra dimension in the matrix?)
🗪
2:08:08zamar037 Hi Casey, haven't caught a stream in a while. How are things going?
🗪
2:08:08zamar037 Hi Casey, haven't caught a stream in a while. How are things going?
🗪
2:08:08zamar037 Hi Casey, haven't caught a stream in a while. How are things going?
🗪
2:09:09pepevel Don't you have to return a value in the multiplication function?
🗪
2:09:09pepevel Don't you have to return a value in the multiplication function?
🗪
2:09:09pepevel Don't you have to return a value in the multiplication function?
🗪
2:11:33emosaru Q: Casey, might be worth pointing out that that behavior in MSVC is specific to inline functions
🗪
2:11:33emosaru Q: Casey, might be worth pointing out that that behavior in MSVC is specific to inline functions
🗪
2:11:33emosaru Q: Casey, might be worth pointing out that that behavior in MSVC is specific to inline functions
🗪
2:13:21pandamite I kind of just joined on to this channel. Sorry about the lack of the knowledge of the code so far, but I was referring to the case of having such large matrices that you would consider partitioning the matrices into separate parts for quicker rotations
🗪
2:13:21pandamite I kind of just joined on to this channel. Sorry about the lack of the knowledge of the code so far, but I was referring to the case of having such large matrices that you would consider partitioning the matrices into separate parts for quicker rotations
🗪
2:13:21pandamite I kind of just joined on to this channel. Sorry about the lack of the knowledge of the code so far, but I was referring to the case of having such large matrices that you would consider partitioning the matrices into separate parts for quicker rotations
🗪
2:17:01vaualbus Would it not be better to make the matrix struct use an r32 array of 16 elements instead of a two dimensional one? In that should we SIMD the math operation?
🗪
2:17:01vaualbus Would it not be better to make the matrix struct use an r32 array of 16 elements instead of a two dimensional one? In that should we SIMD the math operation?
🗪
2:17:01vaualbus Would it not be better to make the matrix struct use an r32 array of 16 elements instead of a two dimensional one? In that should we SIMD the math operation?
🗪
2:19:10teamrandb Forgive the dumb question, but why are your include guards defined at the bottom of the header instead of the top? Is this purely what you chose to do, or is there another purpose? (#if is checked at the top, but the #define is at the bottom. Most code I've seen does it at the top)
🗪
2:19:10teamrandb Forgive the dumb question, but why are your include guards defined at the bottom of the header instead of the top? Is this purely what you chose to do, or is there another purpose? (#if is checked at the top, but the #define is at the bottom. Most code I've seen does it at the top)
🗪
2:19:10teamrandb Forgive the dumb question, but why are your include guards defined at the bottom of the header instead of the top? Is this purely what you chose to do, or is there another purpose? (#if is checked at the top, but the #define is at the bottom. Most code I've seen does it at the top)
🗪
2:21:47teamrandb Sorry, Casey, I am still looking at older streams. I guess you may have changed that already
🗪
2:21:47teamrandb Sorry, Casey, I am still looking at older streams. I guess you may have changed that already
🗪
2:21:47teamrandb Sorry, Casey, I am still looking at older streams. I guess you may have changed that already
🗪
2:22:58Get going with a glimpse into the future
🗩
2:22:58Get going with a glimpse into the future
🗩
2:22:58Get going with a glimpse into the future
🗩