--- name: cinematic-laparoscope-camera description: Cinematic camera work for the laparoscope (and any companion view) in the LaparoscopicSurgeryEmulation scene. Use when adjusting FOV, clipping planes, depth of field, exposure, framing, or adding a secondary view for the cavity. Never moves the preserved stereo rig. --- # Cinematic Laparoscope Camera (project-scoped) This skill constrains camera work to the laparoscope viewpoint the scene is built around. The project's existing stereo rig (preserved from `MainScene`) is **not** edited by this skill — the rig is the interop surface, and the new cavity work happens in front of the camera, not by moving the camera. ## When to load Load when the agent is about to: - Adjust FOV, near/far clip, depth-of-field, exposure, or post-processing on any camera in the active scene. - Add a secondary "overview" or "wide" camera for setup / framing / screenshots. - Diagnose "scene looks too far", "scene looks too bright", "scene has black frame", or "vignette is too strong" reports. - Plan a screenshot composition for verification. ## Camera inventory (do not rename) - The stereo rig from `MainScene` is preserved at its current path. Do not rename, do not move, do not retarget. It is the interop surface for WebRTC and any external automation. - A laparoscope-style camera (or cameras) under `SurgeryBenchmark/Shared` is the **art-directed** camera the cinematic work targets. If one is not present, the Scene Director agent can add one as a bounded change; if the stereo rig is the only camera, this skill applies its framing notes to the rig's left/right eye and notes the constraint in the handoff. ## Laparoscope framing notes A real rigid laparoscope has: - A narrow FOV: typically 30°–70° diagonal. URP Camera `fieldOfView` 35–55 is a good starting range for "looks like a scope"; 60–75 is "looks like a wide scope"; > 80 starts to look like a generic game camera. - A very close near clip: 0.01–0.05 m. Far clip can be short too — 5–20 m is enough for a cavity scene. - A barrel of wet optics: mild `LensDistortion` (intensity 0.05–0.15) and a tight `Vignette` (intensity 0.25–0.4, smoothness 0.3–0.5). - Optical highlights: a narrow `Bloom` with low `intensity` (0.1–0.3) and a `threshold` above 1.0 so it only catches the brightest specular hits. - Color grading: `ColorAdjustments.contrast` slightly positive (0.05–0.15), `ColorAdjustments.postExposure` near 0, `Tonemapping` = Neutral or ACES. Avoid the heavy filmic look (too cinematic, looks like a game). ## Depth of field The laparoscope's "focus" is what the user expects to be sharp. For the cavity: - Set `DepthOfField.mode = Gaussian` (URP's Bokeh is heavier and slower). - `DepthOfField.gaussianStart` near the closest tissue you want sharp; `DepthOfField.gaussianEnd` just past the farthest tissue you want sharp. - `DepthOfField.gaussianMaxRadius` 1.0–2.5 px for a subtle blur; > 4 starts to look like a portrait lens. A common pitfall: setting the focus so close that the camera's own near plane is also inside the focus, producing a confusing "all-blur" frame. Verify with a screenshot. ## Exposure and HDR - `Camera.allowHDR` should be `true` for the laparoscope camera. The URP render pipeline asset must have HDR enabled (it does by default in URP 14). - Use `ColorAdjustments.postExposure` in stops for any ± adjustment. Range ± 1.0 is plenty; outside that range, fix the lighting instead. - A "too dark" laparoscope usually means: Volume profile is missing `ColorAdjustments`, or the post-processing chain is being skipped because the URP asset has it disabled. Verify by reading the active Volume profile (`manage_graphics(action="volume_get_info")`) before touching the camera. ## Adding a secondary / overview camera (bounded change) When a Scene Director or QA agent needs a setup view that is **not** the preserved stereo rig: 1. Create the camera as a child of `SurgeryBenchmark/Shared/_Cameras` (use the underscore convention so it is obviously editor scaffolding). 2. Name it `OverviewCamera_` (e.g., `OverviewCamera_Cavity`). 3. Set `clearFlags = Solid Color` with a neutral mid-grey, or `Skybox` if the cavity is enclosed. 4. Do **not** disable the stereo rig or any preserved camera. 5. Tag the GameObject for easy removal later (`_Editor` convention is enough; a tag is optional). ## Composition rules (avoid overfitting to one angle) - The cavity should be readable from at least three viewpoints: looking down the scope (default), looking from the side (setup), and looking from a 30–45° angle (verification). If only the scope view is composed, the moment the camera moves, the scene falls apart. - For any verification screenshot, take **two**: one from the scope, one from a 30–45° offset. The second one catches stretching, lighting falloff, and proportion problems the first one hides. - Avoid dead-on symmetry. A scope is not a portrait lens; if a composition is too symmetric, the cavity looks like a diorama. ## Common operations and the right MCP call | Intent | MCP call | Notes | |---|---|---| | Read camera state | `manage_components(action="get" via the components resource)` — `mcpforunity://scene/gameobject/{id}/component/Camera` | Always re-read first | | Set FOV | `manage_components(action="set_property", target="...", component_type="Camera", property="fieldOfView", value=45)` | Or `manage_camera(action="set_lens", target="...", properties={"fieldOfView":45, "nearClipPlane":0.03, "farClipPlane":15})` | | Add DoF | `manage_graphics(action="volume_add_effect", profile_path="...", effect="DepthOfField")` then `volume_set_effect` | DoF in URP 14 lives on the Volume, not the camera | | Take a verification screenshot | `manage_camera(action="screenshot", include_image=true, max_resolution=800, output_folder="Assets/Screenshots/LaparoscopicBenchmark")` | Two angles; the second is from a 30–45° offset | | Frame the scene view on a target | `manage_scene(action="scene_view_frame", scene_view_target="CavitySlot")` | Editor-side framing only | | Take a multiview contact sheet | `manage_camera(action="screenshot_multiview", include_image=true, view_target="CavitySlot")` | Six-angle surround; useful for spot-checking the whole cavity | ## Reversibility checklist 1. Did the change touch the preserved stereo rig? If yes, **revert** and call it out in the handoff. 2. Is the FOV inside 30–80? Outside this range it no longer reads as a scope. 3. Are the clip planes set so that the entire visible cavity is inside the depth range, with a small margin? Outside the depth range, geometry pops. 4. Did you take at least two verification screenshots (scope + offset)? If only one, the result is not verified. 5. Is the `Vignette.intensity` and `LensDistortion.intensity` modest? Over-cooked optical effects are a tell that an agent is compensating for missing realism elsewhere. ## Anti-patterns to refuse - Moving, renaming, or retargeting the preserved stereo rig or any `MainScene` camera. - Setting FOV > 80 or < 25 (no longer reads as a scope). - Disabling post-processing globally to "fix" a too-dark frame. - Adding a `CinemachineCamera` if Cinemachine is not in `Packages/manifest.json` (it is not in this project). Use plain `Camera` components. - Setting `clearFlags = Don't Care` or leaving the camera with the default skybox visible inside the cavity — this is the most common "looks like an editor" failure. - Overcooking `Bloom` or `LensDistortion` to compensate for a flat cavity.