Improving Camera Motion
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next timestamp
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 and Index Controls

a
w
s
d
h j k l


Esc Close menu / unfocus timestamp

Quotes and References Menus and Index

Enter Jump to timestamp

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:00Recap our new entity grouping functionality and set the stage for the day
🗩
0:00Recap our new entity grouping functionality and set the stage for the day
🗩
0:00Recap our new entity grouping functionality and set the stage for the day
🗩
1:59Show off our orphan–cat groups
🏃
1:59Show off our orphan–cat groups
🏃
1:59Show off our orphan–cat groups
🏃
3:02Create a special camera-triggering entity region, introducing AddConversation() and GetCameraOffsetZForCloseup()
3:02Create a special camera-triggering entity region, introducing AddConversation() and GetCameraOffsetZForCloseup()
3:02Create a special camera-triggering entity region, introducing AddConversation() and GetCameraOffsetZForCloseup()
13:09Toggle on the entity bounds debug visualisation in UpdateAndRenderEntities()
13:09Toggle on the entity bounds debug visualisation in UpdateAndRenderEntities()
13:09Toggle on the entity bounds debug visualisation in UpdateAndRenderEntities()
14:08Check out our entity bounds debug visualisation
🏃
14:08Check out our entity bounds debug visualisation
🏃
14:08Check out our entity bounds debug visualisation
🏃
15:38Make PlaceOrphan() position the orphan facing downwards
15:38Make PlaceOrphan() position the orphan facing downwards
15:38Make PlaceOrphan() position the orphan facing downwards
16:19Announce the upcoming Tau vs Pi rant
🗩
16:19Announce the upcoming Tau vs Pi rant
🗩
16:19Announce the upcoming Tau vs Pi rant
🗩
17:02Change PlaceOrphan() to add a conversation rather than a cat
17:02Change PlaceOrphan() to add a conversation rather than a cat
17:02Change PlaceOrphan() to add a conversation rather than a cat
17:30Find that the conversation boxes are misplaced
🏃
17:30Find that the conversation boxes are misplaced
🏃
17:30Find that the conversation boxes are misplaced
🏃
17:48Fix AddConversation() to correctly position the entity
17:48Fix AddConversation() to correctly position the entity
17:48Fix AddConversation() to correctly position the entity
18:10Find that the conversations are correctly positioned
🏃
18:10Find that the conversations are correctly positioned
🏃
18:10Find that the conversations are correctly positioned
🏃
18:39Recompile in debug mode
18:39Recompile in debug mode
18:39Recompile in debug mode
19:15Step in to UpdateCameraForEntityMovement() to find that we never get to the special camera case
🏃
19:15Step in to UpdateCameraForEntityMovement() to find that we never get to the special camera case
🏃
19:15Step in to UpdateCameraForEntityMovement() to find that we never get to the special camera case
🏃
21:12Make AddConversation() create a larger collision box
21:12Make AddConversation() create a larger collision box
21:12Make AddConversation() create a larger collision box
21:41Step in to UpdateCameraForEntityMovement() to find that we now trigger the special camera case
🏃
21:41Step in to UpdateCameraForEntityMovement() to find that we now trigger the special camera case
🏃
21:41Step in to UpdateCameraForEntityMovement() to find that we now trigger the special camera case
🏃
24:19Make GetCameraOffsetZForCloseup() zoom in closer
24:19Make GetCameraOffsetZForCloseup() zoom in closer
24:19Make GetCameraOffsetZForCloseup() zoom in closer
25:05Try out our conversation zoom
🏃
25:05Try out our conversation zoom
🏃
25:05Try out our conversation zoom
🏃
26:14Make AddConversation() offset the camera northwards
26:14Make AddConversation() offset the camera northwards
26:14Make AddConversation() offset the camera northwards
26:44Try out our offset conversation zoom
🏃
26:44Try out our offset conversation zoom
🏃
26:44Try out our offset conversation zoom
🏃
27:37Plan to improve the camera code: damping hopping motion; alpha clipping interpolation; reintroducing debug camera; computing lighting for the entire visible area
🏃
27:37Plan to improve the camera code: damping hopping motion; alpha clipping interpolation; reintroducing debug camera; computing lighting for the entire visible area
🏃
27:37Plan to improve the camera code: damping hopping motion; alpha clipping interpolation; reintroducing debug camera; computing lighting for the entire visible area
🏃
30:28Harmonising the alpha clip and camera movement interpolation
📖
30:28Harmonising the alpha clip and camera movement interpolation
📖
30:28Harmonising the alpha clip and camera movement interpolation
📖
34:11Mathematically tie together the alpha clip and camera position interpolation in UpdateCameraForEntityMovement()
34:11Mathematically tie together the alpha clip and camera position interpolation in UpdateCameraForEntityMovement()
34:11Mathematically tie together the alpha clip and camera position interpolation in UpdateCameraForEntityMovement()
43:41Try out our newly harmonised camera
🏃
43:41Try out our newly harmonised camera
🏃
43:41Try out our newly harmonised camera
🏃
45:11Fix UpdateCameraForEntityMovement() to use the target camera position directly if it's close enough
45:11Fix UpdateCameraForEntityMovement() to use the target camera position directly if it's close enough
45:11Fix UpdateCameraForEntityMovement() to use the target camera position directly if it's close enough
47:40Try out our harmonised camera
🏃
47:40Try out our harmonised camera
🏃
47:40Try out our harmonised camera
🏃
48:50Try out smaller values for the AlphaMin and AlphaSpan
🏃
48:50Try out smaller values for the AlphaMin and AlphaSpan
🏃
48:50Try out smaller values for the AlphaMin and AlphaSpan
🏃
52:50Reduce the AlphaMin and AlphaSpan in PlayWorld()
52:50Reduce the AlphaMin and AlphaSpan in PlayWorld()
52:50Reduce the AlphaMin and AlphaSpan in PlayWorld()
53:04Plan to damp the camera Z motion
🏃
53:04Plan to damp the camera Z motion
🏃
53:04Plan to damp the camera Z motion
🏃
56:32Only moving the camera when the player has moved far enough, on each axis separately
🏃
56:32Only moving the camera when the player has moved far enough, on each axis separately
🏃
56:32Only moving the camera when the player has moved far enough, on each axis separately
🏃
58:42Augment game_camera with a MovementMask for UpdateCameraForEntityMovement() to modify the camera's position
58:42Augment game_camera with a MovementMask for UpdateCameraForEntityMovement() to modify the camera's position
58:42Augment game_camera with a MovementMask for UpdateCameraForEntityMovement() to modify the camera's position
1:00:20See that our camera is unexpectedly working
🏃
1:00:20See that our camera is unexpectedly working
🏃
1:00:20See that our camera is unexpectedly working
🏃
1:00:48Use the computed TotalDeltaP in UpdateCameraForEntityMovement()
1:00:48Use the computed TotalDeltaP in UpdateCameraForEntityMovement()
1:00:48Use the computed TotalDeltaP in UpdateCameraForEntityMovement()
1:03:19See nothing, as expected
🏃
1:03:19See nothing, as expected
🏃
1:03:19See nothing, as expected
🏃
1:03:30Use Camera->MovementMask in UpdateCameraForEntityMovement() to move the camera above a threshold
1:03:30Use Camera->MovementMask in UpdateCameraForEntityMovement() to move the camera above a threshold
1:03:30Use Camera->MovementMask in UpdateCameraForEntityMovement() to move the camera above a threshold
1:06:35Try out our camera movement threshold
🏃
1:06:35Try out our camera movement threshold
🏃
1:06:35Try out our camera movement threshold
🏃
1:07:08Increase the camera movement threshold in UpdateCameraForEntityMovement()
1:07:08Increase the camera movement threshold in UpdateCameraForEntityMovement()
1:07:08Increase the camera movement threshold in UpdateCameraForEntityMovement()
1:07:37Try out our camera movement threshold
🏃
1:07:37Try out our camera movement threshold
🏃
1:07:37Try out our camera movement threshold
🏃
1:08:26Investigate our threshold and camera movement masking
📖
1:08:26Investigate our threshold and camera movement masking
📖
1:08:26Investigate our threshold and camera movement masking
📖
1:14:29Add camera data to the debug system
1:14:29Add camera data to the debug system
1:14:29Add camera data to the debug system
1:16:31Find that the camera's Y values are already wrong at startup
🏃
1:16:31Find that the camera's Y values are already wrong at startup
🏃
1:16:31Find that the camera's Y values are already wrong at startup
🏃
1:16:54Print the TotalDeltaP after doing the Hadamard product with the MovementMask
1:16:54Print the TotalDeltaP after doing the Hadamard product with the MovementMask
1:16:54Print the TotalDeltaP after doing the Hadamard product with the MovementMask
1:18:55Traverse the orphanage, watching the camera data printout
🏃
1:18:55Traverse the orphanage, watching the camera data printout
🏃
1:18:55Traverse the orphanage, watching the camera data printout
🏃
1:22:20Interpolate the camera when the target position is below 0.01f in UpdateCameraForEntityMovement()
1:22:20Interpolate the camera when the target position is below 0.01f in UpdateCameraForEntityMovement()
1:22:20Interpolate the camera when the target position is below 0.01f in UpdateCameraForEntityMovement()
1:23:21Find that the camera position interpolates forever
🏃
1:23:21Find that the camera position interpolates forever
🏃
1:23:21Find that the camera position interpolates forever
🏃
1:25:57Fix UpdateCameraForEntityMovement() to only interpolate the camera when the target position is above 0.01f
1:25:57Fix UpdateCameraForEntityMovement() to only interpolate the camera when the target position is above 0.01f
1:25:57Fix UpdateCameraForEntityMovement() to only interpolate the camera when the target position is above 0.01f
1:26:36Find that the camera interpolation is discontinuous
🏃
1:26:36Find that the camera interpolation is discontinuous
🏃
1:26:36Find that the camera interpolation is discontinuous
🏃
1:26:44Increase that target distance threshold in UpdateCameraForEntityMovement()
1:26:44Increase that target distance threshold in UpdateCameraForEntityMovement()
1:26:44Increase that target distance threshold in UpdateCameraForEntityMovement()
1:27:30Try out our stabilising camera, still with slight wonkiness
🏃
1:27:30Try out our stabilising camera, still with slight wonkiness
🏃
1:27:30Try out our stabilising camera, still with slight wonkiness
🏃
1:28:01Remove that target threshold, and reduce the deceleration of our proportional derivative controller from 6 to 2
1:28:01Remove that target threshold, and reduce the deceleration of our proportional derivative controller from 6 to 2
1:28:01Remove that target threshold, and reduce the deceleration of our proportional derivative controller from 6 to 2
1:28:31Try out our camera to find it overshoots
🏃
1:28:31Try out our camera to find it overshoots
🏃
1:28:31Try out our camera to find it overshoots
🏃
1:28:36Increase the deceleration of our proportional derivative controller from 2 to 3
1:28:36Increase the deceleration of our proportional derivative controller from 2 to 3
1:28:36Increase the deceleration of our proportional derivative controller from 2 to 3
1:28:38Traverse the orphanage to still find overshoot in the camera, increasing the deceleration value to 5.5
🏃
🖮
1:28:38Traverse the orphanage to still find overshoot in the camera, increasing the deceleration value to 5.5
🏃
🖮
1:28:38Traverse the orphanage to still find overshoot in the camera, increasing the deceleration value to 5.5
🏃
🖮
1:31:05Reduce that deceleration value to 5.25
1:31:05Reduce that deceleration value to 5.25
1:31:05Reduce that deceleration value to 5.25
1:31:19Try out our camera, and consider making the MovementMask signed
🏃
1:31:19Try out our camera, and consider making the MovementMask signed
🏃
1:31:19Try out our camera, and consider making the MovementMask signed
🏃
1:33:14Let the camera smoothly change direction in UpdateCameraForEntityMovement()
1:33:14Let the camera smoothly change direction in UpdateCameraForEntityMovement()
1:33:14Let the camera smoothly change direction in UpdateCameraForEntityMovement()
1:35:48Try out camera direction changing
🏃
1:35:48Try out camera direction changing
🏃
1:35:48Try out camera direction changing
🏃
1:36:13Reduce the camera speed threshold in UpdateCameraForEntityMovement()
1:36:13Reduce the camera speed threshold in UpdateCameraForEntityMovement()
1:36:13Reduce the camera speed threshold in UpdateCameraForEntityMovement()
1:36:22Try out camera direction changing
🏃
1:36:22Try out camera direction changing
🏃
1:36:22Try out camera direction changing
🏃
1:37:09Cold set the camera's velocity when it is close enough to the target
1:37:09Cold set the camera's velocity when it is close enough to the target
1:37:09Cold set the camera's velocity when it is close enough to the target
1:37:24Try out the camera to find that the special camera gets positioned incorrectly
🏃
1:37:24Try out the camera to find that the special camera gets positioned incorrectly
🏃
1:37:24Try out the camera to find that the special camera gets positioned incorrectly
🏃
1:37:55Make the special camera set the Camera->MovementMask to 1, 1, 1
1:37:55Make the special camera set the Camera->MovementMask to 1, 1, 1
1:37:55Make the special camera set the Camera->MovementMask to 1, 1, 1
1:38:23Try out the special camera
🏃
1:38:23Try out the special camera
🏃
1:38:23Try out the special camera
🏃
1:39:50Q&A
🗩
1:39:50Q&A
🗩
1:39:50Q&A
🗩
1:40:27Make ExecuteBrainHero() position the glove with the hero
1:40:27Make ExecuteBrainHero() position the glove with the hero
1:40:27Make ExecuteBrainHero() position the glove with the hero
1:42:49Find that the glove stays with the hero
🏃
1:42:49Find that the glove stays with the hero
🏃
1:42:49Find that the glove stays with the hero
🏃
1:44:25culdevu Q: I'm still not sure I understand the reason why you don't store the "actual" position and smoothly scrolling between tiles, and the "animation" position doing the bouncing? The bouncing should only have to be dealt with during render and can be derived from the "actual" position, and so you don't have to store it anywhere. Am I wrong about that?
🗪
1:44:25culdevu Q: I'm still not sure I understand the reason why you don't store the "actual" position and smoothly scrolling between tiles, and the "animation" position doing the bouncing? The bouncing should only have to be dealt with during render and can be derived from the "actual" position, and so you don't have to store it anywhere. Am I wrong about that?
🗪
1:44:25culdevu Q: I'm still not sure I understand the reason why you don't store the "actual" position and smoothly scrolling between tiles, and the "animation" position doing the bouncing? The bouncing should only have to be dealt with during render and can be derived from the "actual" position, and so you don't have to store it anywhere. Am I wrong about that?
🗪
1:46:57davechat Q: What was the plan for lighting on the sprites?
🗪
1:46:57davechat Q: What was the plan for lighting on the sprites?
🗪
1:46:57davechat Q: What was the plan for lighting on the sprites?
🗪
1:47:53saidwho12 Q: Is the variance in lighting just a side effect of the random sample?
🗪
1:47:53saidwho12 Q: Is the variance in lighting just a side effect of the random sample?
🗪
1:47:53saidwho12 Q: Is the variance in lighting just a side effect of the random sample?
🗪
1:48:17robotchocolatedino Q: Off-topic but how do you stay motivated on long projects like this? I usually would lose interest much earlier, and am wondering if there are techniques to want to keep working for on the same game for many years1
🗪
1:48:17robotchocolatedino Q: Off-topic but how do you stay motivated on long projects like this? I usually would lose interest much earlier, and am wondering if there are techniques to want to keep working for on the same game for many years1
🗪
1:48:17robotchocolatedino Q: Off-topic but how do you stay motivated on long projects like this? I usually would lose interest much earlier, and am wondering if there are techniques to want to keep working for on the same game for many years1
🗪
1:52:00saidwho12 Q: How big is Handmade Hero?
🗪
1:52:00saidwho12 Q: How big is Handmade Hero?
🗪
1:52:00saidwho12 Q: How big is Handmade Hero?
🗪
1:53:36very_mediocre Q: Do you ever get burnt out? What does it take for that? Have you noticed a change in your mental stamina as you've gotten older?
🗪
1:53:36very_mediocre Q: Do you ever get burnt out? What does it take for that? Have you noticed a change in your mental stamina as you've gotten older?
🗪
1:53:36very_mediocre Q: Do you ever get burnt out? What does it take for that? Have you noticed a change in your mental stamina as you've gotten older?
🗪
1:55:54fishrock123 Q: How long does a full rebuild take?
🗪
1:55:54fishrock123 Q: How long does a full rebuild take?
🗪
1:55:54fishrock123 Q: How long does a full rebuild take?
🗪
1:56:50pythno Q: Motivation: I can recommend your chat about the imposter syndrome.2It helped me a lot. I used to have way too high expectations of what I can do in a day. I reduced that expectation and set myself smaller goals for each day. Way easier to even start then and I was surprised how quickly I got way more done than I initially wanted to do
🗪
1:56:50pythno Q: Motivation: I can recommend your chat about the imposter syndrome.2It helped me a lot. I used to have way too high expectations of what I can do in a day. I reduced that expectation and set myself smaller goals for each day. Way easier to even start then and I was surprised how quickly I got way more done than I initially wanted to do
🗪
1:56:50pythno Q: Motivation: I can recommend your chat about the imposter syndrome.2It helped me a lot. I used to have way too high expectations of what I can do in a day. I reduced that expectation and set myself smaller goals for each day. Way easier to even start then and I was surprised how quickly I got way more done than I initially wanted to do
🗪
2:00:17xxthebigfoxx Q: Do you ever experience having no idea on how to approach a specific problem and have that negatively impact how productive you are? Any tip on how to deal with it?
🗪
2:00:17xxthebigfoxx Q: Do you ever experience having no idea on how to approach a specific problem and have that negatively impact how productive you are? Any tip on how to deal with it?
🗪
2:00:17xxthebigfoxx Q: Do you ever experience having no idea on how to approach a specific problem and have that negatively impact how productive you are? Any tip on how to deal with it?
🗪
2:03:56Roll it up for 2018
🗩
2:03:56Roll it up for 2018
🗩
2:03:56Roll it up for 2018
🗩