{"id":36636,"date":"2026-06-01T21:16:05","date_gmt":"2026-06-01T18:16:05","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/"},"modified":"2026-06-01T21:16:05","modified_gmt":"2026-06-01T18:16:05","slug":"camera-obscura","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/","title":{"rendered":"Camera Obscura"},"content":{"rendered":"<p># Camera Obscura<\/p>\n<p>![Animated Render](https:\/\/cdn.modrinth.com\/data\/RlBTYKIp\/images\/ed28af0b8dda6610ff393d76efb3a0fea2733253.png)<\/p>\n<p>Camera Obscura is a **server\u2011side software rasterizer** that renders the world as seen by any entity (player, mob, etc.) directly on the server, producing Photos or Videos as Minecraft **maps**.<br \/>\nIt has deep integrations for custom items (Nexo, ItemsAdder) and a custom preset system.<\/p>\n<p>&#8212;<\/p>\n<p>## Features<\/p>\n<p>&#8211; **Take photos**: Generate a map item showing what the target entity sees.<br \/>\n&#8211; **Record videos**: Capture your world on video and play it back on item frames.<br \/>\n&#8211; **Fully configurable**: Resolution, color mode, dithering, render distance, and more.<br \/>\n&#8211; **Custom item support**: Create cameras\/camcorders with any appearance via **Nexo** or **ItemsAdder**.<br \/>\n&#8211; **Asynchronous rendering**: Never blocks the main server thread.<br \/>\n&#8211; **No client mods required**: Everything is server\u2011side; maps\/recordings work on vanilla clients.  <\/p>\n<p>![PNG Render](https:\/\/cdn.modrinth.com\/data\/RlBTYKIp\/images\/1868b6d784639eade78155529eb8385efb6ea441.png)<\/p>\n<p>&#8212;<\/p>\n<p>## Installation<\/p>\n<p>### Fabric Server<br \/>\n1. Install Fabric API and Polymer (for virtual items).<br \/>\n2. Place `camera-obscura-fabric.jar` into your `mods\/` folder.<br \/>\n3. The configuration file will be created on start.<\/p>\n<p>&#8212;<\/p>\n<p>## Configuration<\/p>\n<p>The configuration file is `config\/cameraobscura\/config.json`.<\/p>\n<p>&#8220;`json<br \/>\n{<br \/>\n  &#8220;renderDistance&#8221;: 32,<br \/>\n  &#8220;showSystemMessages&#8221;: false,<br \/>\n  &#8220;renderEntities&#8221;: true,<br \/>\n  &#8220;fullbright&#8221;: false,<br \/>\n  &#8220;fov&#8221;: 70,<br \/>\n  &#8220;biomeBlend&#8221;: 1,<br \/>\n  &#8220;ssaa&#8221;: 2,<br \/>\n  &#8220;maxChunkRebuildsPerTick&#8221;: 5,<br \/>\n  &#8220;debug&#8221;: false,<br \/>\n  &#8220;cameraConsumesItem&#8221;: true,<br \/>\n  &#8220;cameraConsumeItem&#8221;: &#8220;map&#8221;,<br \/>\n  &#8220;commandPermissionLevel&#8221;: 2<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>| Option                    | Description                                                                              |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|<br \/>\n| `renderDistance`          | View distance in blocks (higher = longer render time).                                   |<br \/>\n| `showSystemMessages`      | Show \u201cTaking photo\u2026\u201d \/ \u201cDone!\u201d messages in chat.                                         |<br \/>\n| `renderEntities`          | Whether to render entities (players, mobs, item frames) in the picture.                  |<br \/>\n| `fullbright`              | Ignore lighting (everything appears at full brightness).                                 |<br \/>\n| `fov`                     | Field of view in degrees (default is 70).                                                |<br \/>\n| `biomeBlend`              | Radius for blending block colors (biome tint). `0` = no blending.                        |<br \/>\n| `ssaa`                    | Supersampling anti\u2011aliasing factor (1 = off, 2 = 2x supersampling, 3 = 3x).              |<br \/>\n| `maxChunkRebuildsPerTick` | Maximum chunks rebuilt per frame per video recording and live-map (to limit CPU spikes). |<br \/>\n| `debug`                   | Print frame timings and show FPS overlay on the output image.                            |<br \/>\n| `cameraConsumesItem`      | Whether taking a photo consumes an item (e.g. a map).                                    |<br \/>\n| `cameraConsumeItem`       | Required item material (e.g. `map`, `paper`).                                            |<br \/>\n| `commandPermissionLevel`  | Base permission level for commands.                                                      |<\/p>\n<p>&#8212;<\/p>\n<p>## Commands &#038; Permissions<\/p>\n<p>**Base permission** `cameraobscura.command`.<\/p>\n<p>All commands use the root `\/camera-obscura`<\/p>\n<p>### 1. Take a map from your perspective<br \/>\n&#8220;`<br \/>\n\/camera-obscura [scale]<br \/>\n&#8220;`<br \/>\n&#8211; `scale`: multiply the map resolution (1 = 128\u00d7128, 2 = 256\u00d7256, up to 3).<br \/>\n&#8211; Gives you a **filled map** showing what *you* see.<\/p>\n<p>### 2. Take a map of another entities perspective<br \/>\n&#8220;`<br \/>\n\/camera-obscura <entity> <player> [scale]<br \/>\n&#8220;`<br \/>\n&#8211; `<entity>`: any living entity (player, mob, etc.)<br \/>\n&#8211; `<player>`: who receives the map item.  <\/p>\n<p>### 3. Save as PNG image<br \/>\n&#8220;`<br \/>\n\/camera-obscura save [entity] [scale]<br \/>\n&#8220;`<br \/>\n&#8211; Saves the rendered image as a `.png` in `config\/cameraobscura\/renders\/`.<\/p>\n<p>### 4. Reload configuration<br \/>\n&#8220;`<br \/>\n\/camera-obscura reload<br \/>\n&#8220;`<br \/>\nReloads the config file.<\/p>\n<p>### 5. Clear resource\/model cache<br \/>\n&#8220;`<br \/>\n\/camera-obscura clear-cache<br \/>\n&#8220;`<\/p>\n<p>### 6. Give a camera item<br \/>\n&#8220;`<br \/>\n\/camera-obscura give <preset> [player]<br \/>\n&#8220;`<br \/>\n&#8211; `<preset>`: The name of a preset defined in `presets.json` (e.g. `camera`, `camcorder`, `instant`, `polaroid`, `pro_camera`, `handycam`, `cctv`).<br \/>\n&#8211; `[player]`: Optional player name; if omitted, gives the item to the command sender.<\/p>\n<p>**Examples:**<br \/>\n&#8211; `\/camera-obscura give camera` -> gives yourself the default camera.<br \/>\n&#8211; `\/camera-obscura give camcorder Pinnit` -> gives the player `Pinnit` a camcorder.<br \/>\n&#8211; `\/camera-obscura give my-preset` -> gives yourself an item from a preset.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcf7 Using the Camera Item<\/p>\n<p>**Basic Camera**<br \/>\n&#8211; Hold the camera in your **main hand**.<br \/>\n&#8211; Right\u2011click -> after a countdown, the photo map item appears in your inventory (or drops on the ground if full).<br \/>\n&#8211; The map shows the world from *your* viewpoint at that moment.  <\/p>\n<p>**Camcorder**<br \/>\n&#8211; Same controls, but starts **recording** instead of taking a single photo.<br \/>\n&#8211; The action-bar text indicates recording.<br \/>\n&#8211; Release to stop recording, the video will be saved as a map item that can be played back on item-frames.<br \/>\n&#8211; While recording, particles appear around the camera (frame effect).<br \/>\n&#8211; Videos are stored as APNG in `config\/cameraobscura\/camera_videos\/<id>.apng`<\/p>\n<p>&#8212;<\/p>\n<p># Components<\/p>\n<p>The mod uses **data components** to store camera settings on the item stack. <\/p>\n<p>This allows you to create cameras with different resolutions, color modes, and video parameters using standard commands, recipes, or loot tables.<\/p>\n<p>### Available Components<\/p>\n<p>| Component ID                   | Type                                                   | Description                                                              |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|<br \/>\n| `camera-obscura:color`         | `string` (ColorMode)                                   | `&#8221;COLOR&#8221;`, `&#8221;MONOCHROME&#8221;`, `&#8221;GRAYSCALE&#8221;`, `&#8221;SEPIA&#8221;`                      |<br \/>\n| `camera-obscura:resolution`    | `{width:int, height:int}`                              | Resolution in pixels (e.g. `{width:256, height:256}`)                    |<br \/>\n| `camera-obscura:dither`        | `string` (DitherMode)                                  | `&#8221;NONE&#8221;`, `&#8221;BAYER_2X2&#8243;`, `&#8221;FLOYD_STEINBERG&#8221;`, etc. (see full list below) |<br \/>\n| `camera-obscura:video`         | `{frame_rate:int, max_frames:int, loop_playback:bool}` | Video recording parameters                                               |<br \/>\n| `camera-obscura:map`           | `unit`                                                 | Marks the item as a **live map** (internal)                              |<br \/>\n| `camera-obscura:camera_entity` | `entity_reference`                                     | Stores the entity that took the photo (internal)                         |<br \/>\n| `camera-obscura:data`          | `{id:uuid, video_params:&#8230;}`                          | Internal video data                                                      |<\/p>\n<p>**DitherMode values**:<br \/>\n`NONE`, `BAYER_2X2`, `BAYER_4X4`, `BAYER_8X8`, `FLOYD_STEINBERG`, `ATKINSON`, `JARVIS_JUDICE_NINKE`, `STUCKI`, `SIERRA`, `BURKES`<\/p>\n<p>&#8212;<\/p>\n<p>### Using Components in Commands<\/p>\n<p>#### \/give<br \/>\n&#8220;`mcfunction<br \/>\n\/give @p camera-obscura:camera[camera-obscura:color=&#8221;SEPIA&#8221;,camera-obscura:resolution={width:512,height:512},camera-obscura:dither=&#8221;FLOYD_STEINBERG&#8221;]<br \/>\n&#8220;`<\/p>\n<p>#### \/item modify<br \/>\nCreate a data pack with an item modifier:<br \/>\n&#8220;`json<br \/>\n{<br \/>\n  &#8220;function&#8221;: &#8220;set_components&#8221;,<br \/>\n  &#8220;components&#8221;: {<br \/>\n    &#8220;camera-obscura:color&#8221;: &#8220;GRAYSCALE&#8221;,<br \/>\n    &#8220;camera-obscura:resolution&#8221;: { &#8220;width&#8221;: 192, &#8220;height&#8221;: 192 },<br \/>\n    &#8220;camera-obscura:dither&#8221;: &#8220;BAYER_8X8&#8221;<br \/>\n  }<br \/>\n}<br \/>\n&#8220;`<br \/>\nThen run: `\/item modify entity @s weapon.mainhand my_pack:camera_settings`<\/p>\n<p>&#8212;<\/p>\n<p>### Using Components in Recipes<\/p>\n<p>In a crafting recipes:<br \/>\n&#8220;`json<br \/>\n{<br \/>\n  &#8220;type&#8221;: &#8220;minecraft:crafting_shaped&#8221;,<br \/>\n  &#8220;pattern&#8221;: [&#8220;###&#8221;, &#8220;#P#&#8221;, &#8220;###&#8221;],<br \/>\n  &#8220;key&#8221;: {<br \/>\n    &#8220;#&#8221;: &#8220;minecraft:iron_ingot&#8221;,<br \/>\n    &#8220;P&#8221;: &#8220;minecraft:ender_pearl&#8221;<br \/>\n  },<br \/>\n  &#8220;result&#8221;: {<br \/>\n    &#8220;id&#8221;: &#8220;camera-obscura:camera&#8221;,<br \/>\n    &#8220;components&#8221;: {<br \/>\n      &#8220;camera-obscura:color&#8221;: &#8220;SEPIA&#8221;,<br \/>\n      &#8220;camera-obscura:resolution&#8221;: { &#8220;width&#8221;: 128, &#8220;height&#8221;: 128 },<br \/>\n      &#8220;camera-obscura:dither&#8221;: &#8220;NONE&#8221;<br \/>\n    }<br \/>\n  }<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>For a camcorder (video mode), include `video`:<br \/>\n&#8220;`json<br \/>\n&#8220;components&#8221;: {<br \/>\n  &#8220;camera-obscura:color&#8221;: &#8220;COLOR&#8221;,<br \/>\n  &#8220;camera-obscura:resolution&#8221;: { &#8220;width&#8221;: 256, &#8220;height&#8221;: 256 },<br \/>\n  &#8220;camera-obscura:video&#8221;: { &#8220;frame_rate&#8221;: 15, &#8220;max_frames&#8221;: 300 }<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>### Giving a Camcorder with Default Video Settings<\/p>\n<p>The basic camcorder item (without components) uses global config defaults. To explicitly set video parameters:<br \/>\n&#8220;`mcfunction<br \/>\n\/give @s camera-obscura:camcorder[camera-obscura:video={frame_rate:10,max_frames:200,loop_playback:true}]<br \/>\n&#8220;`<\/p>\n<p>## Built-in Items<\/p>\n<p>On Fabric, Camera Obscura adds a few **built\u2011in camera and camcorder items** with pre\u2011configured settings (color mode, resolution, video parameters). <\/p>\n<p>### Camera Items (Photo Mode)<\/p>\n<p>| Item ID                           | color Mode   | Resolution | Dithering |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8211;|<br \/>\n| `camera-obscura:camera`           | `COLOR`      | 128\u00d7128    | `NONE`    |<br \/>\n| `camera-obscura:grayscale_camera` | `GRAYSCALE`  | 128\u00d7128    | `NONE`    |<br \/>\n| `camera-obscura:primitive_camera` | `MONOCHROME` | 128\u00d7128    | `NONE`    |<br \/>\n| `camera-obscura:retro_camera`     | `SEPIA`      | 128\u00d7128    | `NONE`    |<\/p>\n<p>### Camcorder Items (Video Mode)<\/p>\n<p>Record videos with pre\u2011set framerate and max frame count.<\/p>\n<p>| Item ID                              | color Mode   | Resolution | Dithering | Video (FPS \/ Max Frames) |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|<br \/>\n| `camera-obscura:camcorder`           | `COLOR`      | 128\u00d7128    | `NONE`    | 10 FPS \/ 400 frames      |<br \/>\n| `camera-obscura:grayscale_camcorder` | `GRAYSCALE`  | 128\u00d7128    | `NONE`    | 20 FPS \/ 400 frames      |<br \/>\n| `camera-obscura:primitive_camcorder` | `MONOCHROME` | 128\u00d7128    | `NONE`    | 20 FPS \/ 400 frames      |<br \/>\n| `camera-obscura:retro_camcorder`     | `SEPIA`      | 128\u00d7128    | `NONE`    | 20 FPS \/ 400 frames      |<\/p>\n<p>**Usage example:**<br \/>\n&#8220;`mcfunction<br \/>\n\/give @s camera-obscura:grayscale_camera<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## Video Playback<\/p>\n<p>To play back a video maps:<\/p>\n<p>&#8211; Place the map in an **item frame**.<br \/>\n&#8211; Right\u2011click the item frame and the video will start playing on the map.<br \/>\n&#8211; Right\u2011click again to stop playback.<\/p>\n<p>## Presets<\/p>\n<p>You can add your own presets, pre\u2011configured camera items with custom materials, display names, and camera settings (resolution, color mode, dither mode, video parameters). <\/p>\n<p>Presets are stored in `presets.json` and can be given to players using the `\/camera-obscura give <preset> <player>` command.<\/p>\n<p>&#8212;<\/p>\n<p>### Preset Configuration Format<\/p>\n<p>The `presets.json` file contains a JSON object where each key is a preset name and the value is an object with the following fields:<\/p>\n<p>| Field        | Description                                                           |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|<br \/>\n| `material`   | Item ID (e.g. `&#8221;paper&#8221;`, `&#8221;clock&#8221;`)                                   |<br \/>\n| `camera`     | Camera\u2011specific options (see below)                                   |<br \/>\n| `components` | Optional vanilla data components to apply to the item stack (1.20.5+) |<\/p>\n<p>#### Camera Options<\/p>\n<p>All fields are optional<\/p>\n<p>| Field          | Type                         | Description                                                          |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8212;-|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| `resolution`   | `{ width, height }`          | Output resolution in pixels (e.g. `{ &#8220;width&#8221;: 256, &#8220;height&#8221;: 256 }`) |<br \/>\n| `color_mode`   | string                       | `&#8221;COLOR&#8221;`, `&#8221;MONOCHROME&#8221;`, `&#8221;GRAYSCALE&#8221;`, `&#8221;SEPIA&#8221;`                  |<br \/>\n| `dither_mode`  | string                       | `&#8221;NONE&#8221;`, `&#8221;BAYER_2X2&#8243;`, `&#8221;FLOYD_STEINBERG&#8221;`, etc.                   |<br \/>\n| `video_params` | `{ frame_rate, max_frames }` | Video recording parameters                                           |<\/p>\n<p>&#8212;<\/p>\n<p>### Default Presets<\/p>\n<p>The mod ships with several ready\u2011to\u2011use presets. You can modify or delete them as you like.<\/p>\n<p>&#8220;`json<br \/>\n{<br \/>\n  &#8220;camera&#8221;: {<br \/>\n    &#8220;material&#8221;: &#8220;paper&#8221;,<br \/>\n    &#8220;camera&#8221;: {<br \/>\n      &#8220;resolution&#8221;: { &#8220;width&#8221;: 128, &#8220;height&#8221;: 128 },<br \/>\n      &#8220;color_mode&#8221;: &#8220;COLOR&#8221;,<br \/>\n      &#8220;dither_mode&#8221;: &#8220;NONE&#8221;,<br \/>\n      &#8220;video&#8221;: { &#8220;frame_rate&#8221;: 0, &#8220;max_frames&#8221;: 1 }<br \/>\n    },<br \/>\n    &#8220;components&#8221;: {<br \/>\n      &#8220;minecraft:item_name&#8221;: { &#8220;text&#8221;: &#8220;Camera&#8221;, &#8220;color&#8221;: &#8220;gold&#8221; },<br \/>\n      &#8220;minecraft:max_stack_size&#8221;: 1<br \/>\n    }<br \/>\n  },<br \/>\n  &#8220;camcorder&#8221;: {<br \/>\n    &#8220;material&#8221;: &#8220;paper&#8221;,<br \/>\n    &#8220;camera&#8221;: {<br \/>\n      &#8220;resolution&#8221;: { &#8220;width&#8221;: 128, &#8220;height&#8221;: 128 },<br \/>\n      &#8220;color_mode&#8221;: &#8220;COLOR&#8221;,<br \/>\n      &#8220;dither_mode&#8221;: &#8220;NONE&#8221;,<br \/>\n      &#8220;video&#8221;: { &#8220;frame_rate&#8221;: 20, &#8220;max_frames&#8221;: 200 }<br \/>\n    }<br \/>\n  },<br \/>\n  &#8220;instant&#8221;: {<br \/>\n    &#8220;material&#8221;: &#8220;paper&#8221;,<br \/>\n    &#8220;camera&#8221;: {<br \/>\n      &#8220;resolution&#8221;: { &#8220;width&#8221;: 256, &#8220;height&#8221;: 256 },<br \/>\n      &#8220;color_mode&#8221;: &#8220;SEPIA&#8221;,<br \/>\n      &#8220;dither_mode&#8221;: &#8220;BAYER_4X4&#8221;<br \/>\n    },<br \/>\n    &#8220;components&#8221;: {<br \/>\n      &#8220;minecraft:item_name&#8221;: { &#8220;text&#8221;: &#8220;Instant Camera&#8221;, &#8220;italic&#8221;: false }<br \/>\n    }<br \/>\n  },<br \/>\n  &#8220;polaroid&#8221;: {<br \/>\n    &#8220;material&#8221;: &#8220;paper&#8221;,<br \/>\n    &#8220;camera&#8221;: {<br \/>\n      &#8220;resolution&#8221;: { &#8220;width&#8221;: 512, &#8220;height&#8221;: 512 },<br \/>\n      &#8220;color_mode&#8221;: &#8220;GRAYSCALE&#8221;,<br \/>\n      &#8220;dither_mode&#8221;: &#8220;FLOYD_STEINBERG&#8221;<br \/>\n    },<br \/>\n    &#8220;components&#8221;: {<br \/>\n      &#8220;minecraft:item_name&#8221;: { &#8220;text&#8221;: &#8220;Polaroid&#8221;, &#8220;color&#8221;: &#8220;white&#8221; },<br \/>\n      &#8220;minecraft:custom_model_data&#8221;: 1<br \/>\n    }<br \/>\n  },<br \/>\n  &#8220;pro_camera&#8221;: {<br \/>\n    &#8220;material&#8221;: &#8220;ender_eye&#8221;,<br \/>\n    &#8220;camera&#8221;: {<br \/>\n      &#8220;resolution&#8221;: { &#8220;width&#8221;: 128, &#8220;height&#8221;: 128 },<br \/>\n      &#8220;color_mode&#8221;: &#8220;COLOR&#8221;,<br \/>\n      &#8220;dither_mode&#8221;: &#8220;NONE&#8221;,<br \/>\n      &#8220;video&#8221;: { &#8220;frame_rate&#8221;: 30, &#8220;max_frames&#8221;: 600 }<br \/>\n    },<br \/>\n    &#8220;components&#8221;: {<br \/>\n      &#8220;minecraft:item_name&#8221;: { &#8220;text&#8221;: &#8220;Pro Camera&#8221;, &#8220;color&#8221;: &#8220;light_purple&#8221;, &#8220;bold&#8221;: true },<br \/>\n      &#8220;minecraft:max_stack_size&#8221;: 1,<br \/>\n      &#8220;minecraft:custom_model_data&#8221;: 2<br \/>\n    }<br \/>\n  },<br \/>\n  &#8220;handycam&#8221;: {<br \/>\n    &#8220;material&#8221;: &#8220;clock&#8221;,<br \/>\n    &#8220;camera&#8221;: {<br \/>\n      &#8220;resolution&#8221;: { &#8220;width&#8221;: 256, &#8220;height&#8221;: 256 },<br \/>\n      &#8220;color_mode&#8221;: &#8220;COLOR&#8221;,<br \/>\n      &#8220;dither_mode&#8221;: &#8220;BAYER_2X2&#8221;,<br \/>\n      &#8220;video&#8221;: { &#8220;frame_rate&#8221;: 15, &#8220;max_frames&#8221;: 450 }<br \/>\n    },<br \/>\n    &#8220;components&#8221;: {<br \/>\n      &#8220;minecraft:item_name&#8221;: { &#8220;text&#8221;: &#8220;Handycam&#8221;, &#8220;color&#8221;: &#8220;aqua&#8221; },<br \/>\n      &#8220;minecraft:max_stack_size&#8221;: 1<br \/>\n    }<br \/>\n  },<br \/>\n  &#8220;cctv&#8221;: {<br \/>\n    &#8220;material&#8221;: &#8220;observer&#8221;,<br \/>\n    &#8220;camera&#8221;: {<br \/>\n      &#8220;resolution&#8221;: { &#8220;width&#8221;: 192, &#8220;height&#8221;: 192 },<br \/>\n      &#8220;color_mode&#8221;: &#8220;MONOCHROME&#8221;,<br \/>\n      &#8220;dither_mode&#8221;: &#8220;SIERRA&#8221;,<br \/>\n      &#8220;video&#8221;: { &#8220;frame_rate&#8221;: 5, &#8220;max_frames&#8221;: 30000 }<br \/>\n    },<br \/>\n    &#8220;components&#8221;: {<br \/>\n      &#8220;minecraft:item_name&#8221;: { &#8220;text&#8221;: &#8220;CCTV Camera&#8221;, &#8220;color&#8221;: &#8220;dark_gray&#8221; },<br \/>\n      &#8220;minecraft:max_stack_size&#8221;: 1<br \/>\n    }<br \/>\n  }<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>### Using Presets in Commands<\/p>\n<p>&#8220;`mcfunction<br \/>\n\/camera-obscura give camera<br \/>\n\/camera-obscura give camcorder<br \/>\n\/camera-obscura give instant<br \/>\n\/camera-obscura give handycam Notch<br \/>\n&#8220;`<\/p>\n<p>Tab completion suggests available preset names.<\/p>\n<p>### Reloading Presets<\/p>\n<p>After editing `presets.json` while the server is running, run:<\/p>\n<p>&#8220;`mcfunction<br \/>\n\/camera-obscura reload<br \/>\n&#8220;`<\/p>\n<p>This reloads both the main configuration and all presets without restarting the server.<\/p>\n<p>&#8212;<\/p>\n<p>## How It Works (Technical Overview)<\/p>\n<p>Camera Obscura runs **completely on the server** and uses a **software rasterizer** to draw the scene pixel by pixel.<\/p>\n<p>&#8211; The renderer requests chunks and entities around the target.<br \/>\n&#8211; Block models are converted into triangles and stored in a cache (per chunk).<br \/>\n&#8211; Lighting, ambient occlusion, and fog are computed from the actual world state.<br \/>\n&#8211; Rendering happens asynchronously on a separate thread pool, no lag for the main game.<br \/>\n&#8211; After rendering, the image is converted to (a) Minecraft map(s) (or saved as PNG).<br \/>\n&#8211; **Video recording** captures frames at the configured framerate.<\/p>\n<p>### Performance considerations<br \/>\n&#8211; Higher resolution &#038; SSAA increase CPU usage drastically.<br \/>\n&#8211; Render distances above 128 may cause issues if chunks are not loaded.<br \/>\n&#8211; Video recording is CPU\u2011intensive. For high\u2011quality recordings, consider lowering the framerate!<\/p>\n<p>&#8212;<\/p>\n<p>## Troubleshooting<\/p>\n<p>| Problem                              | Check                                                                                           |<br \/>\n|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|<br \/>\n| Photo doesn&#8217;t appear in inventory    | Check that `cameraConsumesItem` is `false` or you have the required item (e.g. a map).          |<br \/>\n| \u201cMissing required item\u201d message      | You need the configured `cameraConsumeItem` material in your inventory.                         |<br \/>\n| Very long render times (> 5 seconds) | Reduce `renderDistance`, `ssaa`, or `resolution`. Enable `debug` to see per\u2011frame timings.      |<br \/>\n| Server crashes with OOM error        | Increase server memory (`-Xmx2G` or more). Lower `renderDistance` and `ssaa`.                   |<br \/>\n| Custom Nexo\/ItemsAdder item ignored  | Ensure the `camera` section is correctly indented and the mechanic is spelled exactly `camera`. |<\/p>\n<p>&#8212;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Take Photos of your world or server as Map Item, no client-side mods required!<\/p>\n","protected":false},"featured_media":36637,"template":"","meta":{"_minecraft_slug":"camera-obscura","_minecraft_project_id":"RlBTYKIp","_minecraft_author":"tomalbrc","_minecraft_license":"LGPL-3.0-only","_minecraft_downloads":12053,"_minecraft_follows":92,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"camera-obscura.zip","_minecraft_size_bytes":20943140,"_minecraft_version_count":26,"_minecraft_updated_at":"2026-05-16T02:35:00.683965Z","_minecraft_date_created":"2024-05-21T23:17:57.584703Z","_minecraft_date_modified":"2026-05-14T18:03:12.949391Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/camera-obscura","_minecraft_icon_attachment_id":36637,"_minecraft_imported_at":"2026-06-01T18:16:06+00:00","_minecraft_import_hash":"c44fe7f2137ae976934b3496504b3696","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[87,156,97,89,873,126,867,123],"mod_loader":[99],"minecraft_version":[36,94,102,62,37,40,41,73,749,750,74,38,78,79,80,81,82,800,83,167,163],"class_list":["post-36636","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-adventure","mod_category-decoration","mod_category-fabric","mod_category-game-mechanics","mod_category-library","mod_category-management","mod_category-social","mod_category-technology","mod_loader-fabric","minecraft_version-1-20-1","minecraft_version-1-20-4","minecraft_version-1-20-6","minecraft_version-1-21","minecraft_version-1-21-1","minecraft_version-1-21-10","minecraft_version-1-21-11","minecraft_version-1-21-2","minecraft_version-1-21-2-rc1","minecraft_version-1-21-2-rc2","minecraft_version-1-21-3","minecraft_version-1-21-4","minecraft_version-1-21-5","minecraft_version-1-21-6","minecraft_version-1-21-7","minecraft_version-1-21-8","minecraft_version-1-21-9","minecraft_version-1-21-9-rc1","minecraft_version-26-1","minecraft_version-26-1-1","minecraft_version-26-1-2"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Camera Obscura - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Camera Obscura - Minecraft\" \/>\n<meta property=\"og:description\" content=\"Take Photos of your world or server as Map Item, no client-side mods required!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/camera-obscura\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/camera-obscura\\\/\",\"name\":\"Camera Obscura - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/camera-obscura\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/camera-obscura\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/camera-obscura-icon-a90bc5e128a7ea4156051c63ffd2289690169eed.png\",\"datePublished\":\"2026-06-01T18:16:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/camera-obscura\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/camera-obscura\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/camera-obscura\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/camera-obscura-icon-a90bc5e128a7ea4156051c63ffd2289690169eed.png\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/camera-obscura-icon-a90bc5e128a7ea4156051c63ffd2289690169eed.png\",\"width\":128,\"height\":128},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/camera-obscura\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Camera Obscura\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Camera Obscura - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/","og_locale":"en_US","og_type":"article","og_title":"Camera Obscura - Minecraft","og_description":"Take Photos of your world or server as Map Item, no client-side mods required!","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/","name":"Camera Obscura - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/camera-obscura-icon-a90bc5e128a7ea4156051c63ffd2289690169eed.png","datePublished":"2026-06-01T18:16:05+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/camera-obscura-icon-a90bc5e128a7ea4156051c63ffd2289690169eed.png","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/camera-obscura-icon-a90bc5e128a7ea4156051c63ffd2289690169eed.png","width":128,"height":128},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/camera-obscura\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"Camera Obscura"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/36636","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/36637"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=36636"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=36636"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=36636"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=36636"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}