# Perspective Desk > The lens does not change perspective; the camera position does. Two objects appear in > the ratio (near height / far height) x (far distance / near distance) — an expression > with no focal length in it — so two frames from one spot are the same picture at two > magnifications and the longer one is a literal crop of the wider. What makes an 85 mm > portrait look unlike a 24 mm one is that holding a head at 60% of frame height puts the 24 at > 40 cm and the 85 at 1.42 m — 3.54× apart, which is exactly 85/24. ## The one thing to know **THE LENS DOES NOT CHANGE PERSPECTIVE. THE CAMERA POSITION DOES.** ```text angle of view 2 * atan(sensor / (2 * focal)) framing subject * focal / (distance * sensor) the distance subject * focal / (framing * sensor) perspective (near height / far height) * (far / near) <- NO FOCAL LENGTH front to back (distance + relief) / distance a crop focal B / focal A, keeping 1/crop^2 of the pixels ``` At 40 cm a head renders +25% larger at the front than the back; at 1.42 m it renders +7.1%. THAT is what people call lens compression, and it is computed here without reference to any lens. Put the 85 mm at 40 cm and it renders the face 1.25× front to back, exactly like the 24 mm — it simply frames a tighter crop of the same picture. ## What a framing costs in distance | Lens | Stand at | Angle of view | Near face vs far | Reads as | | --- | --- | --- | --- | --- | | **24 mm** | 40 cm | 53° | 1.25× (+25%) | **distorted** | | **35 mm** | 58 cm | 38° | 1.17× (+17.1%) | **distorted** | | **50 mm** | 83 cm | 27° | 1.12× (+12%) | noticeably close | | **85 mm** | 1.42 m | 16° | 1.07× (+7.1%) | natural | | **135 mm** | 2.25 m | 10° | 1.04× (+4.4%) | natural | A head filling 60% of frame height on full frame. The distances are not a coincidence of the table: holding the framing fixed makes distance proportional to focal length, so 40 cm to 1.42 m is 3.54× — **exactly 85/24**. The last column is the whole of what people call lens compression, and it is computed from the DISTANCE alone. Put the 85 mm at 40 cm and it renders the face 1.25× front to back, exactly like the 24 mm does — it just frames a much tighter crop of the same picture. ## One position, five lenses | Lens at 2 m | Framing | Angle of view | Near face vs far | Crop of the 24 mm | | --- | --- | --- | --- | --- | | 24 mm | 12% of frame height | 53° | 1.05× | 1× | | 35 mm | 18% of frame height | 38° | 1.05× | 1.46× | | 50 mm | 25% of frame height | 27° | 1.05× | 2.08× | | 85 mm | 43% of frame height | 16° | 1.05× | 3.54× | | 135 mm | 68% of frame height | 10° | 1.05× | 5.63× | **The fourth column does not move.** Every one of these frames the subject differently and renders it identically, because perspective is a ratio of distances and the camera has not moved. The fifth column says what each one is: a crop of the widest, at 3.2% of the pixels for the 135 mm. ## Distance, and what it does to a face | Distance | Near face vs far | Reads as | The lens that frames a head at 60% of frame height | | --- | --- | --- | --- | | 30 cm | 1.33× (+33.3%) | **distorted** | 18 mm | | 50 cm | 1.2× (+20%) | **distorted** | 30 mm | | 75 cm | 1.13× (+13.3%) | noticeably close | 45 mm | | 1 m | 1.1× (+10%) | noticeably close | 60 mm | | 1.5 m | 1.07× (+6.7%) | natural | 90 mm | | 2.5 m | 1.04× (+4%) | natural | 150 mm | | 4 m | 1.02× (+2.5%) | natural | 240 mm | The middle two columns depend only on the distance. The last column is what you would put on the camera to get the same head size from there — it is a CONSEQUENCE of the position, not a cause of anything in the other columns. To bring a face under +8% needs 1.25 m; under +15% needs 67 cm. Those are distances, and no focal length substitutes for them. ## A focal length means nothing until the sensor is known | Format | Sensor | 50 mm sees | Frames a head at 60% of frame height from | The lens that matches full frame's 50 mm | | --- | --- | --- | --- | --- | | **full-frame** | 36 × 24 mm | 27° | 83 cm | 50 mm | | **super35** | 24.89 × 18.66 mm | 21° | 1.07 m | 39 mm | | **apsc** | 23.5 × 15.6 mm | 18° | 1.28 m | 33 mm | | **mft** | 17.3 × 13 mm | 15° | 1.54 m | 27 mm | | **super16** | 12.52 × 7.41 mm | 8.5° | 2.7 m | 15 mm | | **1inch** | 13.2 × 8.8 mm | 10° | 2.27 m | 18 mm | | **phone** | 9.8 × 7.3 mm | 8.4° | 2.74 m | 15 mm | The fourth column is the one that matters here: the SAME lens on a smaller sensor stands you further away for the same framing, and further away is a different perspective. The fifth column is the lens that avoids that — it restores the framing from the SAME position, which is the only way to match a shot across formats. ## Thresholds | Threshold | Value | What it separates | | --- | --- | --- | | noticeable | near/far ≥ 1.08× | the subject reads as close. Reached at 1.25 m on a face. | | distorted | near/far ≥ 1.15× | the subject reads as wrong. Reached at 67 cm. | | the same position | within 1.02× | close enough that the shots are crops of each other. | | the same framing | within 2% of frame height | close enough that only the position differs. | | a deep crop | past 2× | keeps 25% of the pixels. The geometry survives it exactly; the resolution may not. | Defaults when the sheet is silent: full-frame, a subject 24 cm tall with 10 cm of depth, and no room or background limit. The format and the subject height are reported as findings when assumed, because both scale every distance on the sheet. ## Sheet grammar Two blocks. `SCENE` is `key | value`, one per line. `SHOTS` is a table. ``` SCENE name | what this is format | full-frame or super35, apsc, mft, super16, 1inch, phone, or 36x24 subject | 0.24 the subject's height in metres — a head is 0.24, a person 1.7 relief | 0.1 its depth, front to side — nose to ear is 0.1 room | 4 metres available behind the camera background | 6 metres to whatever is behind the subject SHOTS s1 | the wide | 24mm | 2m | fixes the POSITION, derives the framing s2 | the portrait | 85mm | 60% | fixes the SIZE, derives the position ``` A SHOTS row is `id | what it is | focal | distance or framing | why`. The fourth column is read as a **distance** when it carries a length (`2m`, `60cm`, `7ft`, or a bare number of metres) and as a **framing** when it carries a `%` or the word `frame`. Writing the framing is usually the honest way round, because it is what was actually decided — and the distance it derives is the thing this page exists to show you. Only `format` really matters if the default is wrong; everything else has a default and every default that gets used is reported as a finding. ## Lanes - **`plan`** — Choose the position before the lens. A lens gets picked for a look and the position follows from it, which is the wrong way round — the position is what makes the look and the lens only decides how much of the result is cropped away. This works out where the camera has to stand for the picture that was actually wanted. Sections: Summary, The Sheet, The Setting, Reasoning, Next Step. - **`check`** (primary) — What each shot on this list actually is. The paid read of what the free panel computes. Where every shot puts the camera, what that distance does to the subject front to back, which shots share a position and are therefore crops of one another, and which differences on the list are being credited to a lens that is not causing them. Sections: Summary, Verdict, Findings, Corrected Sheet, Next Step. - **`positions`** — Which shots are really the same picture. Groups the list by where the camera stands, because that is the only thing that decides perspective. Shots sharing a position are exact crops of one another and can come off one take; shots at different positions are different pictures no lens can reconcile. Sections: Summary, Every Position, What Is A Crop, What Is Not, Next Step. - **`room`** — Whether the shots fit in the space. A framing and a focal length together demand a distance, and the distance is either available or the shot does not exist. This works out what every shot needs against what the location has, and what focal length would give the same framing from where you can actually stand. Sections: Summary, Every Shot, What Does Not Fit, What Would, Next Step. - **`deliver`** — Decide what changes: the position, the lens, or the expectation. Sorts every finding into what moving the camera fixes, what only a different lens fixes, and what nothing fixes. The middle bucket is smaller than people expect and the first is larger, which is the point: most of what gets blamed on glass is a standing position. Sections: Summary, Moving The Camera Fixes, Only A Different Lens Fixes, Nothing Fixes, Next Step. ## Findings All 22 are computed in the browser and cost nothing. | Code | Severity | Scope | What it means | | --- | --- | --- | --- | | `FORMAT-ASSUMED` | warn | scene | The sensor format was assumed | | `SUBJECT-ASSUMED` | warn | scene | The subject's height was assumed | | `RELIEF-ASSUMED` | note | scene | The subject's depth was assumed | | `NO-ROOM-GIVEN` | note | scene | No room depth was given | | `NO-BACKGROUND-GIVEN` | note | scene | No background distance was given | | `DISTANCE-FROM-FRAMING` | note | shot | The distance was derived from the framing | | `FRAMING-FROM-DISTANCE` | note | shot | The framing was derived from the distance | | `DISTORTION-GROSS` | error | shot | The subject is close enough to be visibly distorted | | `DISTORTION-NOTABLE` | warn | shot | The subject is close enough to show some distortion | | `DISTORTION-FINE` | note | shot | The subject is far enough to read as undistorted | | `CANNOT-STAND-THERE` | error | shot | The shot needs more room than the scene has | | `ROOM-TIGHT` | warn | shot | The shot uses nearly all the room there is | | `SUBJECT-OVERFLOWS` | warn | shot | The subject does not fit in the frame | | `SUBJECT-TINY` | note | shot | The subject is very small in frame | | `FOV` | note | shot | What this lens sees on this format | | `BACKGROUND-SIZE` | note | shot | What the background does in this shot | | `SAME-POSITION` | note | scene | Some of these shots are taken from the same place | | `CROP-AVAILABLE` | note | scene | One of these shots is a crop of another | | `CROP-TOO-DEEP` | warn | scene | That crop asks for more resolution than a master usually has | | `PERSPECTIVE-VARIES` | warn | scene | These shots are taken from genuinely different places | | `LENS-IS-NOT-DOING-IT` | warn | scene | The difference between these shots is the distance, not the lens | | `ONE-POSITION` | note | scene | Every shot is from the same place | ## What this page cannot do This page computes from the numbers on the sheet. It has not seen any picture. - **It is a pinhole model.** Real lenses have entrance pupils that sit somewhere other than the marked focal plane, so the true perspective distance differs from the measured one by a few centimetres — which matters at 30 cm and is invisible at 3 m. - **Distortion here means PERSPECTIVE distortion, not lens distortion.** Barrel and pincushion are optical defects of a particular lens and are not modelled at all. The figures here would hold for a perfect lens. - **The subject is treated as a flat object with one depth.** A real face is not, and the near/far figure is a single ratio standing in for a continuum. - **No depth of field.** How much is sharp is a different question with a different answer, and a longer lens from further away does change it — that difference is real and it is not on this page. - **Framing is a share of the sensor HEIGHT.** A subject framed against the width, or on a different aspect ratio than the sensor's native one, needs its own arithmetic. - Nothing here reaches the network, reads a file, or inspects an image. ## API `POST https://api.skillsafe.ai/v1/app-api/run` with a bearer token from https://perspective-desk.skillsafe.ai/tokens.html. The body IS the input object — there is no `input` wrapper and no `X-App-Slug` header. `task` is required and must be one of plan, check, positions, room, deliver. `POST /estimate` is free and validates the same body. Full documentation at https://perspective-desk.skillsafe.ai/api.html. ## Provenance Lanes derived from the `seedance-prompt-skill` skill in https://github.com/songguoxs/seedance-prompt-skill. The geometry, thresholds, sheet grammar and findings are this app's own. Not affiliated with or endorsed by the authors of that repository.