Preparation
You could optionally create and use something like an octree or a BVH to store references to object(s) within your game that you would like to be captured - this would allow you to limit your world queries to a subset of the map which will reduce computation time.
This doesn’t solve having to iterate through dynamic objects, e.g. players, unless you update their reference at runtime; but it’s almost guaranteed you have significantly fewer dynamic objects than static ones.
When capturing
-
Create or update a viewing frustum from the Camera object that the player is holding, learn more about that here
-
Query the world using the method described in #Preparation, or alternatively, use Roblox’s spatial query API (learn more here) to find relevant game instances
-
Using the Camera frustum, you can cull the objects from step (2) by using Frustum tests, e.g. Frustum-OBB intersection via SAT tests (see resource here)
-
Instantiate a viewport frame such that:
- The Viewport’s
CurrentCamera
instances reflects the Camera object’s transform - The Viewport contains the cloned game instance(s) found in step (3) - since we’re cloning and we’ve already updated the
CurrentCamera
coordinates, each of the instance’s coordinates should remain the same - This isn’t shown in the video you linked, but you can achieve a skybox-like effect in ViewportFrames if you also wanted to capture the sky in the background, e.g. example model here
- The Viewport’s