Introduction to 3D Rotation Matrices
⚠ Click here to regain focus ⚠

?

?

t / T Toggle theatre / SUPERtheatre mode

z Toggle filter mode V Revert filter to original state

X, ShiftSpace Toggle category and focus previous

v Invert topics / media as per focus

# Keyboard Navigation

## Global Keys

W, A, P / S, D, N Jump to previous / next markert / T Toggle theatre / SUPERtheatre mode

z Toggle filter mode V Revert filter to original state

## Menu toggling

q Quotes r References f Filter c Credits## Movement

a

w

s

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 nextX, ShiftSpace Toggle category and focus previous

v Invert topics / media as per focus

## 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

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

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

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: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