Improved Sphere Distributions

?

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

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

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)

a

w

s

s

d

h
j
k
l

←

↑

↓

↓

→

X, ShiftSpace Toggle category and focus previous

v Invert topics / media as per focus

⏫

Previous: 'Generating Sampling Spheres into an INL'

⏫

0:01Recap and set the stage for the day

🗩

0:01Recap and set the stage for the day

🗩

0:01Recap and set the stage for the day

🗩

3:02Show off our white noise sampling sphere

🏃

3:02Show off our white noise sampling sphere

🏃

3:02Show off our white noise sampling sphere

🏃

5:54Blue Noise Slices

🖌

5:54Blue Noise Slices

🖌

5:54Blue Noise Slices

🖌

6:55White noise

🖌

6:55White noise

🖌

6:55White noise

🖌

8:47Blue noise, or Poisson distribution

🖌

8:47Blue noise, or Poisson distribution

🖌

8:47Blue noise, or Poisson distribution

🖌

10:48Blue noise as an approximation of real-world tree distributions

🖌

10:48Blue noise as an approximation of real-world tree distributions

🖌

10:48Blue noise as an approximation of real-world tree distributions

🖌

15:19Blue noise as a limiter (or sampler) of workload, computing the average colour of an intractably huge image

🖌

15:19Blue noise as a limiter (or sampler) of workload, computing the average colour of an intractably huge image

🖌

🖌

19:41Structured–Unknown But Evenly-distributed sampling continuum

🖌

19:41Structured–Unknown But Evenly-distributed sampling continuum

🖌

19:41Structured–Unknown But Evenly-distributed sampling continuum

🖌

24:59Sphere Sampling

🖌

24:59Sphere Sampling

🖌

24:59Sphere Sampling

🖌

31:54Sphere Sampling Tuning vs Repulsion

🖌

31:54Sphere Sampling Tuning vs Repulsion

🖌

31:54Sphere Sampling Tuning vs Repulsion

🖌

35:33Sphere Sampling Slicing

🖌

35:33Sphere Sampling Slicing

🖌

35:33Sphere Sampling Slicing

🖌

37:27Make GenerateLightingPattern() apply repulsion to the white noise samples

37:27Make GenerateLightingPattern() apply repulsion to the white noise samples

37:27Make GenerateLightingPattern() apply repulsion to the white noise samples

49:14Distance-based repulsion around a sphere

🖌

49:14Distance-based repulsion around a sphere

🖌

49:14Distance-based repulsion around a sphere

🖌

50:40Continue to make GenerateLightingPattern() apply distance-based repulsion to the white noise samples

50:40Continue to make GenerateLightingPattern() apply distance-based repulsion to the white noise samples

51:20Hard clipping in purely distance-based repulsion

🖌

51:20Hard clipping in purely distance-based repulsion

🖌

51:20Hard clipping in purely distance-based repulsion

🖌

52:38Continue to make GenerateLightingPattern() apply a smooth falloff to the repulsion

52:38Continue to make GenerateLightingPattern() apply a smooth falloff to the repulsion

52:38Continue to make GenerateLightingPattern() apply a smooth falloff to the repulsion

58:49Enable GenerateLightingPattern() to track the minimum and maximum distances between samples, to provide an exit condition

58:49Enable GenerateLightingPattern() to track the minimum and maximum distances between samples, to provide an exit condition

1:06:23Step through hhsphere

🏃

1:06:23Step through hhsphere

🏃

1:06:23Step through hhsphere

🏃

1:08:16Praise RemedyBG: The FLT_MAX display

🗹

1:08:16Praise RemedyBG: The FLT_MAX display

🗹

1:08:16Praise RemedyBG: The FLT_MAX display

🗹

1:08:57Continue to step through hhsphere

🏃

1:08:57Continue to step through hhsphere

🏃

1:08:57Continue to step through hhsphere

🏃

1:10:11Fix GenerateLightingPattern() to initialise LastMinClosestPointDistance as 0.0f

1:10:11Fix GenerateLightingPattern() to initialise LastMinClosestPointDistance as 0.0f

1:10:11Fix GenerateLightingPattern() to initialise LastMinClosestPointDistance as 0.0f

1:10:45Step through hhsphere and watch the closest point distances slowly converge

🏃

1:10:45Step through hhsphere and watch the closest point distances slowly converge

🏃

1:10:45Step through hhsphere and watch the closest point distances slowly converge

🏃

1:11:28Increase the MaxDispPerStep in GenerateLightingPattern() to speed up the convergence

1:11:28Increase the MaxDispPerStep in GenerateLightingPattern() to speed up the convergence

1:11:28Increase the MaxDispPerStep in GenerateLightingPattern() to speed up the convergence

1:12:02Step through hhsphere and see the closest point distances converge quickly

🏃

1:12:02Step through hhsphere and see the closest point distances converge quickly

🏃

1:12:02Step through hhsphere and see the closest point distances converge quickly

🏃

1:12:09Make GenerateLightingPattern() set the MaxDispPerStep based on MaxClosestPointDistance

1:12:09Make GenerateLightingPattern() set the MaxDispPerStep based on MaxClosestPointDistance

1:12:09Make GenerateLightingPattern() set the MaxDispPerStep based on MaxClosestPointDistance

1:14:29Step through hhsphere and watch the closest point distances converge

🏃

1:14:29Step through hhsphere and watch the closest point distances converge

🏃

1:14:29Step through hhsphere and watch the closest point distances converge

🏃

1:14:50Decrease the computed MaxDispPerStep in GenerateLightingPattern()

1:14:50Decrease the computed MaxDispPerStep in GenerateLightingPattern()

1:14:50Decrease the computed MaxDispPerStep in GenerateLightingPattern()

1:15:04Step through hhsphere and watch the closest point distances converge

🏃

1:15:04Step through hhsphere and watch the closest point distances converge

🏃

1:15:04Step through hhsphere and watch the closest point distances converge

🏃

1:16:32Copy handmade_sampling_spheres.inl in to place

🗹

1:16:32Copy handmade_sampling_spheres.inl in to place

🗹

1:16:32Copy handmade_sampling_spheres.inl in to place

🗹

1:18:01Check out our (identical) sampling sphere

🏃

1:18:01Check out our (identical) sampling sphere

🏃

1:18:01Check out our (identical) sampling sphere

🏃

1:20:00Again copy handmade_sampling_spheres.inl in to place

🗹

1:20:00Again copy handmade_sampling_spheres.inl in to place

🗹

1:20:00Again copy handmade_sampling_spheres.inl in to place

🗹

1:20:20Check out our wrong-looking sampling sphere

🏃

1:20:20Check out our wrong-looking sampling sphere

🏃

1:20:20Check out our wrong-looking sampling sphere

🏃

1:21:22Scrutinise our repulsion routine in GenerateLightingPattern()

📖

1:21:22Scrutinise our repulsion routine in GenerateLightingPattern()

📖

1:21:22Scrutinise our repulsion routine in GenerateLightingPattern()

📖

1:22:30Prevent GenerateLightingPattern() from zeroing out the Displacement

1:22:30Prevent GenerateLightingPattern() from zeroing out the Displacement

1:22:30Prevent GenerateLightingPattern() from zeroing out the Displacement

1:23:11Continue to scrutinise our repulsion routine in GenerateLightingPattern()

📖

1:23:11Continue to scrutinise our repulsion routine in GenerateLightingPattern()

📖

1:23:11Continue to scrutinise our repulsion routine in GenerateLightingPattern()

📖

1:23:56Repulsion around the great arc

🖌

1:23:56Repulsion around the great arc

🖌

1:23:56Repulsion around the great arc

🖌

1:25:28Continue to scrutinise and clean-up our repulsion routine in GenerateLightingPattern()

🖮

📖

1:25:28Continue to scrutinise and clean-up our repulsion routine in GenerateLightingPattern()

🖮

📖

1:25:28Continue to scrutinise and clean-up our repulsion routine in GenerateLightingPattern()

🖮

📖

1:27:48Invoke hhsphere overwriting the real handmade_sampling_spheres.inl

🗹

1:27:48Invoke hhsphere overwriting the real handmade_sampling_spheres.inl

🗹

1:27:48Invoke hhsphere overwriting the real handmade_sampling_spheres.inl

🗹

1:29:14Make GenerateLightingPattern() print out the sampling directions

1:29:14Make GenerateLightingPattern() print out the sampling directions

1:29:14Make GenerateLightingPattern() print out the sampling directions

1:30:52Invoke hhsphere again and watch the distances converge

🗹

1:30:52Invoke hhsphere again and watch the distances converge

🗹

1:30:52Invoke hhsphere again and watch the distances converge

🗹

1:31:45Make GenerateLightingPattern() track the MinMaxSeparation and bail if it ever increases

1:31:45Make GenerateLightingPattern() track the MinMaxSeparation and bail if it ever increases

1:31:45Make GenerateLightingPattern() track the MinMaxSeparation and bail if it ever increases

1:33:34Step through GenerateLightingPattern() until the MinMaxSeparation increases

🏃

1:33:34Step through GenerateLightingPattern() until the MinMaxSeparation increases

🏃

1:33:34Step through GenerateLightingPattern() until the MinMaxSeparation increases

🏃

1:34:47Give GenerateLightingPattern() a more distant exit condition

1:34:47Give GenerateLightingPattern() a more distant exit condition

1:34:47Give GenerateLightingPattern() a more distant exit condition

1:35:04Invoke hhsphere and watch the distances converge

🗹

1:35:04Invoke hhsphere and watch the distances converge

🗹

1:35:04Invoke hhsphere and watch the distances converge

🗹

1:35:29Fix GenerateLightingPattern() to set the LastMinMaxSeparation in the correct place

1:35:29Fix GenerateLightingPattern() to set the LastMinMaxSeparation in the correct place

1:35:29Fix GenerateLightingPattern() to set the LastMinMaxSeparation in the correct place

1:35:38Invoke hhsphere and watch the distances supposedly converging

🗹

1:35:38Invoke hhsphere and watch the distances supposedly converging

🗹

1:35:38Invoke hhsphere and watch the distances supposedly converging

🗹

1:36:59Consider how to improve our sample repulsion

📖

1:36:59Consider how to improve our sample repulsion

📖

1:36:59Consider how to improve our sample repulsion

📖

1:38:23Tangential repulsion

🖌

1:38:23Tangential repulsion

🖌

1:38:23Tangential repulsion

🖌

1:39:35Make GenerateLightingPattern() tangentially repulse the samples

1:39:35Make GenerateLightingPattern() tangentially repulse the samples

1:39:35Make GenerateLightingPattern() tangentially repulse the samples

1:40:17Invoke hhsphere and watch the distances converge

🗹

1:40:17Invoke hhsphere and watch the distances converge

🗹

1:40:17Invoke hhsphere and watch the distances converge

🗹

1:41:00Check out our (identical) sampling sphere

🏃

1:41:00Check out our (identical) sampling sphere

🏃

1:41:00Check out our (identical) sampling sphere

🏃

1:42:21Give GenerateLightingPattern() a yet further distant exit condition

1:42:21Give GenerateLightingPattern() a yet further distant exit condition

1:42:21Give GenerateLightingPattern() a yet further distant exit condition

1:42:40Invoke hhsphere and watch the distances converge

🗹

1:42:40Invoke hhsphere and watch the distances converge

🗹

1:42:40Invoke hhsphere and watch the distances converge

🗹

1:42:56Give GenerateLightingPattern() a yet further distant exit condition

1:42:56Give GenerateLightingPattern() a yet further distant exit condition

1:42:56Give GenerateLightingPattern() a yet further distant exit condition

1:43:03Invoke hhsphere and watch the distances converge

🗹

1:43:03Invoke hhsphere and watch the distances converge

🗹

1:43:03Invoke hhsphere and watch the distances converge

🗹

1:44:12Check out our sampling sphere to see that samples are clearly not equidistant

🏃

1:44:12Check out our sampling sphere to see that samples are clearly not equidistant

🏃

1:44:12Check out our sampling sphere to see that samples are clearly not equidistant

🏃

1:45:23Fix GenerateLightingPattern() to compute the ForceLineLength before the tangent

1:45:23Fix GenerateLightingPattern() to compute the ForceLineLength before the tangent

1:45:23Fix GenerateLightingPattern() to compute the ForceLineLength before the tangent

1:47:13Invoke hhsphere to see that it struggles to converge

🗹

1:47:13Invoke hhsphere to see that it struggles to converge

🗹

1:47:13Invoke hhsphere to see that it struggles to converge

🗹

1:48:22Decrease the MaxDispPerStep multiplier to 0.01f in GenerateLightingPattern()

1:48:22Decrease the MaxDispPerStep multiplier to 0.01f in GenerateLightingPattern()

1:48:22Decrease the MaxDispPerStep multiplier to 0.01f in GenerateLightingPattern()

1:48:32Invoke hhsphere to see that it seems to be converging more cleanly

🗹

1:48:32Invoke hhsphere to see that it seems to be converging more cleanly

🗹

1:48:32Invoke hhsphere to see that it seems to be converging more cleanly

🗹

1:50:24Increase the MaxDispPerStep multiplier to 0.025f in GenerateLightingPattern()

1:50:24Increase the MaxDispPerStep multiplier to 0.025f in GenerateLightingPattern()

1:50:24Increase the MaxDispPerStep multiplier to 0.025f in GenerateLightingPattern()

1:50:36Invoke hhsphere and watch the distances converge

🗹

1:50:36Invoke hhsphere and watch the distances converge

🗹

1:50:36Invoke hhsphere and watch the distances converge

🗹

1:51:59Increase the MaxDispPerStep multiplier to 0.05f in GenerateLightingPattern()

1:51:59Increase the MaxDispPerStep multiplier to 0.05f in GenerateLightingPattern()

1:51:59Increase the MaxDispPerStep multiplier to 0.05f in GenerateLightingPattern()

1:52:09Invoke hhsphere to see the distances start to oscillate

🗹

1:52:09Invoke hhsphere to see the distances start to oscillate

🗹

1:52:09Invoke hhsphere to see the distances start to oscillate

🗹

1:54:06Make GenerateLightingPattern() exit once the MinMaxSeparation is 0.02f

1:54:06Make GenerateLightingPattern() exit once the MinMaxSeparation is 0.02f

1:54:06Make GenerateLightingPattern() exit once the MinMaxSeparation is 0.02f

1:54:25Invoke hhsphere until the distances converge

🗹

1:54:25Invoke hhsphere until the distances converge

🗹

1:54:25Invoke hhsphere until the distances converge

🗹

1:54:58Check out our (still identical) sampling sphere, to determine that we are possibly measuring or writing out something incorrectly

🏃

1:54:58Check out our (still identical) sampling sphere, to determine that we are possibly measuring or writing out something incorrectly

🏃

🏃

1:58:30Q&A

🗩

1:58:30Q&A

🗩

1:58:30Q&A

🗩

1:59:01Fix typo in the MaxClosestPointDistance computation in GenerateLightingPattern()

1:59:01Fix typo in the MaxClosestPointDistance computation in GenerateLightingPattern()

1:59:01Fix typo in the MaxClosestPointDistance computation in GenerateLightingPattern()

1:59:14Invoke hhsphere to see the distances oscillate more wildly

🗹

1:59:14Invoke hhsphere to see the distances oscillate more wildly

🗹

1:59:14Invoke hhsphere to see the distances oscillate more wildly

🗹

1:59:54Decrease the MaxDispPerStep multiplier to 0.01f in GenerateLightingPattern()

1:59:54Decrease the MaxDispPerStep multiplier to 0.01f in GenerateLightingPattern()

1:59:54Decrease the MaxDispPerStep multiplier to 0.01f in GenerateLightingPattern()

2:00:11Invoke hhsphere and leave it hopefully converging

🗹

2:00:11Invoke hhsphere and leave it hopefully converging

🗹

2:00:11Invoke hhsphere and leave it hopefully converging

🗹

2:02:15Gauge the convergence of our distances

🗹

2:02:15Gauge the convergence of our distances

🗹

2:02:15Gauge the convergence of our distances

🗹

2:15:02Make GenerateLightingPattern() exit once the MinMaxSeparation is 0.03f

2:15:02Make GenerateLightingPattern() exit once the MinMaxSeparation is 0.03f

2:15:02Make GenerateLightingPattern() exit once the MinMaxSeparation is 0.03f

2:15:16Invoke hhsphere and leave it converging

🗹

2:15:16Invoke hhsphere and leave it converging

🗹

2:15:16Invoke hhsphere and leave it converging

🗹

2:18:35Check out our (identical) sampling sphere

🏃

2:18:35Check out our (identical) sampling sphere

🏃

2:18:35Check out our (identical) sampling sphere

🏃

2:19:43Read through our sampling sphere drawing code

📖

2:19:43Read through our sampling sphere drawing code

📖

2:19:43Read through our sampling sphere drawing code

📖

2:21:14Consider whether we are seeing 1,000 points

🏃

2:21:14Consider whether we are seeing 1,000 points

🏃

2:21:14Consider whether we are seeing 1,000 points

🏃

2:21:48Invoke hhsphere to generate 1 batch of samples

🗹

2:21:48Invoke hhsphere to generate 1 batch of samples

🗹

2:21:48Invoke hhsphere to generate 1 batch of samples

🗹

2:23:12Make GenerateLightingPattern() exit once the MinMaxSeparation is 0.08f

2:23:12Make GenerateLightingPattern() exit once the MinMaxSeparation is 0.08f

2:23:12Make GenerateLightingPattern() exit once the MinMaxSeparation is 0.08f

2:23:43Check out our sparse samplingd sphere, to see 18 points (not the desired 4 × 18)

🏃

2:23:43Check out our sparse samplingd sphere, to see 18 points (not the desired 4 × 18)

🏃

2:23:43Check out our sparse samplingd sphere, to see 18 points (not the desired 4 × 18)

🏃

2:26:14Step in to LightingTest() to see that we have duplicated sampling points

🏃

2:26:14Step in to LightingTest() to see that we have duplicated sampling points

🏃

2:26:14Step in to LightingTest() to see that we have duplicated sampling points

🏃

2:27:36Force GenerateLightingPattern() to bundle up four consecutive sampling directions before incrementing past them

2:27:36Force GenerateLightingPattern() to bundle up four consecutive sampling directions before incrementing past them

2:29:38Step in to LightingTest() to see that we now have non-duplicate sampling points

🏃

2:29:38Step in to LightingTest() to see that we now have non-duplicate sampling points

🏃

2:29:38Step in to LightingTest() to see that we now have non-duplicate sampling points

🏃

2:30:27Check out our more regular sampling sphere

🏃

2:30:27Check out our more regular sampling sphere

🏃

2:30:27Check out our more regular sampling sphere

🏃

2:30:43Add a TODO to determine what the real convergence criteria is

2:30:43Add a TODO to determine what the real convergence criteria is

2:30:43Add a TODO to determine what the real convergence criteria is

2:31:17Invoke hhsphere to generate our full 16 batches of samples

🗹

2:31:17Invoke hhsphere to generate our full 16 batches of samples

🗹

2:31:17Invoke hhsphere to generate our full 16 batches of samples

🗹

2:35:31Check out our beautiful new sampling sphere

🏃

2:35:31Check out our beautiful new sampling sphere

🏃

2:35:31Check out our beautiful new sampling sphere

🏃

2:38:37Wrap it up

🗩

2:38:37Wrap it up

🗩

2:38:37Wrap it up

🗩

•

You have arrived at the (current) end of Handmade Hero

•