Handmade Hero»Episode Guide
Exploring Camera Interpolation Alternatives
?
?

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:00Recap and set the stage for the day
🗩
0:00Recap and set the stage for the day
🗩
0:00Recap and set the stage for the day
🗩
0:48Show our camera transitions, noting our desire to follow a moving target
🏃
0:48Show our camera transitions, noting our desire to follow a moving target
🏃
0:48Show our camera transitions, noting our desire to follow a moving target
🏃
3:04Moving Camera Target
🖌
3:04Moving Camera Target
🖌
3:04Moving Camera Target
🖌
6:46Interpolating camera between unknown start and end locations
🖌
6:46Interpolating camera between unknown start and end locations
🖌
6:46Interpolating camera between unknown start and end locations
🖌
14:32Respecifying camera room transitions as taking a constant time
📖
14:32Respecifying camera room transitions as taking a constant time
📖
14:32Respecifying camera room transitions as taking a constant time
📖
16:22Change UpdateCameraForEntityMovement() to follow the player, but interpolate the camera on room changes
16:22Change UpdateCameraForEntityMovement() to follow the player, but interpolate the camera on room changes
16:22Change UpdateCameraForEntityMovement() to follow the player, but interpolate the camera on room changes
16:50Show the player-locked camera behaviour
🏃
16:50Show the player-locked camera behaviour
🏃
16:50Show the player-locked camera behaviour
🏃
18:13Change UpdateCameraForEntityMovement() to interpolate the camera between "large" distances, removing InRoom from game_camera
18:13Change UpdateCameraForEntityMovement() to interpolate the camera between "large" distances, removing InRoom from game_camera
18:13Change UpdateCameraForEntityMovement() to interpolate the camera between "large" distances, removing InRoom from game_camera
21:48Try out our new distance-based (as opposed to room-based) camera, finding weird behaviour on the stairs
🏃
21:48Try out our new distance-based (as opposed to room-based) camera, finding weird behaviour on the stairs
🏃
21:48Try out our new distance-based (as opposed to room-based) camera, finding weird behaviour on the stairs
🏃
22:22Investigate that weird camera behaviour on the stairs
📖
22:22Investigate that weird camera behaviour on the stairs
📖
22:22Investigate that weird camera behaviour on the stairs
📖
24:22Make UpdateCameraForEntityMovement() interpolate all camera movements
24:22Make UpdateCameraForEntityMovement() interpolate all camera movements
24:22Make UpdateCameraForEntityMovement() interpolate all camera movements
25:38Try out our interpolated camera to again see the positional hiccough on the stairs
🏃
25:38Try out our interpolated camera to again see the positional hiccough on the stairs
🏃
25:38Try out our interpolated camera to again see the positional hiccough on the stairs
🏃
26:18Investigate our camera's positional hiccough
📖
26:18Investigate our camera's positional hiccough
📖
26:18Investigate our camera's positional hiccough
📖
28:30Enable UpdateCameraForEntityMovement() to restart camera interpolation when the target changes
28:30Enable UpdateCameraForEntityMovement() to restart camera interpolation when the target changes
28:30Enable UpdateCameraForEntityMovement() to restart camera interpolation when the target changes
32:32Try out our newly restarting camera interpolation, to still see a positional hiccough
🏃
32:32Try out our newly restarting camera interpolation, to still see a positional hiccough
🏃
32:32Try out our newly restarting camera interpolation, to still see a positional hiccough
🏃
33:39Reduce the MaxDistancePerFrame() in UpdateCameraForEntityMovement(), and initialise the hero at the forest stairs
33:39Reduce the MaxDistancePerFrame() in UpdateCameraForEntityMovement(), and initialise the hero at the forest stairs
33:39Reduce the MaxDistancePerFrame() in UpdateCameraForEntityMovement(), and initialise the hero at the forest stairs
34:13Take a closer look at our camera's positional hiccough on the stairs
🏃
34:13Take a closer look at our camera's positional hiccough on the stairs
🏃
34:13Take a closer look at our camera's positional hiccough on the stairs
🏃
34:34Continue to investigate our camera's positional hiccough
📖
34:34Continue to investigate our camera's positional hiccough
📖
34:34Continue to investigate our camera's positional hiccough
📖
36:00Fix UpdateCameraForEntityMovement() to restart camera interpolation if either the starting or ending positions move
36:00Fix UpdateCameraForEntityMovement() to restart camera interpolation if either the starting or ending positions move
36:00Fix UpdateCameraForEntityMovement() to restart camera interpolation if either the starting or ending positions move
36:22See a camera glitch on chunk boundaries
🏃
36:22See a camera glitch on chunk boundaries
🏃
36:22See a camera glitch on chunk boundaries
🏃
36:45Continue to investigate our camera's positional hiccough
📖
36:45Continue to investigate our camera's positional hiccough
📖
36:45Continue to investigate our camera's positional hiccough
📖
37:47Assert in UpdateCameraForEntityMovement() if we are not in a room
37:47Assert in UpdateCameraForEntityMovement() if we are not in a room
37:47Assert in UpdateCameraForEntityMovement() if we are not in a room
38:06Happily fail to hit that assertion
🏃
38:06Happily fail to hit that assertion
🏃
38:06Happily fail to hit that assertion
🏃
38:16Continue to investigate our camera's positional hiccough
📖
38:16Continue to investigate our camera's positional hiccough
📖
38:16Continue to investigate our camera's positional hiccough
📖
39:17Make UpdateCameraForEntityMovement() restart camera interpolation more smoothly
39:17Make UpdateCameraForEntityMovement() restart camera interpolation more smoothly
39:17Make UpdateCameraForEntityMovement() restart camera interpolation more smoothly
44:12Find that we've fixed the camera's positional hiccough
🏃
44:12Find that we've fixed the camera's positional hiccough
🏃
44:12Find that we've fixed the camera's positional hiccough
🏃
44:45Camera phases: Acceleration, Max Speed and Deceleration
🖌
44:45Camera phases: Acceleration, Max Speed and Deceleration
🖌
44:45Camera phases: Acceleration, Max Speed and Deceleration
🖌
46:59Figuring out our options for getting the target velocity
📖
46:59Figuring out our options for getting the target velocity
📖
46:59Figuring out our options for getting the target velocity
📖
49:00Initialise the hero in her bedroom
49:00Initialise the hero in her bedroom
49:00Initialise the hero in her bedroom
49:35Show our current camera easing
🏃
49:35Show our current camera easing
🏃
49:35Show our current camera easing
🏃
49:43Change UpdateCameraForEntityMovement() to base camera interpolation on accelerations, rather than start and end positions
49:43Change UpdateCameraForEntityMovement() to base camera interpolation on accelerations, rather than start and end positions
49:43Change UpdateCameraForEntityMovement() to base camera interpolation on accelerations, rather than start and end positions
1:00:21Differentiating between the acceleration and deceleration regions
🖌
1:00:21Differentiating between the acceleration and deceleration regions
🖌
1:00:21Differentiating between the acceleration and deceleration regions
🖌
1:01:54Make UpdateCameraForEntityMovement() compute the velocity in addition to the acceleration
1:01:54Make UpdateCameraForEntityMovement() compute the velocity in addition to the acceleration
1:01:54Make UpdateCameraForEntityMovement() compute the velocity in addition to the acceleration
1:06:02Solving for our position along a three-phased camera interpolation curve
🖌
1:06:02Solving for our position along a three-phased camera interpolation curve
🖌
1:06:02Solving for our position along a three-phased camera interpolation curve
🖌
1:09:50Solving for our position along a parabolic curve1
🖌
1:09:50Solving for our position along a parabolic curve1
🖌
1:09:50Solving for our position along a parabolic curve1
🖌
1:16:38Parameterising our camera interpolation on the "total curve length" and our "t along the curve"
🖌
1:16:38Parameterising our camera interpolation on the "total curve length" and our "t along the curve"
🖌
1:16:38Parameterising our camera interpolation on the "total curve length" and our "t along the curve"
🖌
1:33:42Change game_camera to contain our position, velocity and acceleration along the interpolation curve
1:33:42Change game_camera to contain our position, velocity and acceleration along the interpolation curve
1:33:42Change game_camera to contain our position, velocity and acceleration along the interpolation curve
1:36:12Solving for our velocity and acceleration along an interpolation curve, knowing our position
🖌
1:36:12Solving for our velocity and acceleration along an interpolation curve, knowing our position
🖌
1:36:12Solving for our velocity and acceleration along an interpolation curve, knowing our position
🖌
1:39:57Plug our equations into WolframAlpha2
📖
1:39:57Plug our equations into WolframAlpha2
📖
1:39:57Plug our equations into WolframAlpha2
📖
1:44:21Solving for our acceleration along a uniform curve based on our current velocity
🖌
1:44:21Solving for our acceleration along a uniform curve based on our current velocity
🖌
1:44:21Solving for our acceleration along a uniform curve based on our current velocity
🖌
1:47:13Remove dt and ddt from game_camera
1:47:13Remove dt and ddt from game_camera
1:47:13Remove dt and ddt from game_camera
1:50:34Storing and heuristically adjusting our length and t value from last frame
🗩
1:50:34Storing and heuristically adjusting our length and t value from last frame
🗩
1:50:34Storing and heuristically adjusting our length and t value from last frame
🗩
1:51:57Begin to make UpdateCameraForEntityMovement() step along our camera interpolation curve using the t and DeltaP from the last frame
1:51:57Begin to make UpdateCameraForEntityMovement() step along our camera interpolation curve using the t and DeltaP from the last frame
1:51:57Begin to make UpdateCameraForEntityMovement() step along our camera interpolation curve using the t and DeltaP from the last frame
2:00:00Consider other options for camera interpolation
🗩
2:00:00Consider other options for camera interpolation
🗩
2:00:00Consider other options for camera interpolation
🗩
2:02:06Make UpdateCameraForEntityMovement() update our velocity based on a curve rule
2:02:06Make UpdateCameraForEntityMovement() update our velocity based on a curve rule
2:02:06Make UpdateCameraForEntityMovement() update our velocity based on a curve rule
2:08:18Check out our camera interpolation
🏃
2:08:18Check out our camera interpolation
🏃
2:08:18Check out our camera interpolation
🏃
2:08:49Make UpdateCameraForEntityMovement() compute our camera's velocity by mapping onto specified acceleration / deceleration curves
2:08:49Make UpdateCameraForEntityMovement() compute our camera's velocity by mapping onto specified acceleration / deceleration curves
2:08:49Make UpdateCameraForEntityMovement() compute our camera's velocity by mapping onto specified acceleration / deceleration curves
2:22:30Find that our camera interpolation sort of works
🏃
2:22:30Find that our camera interpolation sort of works
🏃
2:22:30Find that our camera interpolation sort of works
🏃
2:22:59Change game_camera to store the ddP, and UpdateCameraForEntityMovement() to compute this as well as the dP
2:22:59Change game_camera to store the ddP, and UpdateCameraForEntityMovement() to compute this as well as the dP
2:22:59Change game_camera to store the ddP, and UpdateCameraForEntityMovement() to compute this as well as the dP
2:25:59See a hitch in our camera
🏃
2:25:59See a hitch in our camera
🏃
2:25:59See a hitch in our camera
🏃
2:27:03Fix UpdateCameraForEntityMovement() to use the AccelRange to compute the ddP along the acceleration curve, and to lerp along the deceleration curve
2:27:03Fix UpdateCameraForEntityMovement() to use the AccelRange to compute the ddP along the acceleration curve, and to lerp along the deceleration curve
2:27:03Fix UpdateCameraForEntityMovement() to use the AccelRange to compute the ddP along the acceleration curve, and to lerp along the deceleration curve
2:32:57Try out our camera
🏃
2:32:57Try out our camera
🏃
2:32:57Try out our camera
🏃
2:33:18Increase our acceleration and deceleration curve ranges in UpdateCameraForEntityMovement()
2:33:18Increase our acceleration and deceleration curve ranges in UpdateCameraForEntityMovement()
2:33:18Increase our acceleration and deceleration curve ranges in UpdateCameraForEntityMovement()
2:34:28Try out our camera
🏃
2:34:28Try out our camera
🏃
2:34:28Try out our camera
🏃
2:34:43Make UpdateCameraForEntityMovement() update the camera's P in the deceleration curve case
2:34:43Make UpdateCameraForEntityMovement() update the camera's P in the deceleration curve case
2:34:43Make UpdateCameraForEntityMovement() update the camera's P in the deceleration curve case
2:41:31Consider solving for the deceleration curve from our current velocity to 0
🗩
2:41:31Consider solving for the deceleration curve from our current velocity to 0
🗩
2:41:31Consider solving for the deceleration curve from our current velocity to 0
🗩
2:44:27Temporarily make UpdateCameraForEntityMovement() interpolate the camera using a proportional derivative controller
2:44:27Temporarily make UpdateCameraForEntityMovement() interpolate the camera using a proportional derivative controller
2:44:27Temporarily make UpdateCameraForEntityMovement() interpolate the camera using a proportional derivative controller
2:55:11Try out our proportional derivative controlled camera
🏃
2:55:11Try out our proportional derivative controlled camera
🏃
2:55:11Try out our proportional derivative controlled camera
🏃
2:57:34Blending the camera focus range, for alpha clip and fogging purposes
🗩
2:57:34Blending the camera focus range, for alpha clip and fogging purposes
🗩
2:57:34Blending the camera focus range, for alpha clip and fogging purposes
🗩
3:02:34Synchronising that camera focus
🏃
3:02:34Synchronising that camera focus
🏃
3:02:34Synchronising that camera focus
🏃
3:03:27Make UpdateCameraForEntityMovement() include the camera focus range in our proportional derivative controller
3:03:27Make UpdateCameraForEntityMovement() include the camera focus range in our proportional derivative controller
3:03:27Make UpdateCameraForEntityMovement() include the camera focus range in our proportional derivative controller
3:08:37Try out our fully proportional derivative controlled camera
🏃
3:08:37Try out our fully proportional derivative controlled camera
🏃
3:08:37Try out our fully proportional derivative controlled camera
🏃
3:11:21Q&A
🗩
3:11:21Q&A
🗩
3:11:21Q&A
🗩
3:11:52paulmmh Q: In episode 392 you thought about moving Molly Rocket to Linux. Are you still thinking about that? What about the lack of proper debuggers?
🗪
3:11:52paulmmh Q: In episode 392 you thought about moving Molly Rocket to Linux. Are you still thinking about that? What about the lack of proper debuggers?
🗪
3:11:52paulmmh Q: In episode 392 you thought about moving Molly Rocket to Linux. Are you still thinking about that? What about the lack of proper debuggers?
🗪
3:14:34sahfortv Q: Is the plan to change the character facing direction when they move in a direction, or will that be mapped to a different key?
🗪
3:14:34sahfortv Q: Is the plan to change the character facing direction when they move in a direction, or will that be mapped to a different key?
🗪
3:14:34sahfortv Q: Is the plan to change the character facing direction when they move in a direction, or will that be mapped to a different key?
🗪
3:16:02reductum Q: If there were a truly good (better than VS's) debugger for Linux, would that make Linux viable for gamedev?
🗪
3:16:02reductum Q: If there were a truly good (better than VS's) debugger for Linux, would that make Linux viable for gamedev?
🗪
3:16:02reductum Q: If there were a truly good (better than VS's) debugger for Linux, would that make Linux viable for gamedev?
🗪
3:16:33mint_spider Q: It looks like the "average" sized room is currently too big to be seen without scrolling. Is that what we want in the end, or is it just that average room size is still undecided?
🗪
3:16:33mint_spider Q: It looks like the "average" sized room is currently too big to be seen without scrolling. Is that what we want in the end, or is it just that average room size is still undecided?
🗪
3:16:33mint_spider Q: It looks like the "average" sized room is currently too big to be seen without scrolling. Is that what we want in the end, or is it just that average room size is still undecided?
🗪
3:16:59rebelavalon Q: I started watching at the beginning, and I'm up to episode 024. Did any code get released? Is any code public domain?
🗪
3:16:59rebelavalon Q: I started watching at the beginning, and I'm up to episode 024. Did any code get released? Is any code public domain?
🗪
3:16:59rebelavalon Q: I started watching at the beginning, and I'm up to episode 024. Did any code get released? Is any code public domain?
🗪
3:17:09fierydrake Q: Did the updated speed get applied into the camera for the fog / alpha interpolation?
🗪
3:17:09fierydrake Q: Did the updated speed get applied into the camera for the fog / alpha interpolation?
🗪
3:17:09fierydrake Q: Did the updated speed get applied into the camera for the fog / alpha interpolation?
🗪
3:17:14Wrap it up
🗩
3:17:14Wrap it up
🗩
3:17:14Wrap it up
🗩