---
title: 空间与透视
url: https://doc.liz6.com/general-education/visual-foundations/04-perspective-and-space
locale: zh
area: general-education
tags:
- 通识入门
- 视觉基础
date: 2026-09-10
modified: 2026-09-10
description: 一张画没有真实的前后距离，却可以让我们读出一条走廊、一排树，或桌面上前后的物体。它依靠一组相互支持的空间线索。
---

# 空间与透视

一张画没有真实的前后距离，却可以让我们读出一条走廊、一排树，或桌面上前后的物体。它依靠一组相互支持的空间线索。

**先辨认遮挡和相对大小，再理解透视如何把观看位置与画面联系起来。** 本篇不要求你画复杂建筑；能指出画面为什么有远近、哪些线索需要条件，就足够了。

## 遮挡先告诉我们顺序

如果球挡住盒子的一角，我们通常会把球读成在前，盒子读成在后。被挡住的物体不需要完整露出来，画面仍可能被理解。

但遮挡主要给出前后顺序，不能直接告诉我们相隔几厘米。一张平面拼贴也可以制造相同的遮挡关系；我们在这里讨论的是图像提供了什么线索。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 210" width="400" height="210" role="img" aria-labelledby="vf-4-wide-title" data-diagram-layout="wide" data-diagram-theme="native">
<title id="vf-4-wide-title">A 两个形状重叠；B 三个相同物体随距离增加而显得更小。</title>
<defs>
<radialGradient id="vf-4-wide-ball" cx="30%" cy="25%" r="80%">
<stop stop-color="#eee"/>
<stop offset=".5" stop-color="#aaa"/>
<stop offset="1" stop-color="#3f3f3f"/>
</radialGradient>
</defs>
<rect width="100%" height="100%" fill="#e8e4dc"/>
<g transform="translate(0 0) scale(1)">
<rect x="36" y="42" width="92" height="90" fill="#b7733e"/>
<rect x="81" y="78" width="92" height="90" fill="#536a78"/>
<text x="100" y="198" text-anchor="middle" font-family="sans-serif" font-size="22" fill="#34302a">A</text>
</g>
<g transform="translate(200 0) scale(1)">
<rect x="25" y="75" width="70" height="70" fill="#536a78"/>
<rect x="76" y="100" width="45" height="45" fill="#738162"/>
<rect x="127" y="118" width="27" height="27" fill="#b7733e"/>
<text x="100" y="198" text-anchor="middle" font-family="sans-serif" font-size="22" fill="#34302a">B</text>
</g>
</svg>

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 525" width="250" height="525" role="img" aria-labelledby="vf-4-compact-title" data-diagram-layout="compact" data-diagram-theme="native">
<title id="vf-4-compact-title">A 两个形状重叠；B 三个相同物体随距离增加而显得更小。</title>
<defs>
<radialGradient id="vf-4-compact-ball" cx="30%" cy="25%" r="80%">
<stop stop-color="#eee"/>
<stop offset=".5" stop-color="#aaa"/>
<stop offset="1" stop-color="#3f3f3f"/>
</radialGradient>
</defs>
<rect width="100%" height="100%" fill="#e8e4dc"/>
<g transform="translate(0 0) scale(1.25)">
<rect x="36" y="42" width="92" height="90" fill="#b7733e"/>
<rect x="81" y="78" width="92" height="90" fill="#536a78"/>
<text x="100" y="198" text-anchor="middle" font-family="sans-serif" font-size="22" fill="#34302a">A</text>
</g>
<g transform="translate(0 262.5) scale(1.25)">
<rect x="25" y="75" width="70" height="70" fill="#536a78"/>
<rect x="76" y="100" width="45" height="45" fill="#738162"/>
<rect x="127" y="118" width="27" height="27" fill="#b7733e"/>
<text x="100" y="198" text-anchor="middle" font-family="sans-serif" font-size="22" fill="#34302a">B</text>
</g>
</svg>

A 中的重叠让前后关系更清楚。B 则通过相同对象的大小变化提示距离。两种方法可以组合，但各自回答的问题不同。

## 更小不总是更远

在同一观看条件下，**实际尺寸相同**的物体，越远通常在画面里越小。例如同一种路灯沿街延伸，远处的灯柱显得更短。

如果实际尺寸未知，一枚靠近镜头的硬币也能比远处的大楼占据更大画面。不能把“画面里小”直接翻译成“现实里远”。比较熟悉物体、遮挡和地面位置，可以提供额外依据。

## 透视从观看位置开始

把眼前的画面想成一扇固定的窗。从眼睛向物体发出的直线与这扇窗相交，交点组成投影。观察者的位置变了，交点也会变。

在水平地面的常见场景中，视平线对应眼睛的高度。向远处延伸的一组同向平行线，在投影里可以朝同一个消失点靠拢。**不同方向的平行线一般对应不同消失点；平行于画面的边，不会汇聚到画面中的有限点。**

## 用盒子核对眼高

在下面的“单点透视”里，盒子的正面与画面平行，深度方向的边向同一消失点延伸。相机始终水平，只改变它的高度。

**从遮挡到透视：三种空间线索**

遮挡显示前后关系；大小模式把同样尺寸的平面放到不同距离；透视模式固定水平观看方向，改变眼高，观察盒子与地面相对视平线的位置。平行于画面的边仍平行。


眼睛与盒子顶面齐高时，上表面几乎压成一条线；把眼睛升高后，能看到更多顶面。实验里的视平线在画面内保持原位，是因为相机没有俯仰，并保持固定的画面投影设置。生活中把手机抬高又向下倾斜，则同时改变了两件事，不能用这里的单一变化直接套用。

地面朝远处延伸的线越来越靠近。横跨画面的平行线仍然平行，却因为距离不同而缩短。观察线的**空间方向**，比记住“所有线都往中间画”更可靠。

## 从走廊里读出三种空间线索

走廊左侧门洞与右侧方柱逐渐变小，地面和天花板边线朝远处同一区域收拢。

AI 生成观察素材。请用画面线索作具体比较；精确几何关系以文中的自绘图为准。


先暂时不画辅助线，找具体证据：左侧近处门洞更大，后面的门洞逐渐缩小；右侧柱子彼此遮挡；地面、墙面与顶面朝远处形成收束关系。它们共同帮助读出深度，任何一种都不必独自承担整个空间判断。

再沿左墙顶边、墙脚和右侧柱列的方向看过去。它们大致朝画面远处的同一区域收拢。**不要把远处山的轮廓当作视平线，也不要只因为某条横线很长就称它为视平线。** 视平线涉及观看高度与水平空间方向，山顶线是具体地形。

这张生成图适合寻找线索，不承担精确作图。下面换成明确构造的房间，把步骤完整走一遍。

## 完整示范：怎样搭出一个能继续放家具的房间？

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 520" width="640" height="520" data-vf-case="4" data-diagram-layout="wide" data-diagram-theme="native" role="img" aria-labelledby="case-4-wide-title">
<title id="case-4-wide-title">房间作图：A 地平线与后墙，B 加入沿深度排列的门，C 右侧门顶的方向错误。</title>
<rect width="100%" height="100%" fill="#f6f4ef"/>
<g transform="translate(0 0)">
<defs>
<clipPath id="case-4-wide-0">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-4-wide-0)">
<rect x="10" y="8" width="300" height="220" fill="#ece8df"/>
<rect x="118" y="82" width="88" height="64" fill="#d5d1c6"/>
<path d="M10 8L118 82V146L10 228Z" fill="#c4b7a4"/>
<path d="M310 8L206 82V146L310 228Z" fill="#ded5c6"/>
<path d="M10 228L118 146H206L310 228Z" fill="#b4afa3"/>
<path d="M10 112H310" stroke="#4f7076" stroke-width="1" stroke-dasharray="4 4"/>
<circle cx="162" cy="112" r="4" fill="#4f7076"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">A</text>
</g>
<g transform="translate(320 0)">
<defs>
<clipPath id="case-4-wide-1">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-4-wide-1)">
<rect x="10" y="8" width="300" height="220" fill="#ece8df"/>
<rect x="118" y="82" width="88" height="64" fill="#d5d1c6"/>
<path d="M10 8L118 82V146L10 228Z" fill="#c4b7a4"/>
<path d="M310 8L206 82V146L310 228Z" fill="#ded5c6"/>
<path d="M10 228L118 146H206L310 228Z" fill="#b4afa3"/>
<path d="M10 45L162 112M10 195L162 112M310 45L162 112M310 195L162 112" stroke="#a97a38" stroke-width="2" stroke-dasharray="5 4"/>
<path d="M48 61.75V174.25L61 167.1513157894737V67.48026315789474Z" fill="#596e70"/>
<path d="M80 75.85526315789474V156.7763157894737L93 149.67763157894737V81.58552631578948Z" fill="#596e70"/>
<path d="M102 85.55263157894737V144.76315789473685L115 137.66447368421052V91.28289473684211Z" fill="#596e70"/>
<path d="M234 79.4054054054054L286 55.86486486486486V181.54054054054052L234 152.3783783783784Z" fill="#596e70"/>
<path d="M10 112H310" stroke="#4f7076" stroke-width="1" stroke-dasharray="4 4"/>
<circle cx="162" cy="112" r="4" fill="#4f7076"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">B</text>
</g>
<g transform="translate(0 260)">
<defs>
<clipPath id="case-4-wide-2">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-4-wide-2)">
<rect x="10" y="8" width="300" height="220" fill="#ece8df"/>
<rect x="118" y="82" width="88" height="64" fill="#d5d1c6"/>
<path d="M10 8L118 82V146L10 228Z" fill="#c4b7a4"/>
<path d="M310 8L206 82V146L310 228Z" fill="#ded5c6"/>
<path d="M10 228L118 146H206L310 228Z" fill="#b4afa3"/>
<path d="M10 45L162 112M10 195L162 112M310 45L162 112M310 195L162 112" stroke="#a97a38" stroke-width="2" stroke-dasharray="5 4"/>
<path d="M48 61.75V174.25L61 167.1513157894737V67.48026315789474Z" fill="#596e70"/>
<path d="M80 75.85526315789474V156.7763157894737L93 149.67763157894737V81.58552631578948Z" fill="#596e70"/>
<path d="M102 85.55263157894737V144.76315789473685L115 137.66447368421052V91.28289473684211Z" fill="#596e70"/>
<path d="M234 79.4054054054054L286 109V181.54054054054052L234 152.3783783783784Z" fill="#ac5c48"/>
<path d="M10 112H310" stroke="#4f7076" stroke-width="1" stroke-dasharray="4 4"/>
<circle cx="162" cy="112" r="4" fill="#4f7076"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">C</text>
</g>
</svg>

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 780" width="320" height="780" data-vf-case="4" data-diagram-layout="compact" data-diagram-theme="native" role="img" aria-labelledby="case-4-compact-title">
<title id="case-4-compact-title">房间作图：A 地平线与后墙，B 加入沿深度排列的门，C 右侧门顶的方向错误。</title>
<rect width="100%" height="100%" fill="#f6f4ef"/>
<g transform="translate(0 0)">
<defs>
<clipPath id="case-4-compact-0">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-4-compact-0)">
<rect x="10" y="8" width="300" height="220" fill="#ece8df"/>
<rect x="118" y="82" width="88" height="64" fill="#d5d1c6"/>
<path d="M10 8L118 82V146L10 228Z" fill="#c4b7a4"/>
<path d="M310 8L206 82V146L310 228Z" fill="#ded5c6"/>
<path d="M10 228L118 146H206L310 228Z" fill="#b4afa3"/>
<path d="M10 112H310" stroke="#4f7076" stroke-width="1" stroke-dasharray="4 4"/>
<circle cx="162" cy="112" r="4" fill="#4f7076"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">A</text>
</g>
<g transform="translate(0 260)">
<defs>
<clipPath id="case-4-compact-1">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-4-compact-1)">
<rect x="10" y="8" width="300" height="220" fill="#ece8df"/>
<rect x="118" y="82" width="88" height="64" fill="#d5d1c6"/>
<path d="M10 8L118 82V146L10 228Z" fill="#c4b7a4"/>
<path d="M310 8L206 82V146L310 228Z" fill="#ded5c6"/>
<path d="M10 228L118 146H206L310 228Z" fill="#b4afa3"/>
<path d="M10 45L162 112M10 195L162 112M310 45L162 112M310 195L162 112" stroke="#a97a38" stroke-width="2" stroke-dasharray="5 4"/>
<path d="M48 61.75V174.25L61 167.1513157894737V67.48026315789474Z" fill="#596e70"/>
<path d="M80 75.85526315789474V156.7763157894737L93 149.67763157894737V81.58552631578948Z" fill="#596e70"/>
<path d="M102 85.55263157894737V144.76315789473685L115 137.66447368421052V91.28289473684211Z" fill="#596e70"/>
<path d="M234 79.4054054054054L286 55.86486486486486V181.54054054054052L234 152.3783783783784Z" fill="#596e70"/>
<path d="M10 112H310" stroke="#4f7076" stroke-width="1" stroke-dasharray="4 4"/>
<circle cx="162" cy="112" r="4" fill="#4f7076"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">B</text>
</g>
<g transform="translate(0 520)">
<defs>
<clipPath id="case-4-compact-2">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-4-compact-2)">
<rect x="10" y="8" width="300" height="220" fill="#ece8df"/>
<rect x="118" y="82" width="88" height="64" fill="#d5d1c6"/>
<path d="M10 8L118 82V146L10 228Z" fill="#c4b7a4"/>
<path d="M310 8L206 82V146L310 228Z" fill="#ded5c6"/>
<path d="M10 228L118 146H206L310 228Z" fill="#b4afa3"/>
<path d="M10 45L162 112M10 195L162 112M310 45L162 112M310 195L162 112" stroke="#a97a38" stroke-width="2" stroke-dasharray="5 4"/>
<path d="M48 61.75V174.25L61 167.1513157894737V67.48026315789474Z" fill="#596e70"/>
<path d="M80 75.85526315789474V156.7763157894737L93 149.67763157894737V81.58552631578948Z" fill="#596e70"/>
<path d="M102 85.55263157894737V144.76315789473685L115 137.66447368421052V91.28289473684211Z" fill="#596e70"/>
<path d="M234 79.4054054054054L286 109V181.54054054054052L234 152.3783783783784Z" fill="#ac5c48"/>
<path d="M10 112H310" stroke="#4f7076" stroke-width="1" stroke-dasharray="4 4"/>
<circle cx="162" cy="112" r="4" fill="#4f7076"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">C</text>
</g>
</svg>

**A：先定观看条件。** 本例选择相机水平、正对后墙。画一条视平线，在其上选取深度方向的消失点，再放入与画面平行的后墙矩形。将后墙四角向外延长到画框，墙、顶、地面的关系便建立起来。消失点决定方向关系，但它不是“画面重点必须放这里”的审美命令。

**B：再给空间放入东西。** 左墙加上几扇门。门的竖边仍竖直，沿墙向远处延伸的门顶、门底朝同一个消失点走。门越远，看起来越小，间距也受到透视压缩。不要在画面上机械地把每扇门画成等宽、等间距，那等于忽略了它们在不同深度。

**C：用不一致的例子反查。** 右侧这扇门有一条顶边朝错误方向走，和墙面所属的深度方向不一致。加砖缝、木纹和阴影都不能修正这条结构错误。先追踪边线属于哪一组空间方向，再改线；无需把所有线都拉向同一点。

## 把“等距”画出来：四块同样深的地砖

先规定地砖铺在水平地面，相机水平、正对这组砖；横跨画面的边保持水平，左右边朝 V 收拢。A 是一段长方形地面的透视外框：AB 在近处，CD 在远处。我们要把现实中的这段长度分成四等份，不能直接在纸面上等分。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 520" width="640" height="520" data-vf-case="steps-floor" data-diagram-layout="wide" data-diagram-theme="native" role="img" aria-labelledby="case-steps-floor-wide-title">
<title id="case-steps-floor-wide-title">把“等距”画出来：四块同样深的地砖</title>
<rect width="100%" height="100%" fill="#f6f4ef"/>
<g transform="translate(0 0)">
<defs>
<clipPath id="case-steps-floor-wide-0">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-steps-floor-wide-0)">
<rect x="10" y="8" width="300" height="220" fill="#eee9df" />
<polygon points="30.0,165.0 290.0,165.0 186.0,61.0 134.0,61.0" fill="#c6c9bd" stroke="#526c70" stroke-width="2"/>
<text x="16.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">A</text>
<text x="292.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">B</text>
<text x="191.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">C</text>
<text x="117.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">D</text>
<text x="150" y="30" font-size="18" font-family="sans-serif" fill="#293b43">V</text>
<circle cx="160" cy="35" r="3" fill="#526c70"/>
<path d="M134.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M186.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">A</text>
</g>
<g transform="translate(320 0)">
<defs>
<clipPath id="case-steps-floor-wide-1">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-steps-floor-wide-1)">
<rect x="10" y="8" width="300" height="220" fill="#eee9df" />
<polygon points="30.0,165.0 290.0,165.0 186.0,61.0 134.0,61.0" fill="#c6c9bd" stroke="#526c70" stroke-width="2"/>
<text x="16.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">A</text>
<text x="292.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">B</text>
<text x="191.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">C</text>
<text x="117.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">D</text>
<text x="150" y="30" font-size="18" font-family="sans-serif" fill="#293b43">V</text>
<circle cx="160" cy="35" r="3" fill="#526c70"/>
<path d="M134.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M186.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M30.0 165.0L186.0 61.0" stroke="#ad7131" stroke-width="2" fill="none"/>
<path d="M290.0 165.0L134.0 61.0" stroke="#ad7131" stroke-width="2" fill="none"/>
<path d="M116.66666666666666 78.33333333333334L203.33333333333334 78.33333333333334" stroke="#ad7131" stroke-width="2" fill="none"/>
<circle cx="160" cy="78.333333" r="4" fill="#ad7131"/>
<text x="164" y="99" font-size="18" font-family="sans-serif" fill="#293b43">M</text>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">B</text>
</g>
<g transform="translate(0 260)">
<defs>
<clipPath id="case-steps-floor-wide-2">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-steps-floor-wide-2)">
<rect x="10" y="8" width="300" height="220" fill="#eee9df" />
<polygon points="30.0,165.0 290.0,165.0 186.0,61.0 134.0,61.0" fill="#c6c9bd" stroke="#526c70" stroke-width="2"/>
<text x="16.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">A</text>
<text x="292.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">B</text>
<text x="191.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">C</text>
<text x="117.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">D</text>
<text x="150" y="30" font-size="18" font-family="sans-serif" fill="#293b43">V</text>
<circle cx="160" cy="35" r="3" fill="#526c70"/>
<path d="M134.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M186.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M30.0 165.0L186.0 61.0" stroke="#ad7131" stroke-width="2" fill="none"/>
<path d="M290.0 165.0L134.0 61.0" stroke="#ad7131" stroke-width="2" fill="none"/>
<path d="M116.66666666666666 78.33333333333334L203.33333333333334 78.33333333333334" stroke="#ad7131" stroke-width="2" fill="none"/>
<circle cx="160" cy="78.333333" r="4" fill="#ad7131"/>
<text x="164" y="99" font-size="18" font-family="sans-serif" fill="#293b43">M</text>
<path d="M95.0 100.0L225.0 100.0" stroke="#777c78" stroke-width="2" fill="none"/>
<path d="M127.5 67.5L192.5 67.5" stroke="#777c78" stroke-width="2" fill="none"/>
<path d="M30.0 165.0L203.33333333333334 78.33333333333334" stroke="#9b9380" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M290.0 165.0L116.66666666666666 78.33333333333334" stroke="#9b9380" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M116.66666666666666 78.33333333333334L186.0 61.0" stroke="#9b9380" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M203.33333333333334 78.33333333333334L134.0 61.0" stroke="#9b9380" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">C</text>
</g>
<g transform="translate(320 260)">
<defs>
<clipPath id="case-steps-floor-wide-3">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-steps-floor-wide-3)">
<rect x="10" y="8" width="300" height="220" fill="#eee9df" />
<polygon points="30.0,165.0 290.0,165.0 186.0,61.0 134.0,61.0" fill="#c6c9bd" stroke="#526c70" stroke-width="2"/>
<text x="16.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">A</text>
<text x="292.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">B</text>
<text x="191.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">C</text>
<text x="117.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">D</text>
<text x="150" y="30" font-size="18" font-family="sans-serif" fill="#293b43">V</text>
<circle cx="160" cy="35" r="3" fill="#526c70"/>
<path d="M134.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M186.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M108.0 87.0L212.0 87.0" stroke="#a35f4d" stroke-width="2" fill="none"/>
<path d="M82.0 113.0L238.0 113.0" stroke="#a35f4d" stroke-width="2" fill="none"/>
<path d="M56.0 139.0L264.0 139.0" stroke="#a35f4d" stroke-width="2" fill="none"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">D</text>
</g>
</svg>

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 1040" width="320" height="1040" data-vf-case="steps-floor" data-diagram-layout="compact" data-diagram-theme="native" role="img" aria-labelledby="case-steps-floor-compact-title">
<title id="case-steps-floor-compact-title">把“等距”画出来：四块同样深的地砖</title>
<rect width="100%" height="100%" fill="#f6f4ef"/>
<g transform="translate(0 0)">
<defs>
<clipPath id="case-steps-floor-compact-0">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-steps-floor-compact-0)">
<rect x="10" y="8" width="300" height="220" fill="#eee9df" />
<polygon points="30.0,165.0 290.0,165.0 186.0,61.0 134.0,61.0" fill="#c6c9bd" stroke="#526c70" stroke-width="2"/>
<text x="16.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">A</text>
<text x="292.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">B</text>
<text x="191.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">C</text>
<text x="117.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">D</text>
<text x="150" y="30" font-size="18" font-family="sans-serif" fill="#293b43">V</text>
<circle cx="160" cy="35" r="3" fill="#526c70"/>
<path d="M134.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M186.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">A</text>
</g>
<g transform="translate(0 260)">
<defs>
<clipPath id="case-steps-floor-compact-1">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-steps-floor-compact-1)">
<rect x="10" y="8" width="300" height="220" fill="#eee9df" />
<polygon points="30.0,165.0 290.0,165.0 186.0,61.0 134.0,61.0" fill="#c6c9bd" stroke="#526c70" stroke-width="2"/>
<text x="16.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">A</text>
<text x="292.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">B</text>
<text x="191.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">C</text>
<text x="117.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">D</text>
<text x="150" y="30" font-size="18" font-family="sans-serif" fill="#293b43">V</text>
<circle cx="160" cy="35" r="3" fill="#526c70"/>
<path d="M134.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M186.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M30.0 165.0L186.0 61.0" stroke="#ad7131" stroke-width="2" fill="none"/>
<path d="M290.0 165.0L134.0 61.0" stroke="#ad7131" stroke-width="2" fill="none"/>
<path d="M116.66666666666666 78.33333333333334L203.33333333333334 78.33333333333334" stroke="#ad7131" stroke-width="2" fill="none"/>
<circle cx="160" cy="78.333333" r="4" fill="#ad7131"/>
<text x="164" y="99" font-size="18" font-family="sans-serif" fill="#293b43">M</text>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">B</text>
</g>
<g transform="translate(0 520)">
<defs>
<clipPath id="case-steps-floor-compact-2">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-steps-floor-compact-2)">
<rect x="10" y="8" width="300" height="220" fill="#eee9df" />
<polygon points="30.0,165.0 290.0,165.0 186.0,61.0 134.0,61.0" fill="#c6c9bd" stroke="#526c70" stroke-width="2"/>
<text x="16.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">A</text>
<text x="292.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">B</text>
<text x="191.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">C</text>
<text x="117.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">D</text>
<text x="150" y="30" font-size="18" font-family="sans-serif" fill="#293b43">V</text>
<circle cx="160" cy="35" r="3" fill="#526c70"/>
<path d="M134.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M186.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M30.0 165.0L186.0 61.0" stroke="#ad7131" stroke-width="2" fill="none"/>
<path d="M290.0 165.0L134.0 61.0" stroke="#ad7131" stroke-width="2" fill="none"/>
<path d="M116.66666666666666 78.33333333333334L203.33333333333334 78.33333333333334" stroke="#ad7131" stroke-width="2" fill="none"/>
<circle cx="160" cy="78.333333" r="4" fill="#ad7131"/>
<text x="164" y="99" font-size="18" font-family="sans-serif" fill="#293b43">M</text>
<path d="M95.0 100.0L225.0 100.0" stroke="#777c78" stroke-width="2" fill="none"/>
<path d="M127.5 67.5L192.5 67.5" stroke="#777c78" stroke-width="2" fill="none"/>
<path d="M30.0 165.0L203.33333333333334 78.33333333333334" stroke="#9b9380" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M290.0 165.0L116.66666666666666 78.33333333333334" stroke="#9b9380" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M116.66666666666666 78.33333333333334L186.0 61.0" stroke="#9b9380" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M203.33333333333334 78.33333333333334L134.0 61.0" stroke="#9b9380" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">C</text>
</g>
<g transform="translate(0 780)">
<defs>
<clipPath id="case-steps-floor-compact-3">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-steps-floor-compact-3)">
<rect x="10" y="8" width="300" height="220" fill="#eee9df" />
<polygon points="30.0,165.0 290.0,165.0 186.0,61.0 134.0,61.0" fill="#c6c9bd" stroke="#526c70" stroke-width="2"/>
<text x="16.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">A</text>
<text x="292.0" y="184.0" font-size="18" font-family="sans-serif" fill="#293b43">B</text>
<text x="191.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">C</text>
<text x="117.0" y="57.0" font-size="18" font-family="sans-serif" fill="#293b43">D</text>
<text x="150" y="30" font-size="18" font-family="sans-serif" fill="#293b43">V</text>
<circle cx="160" cy="35" r="3" fill="#526c70"/>
<path d="M134.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M186.0 61.0L160 35" stroke="#829391" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<path d="M108.0 87.0L212.0 87.0" stroke="#a35f4d" stroke-width="2" fill="none"/>
<path d="M82.0 113.0L238.0 113.0" stroke="#a35f4d" stroke-width="2" fill="none"/>
<path d="M56.0 139.0L264.0 139.0" stroke="#a35f4d" stroke-width="2" fill="none"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">D</text>
</g>
</svg>

B：连接 A→C、B→D，两条对角线交于 M。长方形的中心在透视投影中仍是这两条线的交点。过 M 画与 AB 平行的横线，就找到地面深度的一半。注意 M 在纸面上明显靠近远边；这正是距离压缩的结果。

C：对前后两块小长方形各重复一次“连对角线—过交点作横线”，得到四块现实等深的砖。新增两组细虚线是第二轮作图。D 却把屏幕上的间距画成一样：若坚持它是同样深的地砖，就与观看条件不符。

这套作图可转到正对的墙面：用对角线找矩形中心，再沿该平面的另一组边方向分割。两点透视时，那条分割线通常应朝对应消失点走，不能继续机械画水平线。这里解决的是重复间距；门的宽度、高度还须保持各自的方向关系。

## 把一个盒子转过来，为什么又要两个消失点？

刚才的后墙和盒子正面都与画面平行，因此正面横边保持水平，只有深度方向明显收拢。若让盒子在地面上转动，原来的两组水平边都会朝远处延伸，于是通常各有一个消失点。相机仍水平时，竖边保持竖直，这就是常见的两点透视。

两点可以远在画框外。强行把它们都挤在纸内，经常会使近角显得特别尖、两侧缩得特别快。真正需要检查的是观看角度与投影关系，而不是数一数图里画出了几个点。抬头拍高楼时竖边也会收束，那又改变了相机条件，不能沿用“竖线永远竖直”的说法。

## 不靠尺规，也能让空间更清楚

| 线索 | 可以说明什么 | 容易误用的地方 |
| --- | --- | --- |
| 遮挡 | 谁在谁前面 | 只能粗略判断顺序，不能直接得出距离 |
| 已知同尺寸物体的大小变化 | 远近关系 | 不知道实物大小时，小并不必然远 |
| 纹理变密、间距压缩 | 表面向远处延伸 | 重复物仍需要符合共同的空间方向 |
| 远处对比与细节减少 | 常见大气条件下的距离感 | 空气、照明和材质会改变效果，室内不必照抄“远处更蓝” |

例如画雾中的山，不必像画房间那样到处加直线消失点。可以用前后遮挡、不同尺度、远处较弱的细节与反差组织层次。工具要对应对象的结构。

## 换成柱列：远处那根柱子出了什么问题？

三根柱子实际等高，立在同一水平面；相机水平，眼高恰好等于柱高。A 是基准，B 修改了一根柱子，C 给 A 加了一条参考线。B 能否继续描述同样条件？先指出图中证据，再说什么情况下 B 才可能成立。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 520" width="640" height="520" data-vf-case="practice-4" data-diagram-layout="wide" data-diagram-theme="native" role="img" aria-labelledby="case-practice-4-wide-title">
<title id="case-practice-4-wide-title">换成柱列：远处那根柱子出了什么问题？</title>
<rect width="100%" height="100%" fill="#f6f4ef"/>
<g transform="translate(0 0)">
<defs>
<clipPath id="case-practice-4-wide-0">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-practice-4-wide-0)">
<rect x="10" y="8" width="300" height="220" fill="#dedfda" />
<path d="M10 75L310 75" stroke="#718387" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<rect x="55" y="75" width="12" height="128" fill="#536d77" />
<path d="M50 203L74 203" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="142" y="75" width="12" height="72" fill="#536d77" />
<path d="M137 147L161 147" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="222" y="75" width="12" height="40" fill="#536d77" />
<path d="M217 115L241 115" stroke="#9e7445" stroke-width="2" fill="none"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">A</text>
</g>
<g transform="translate(320 0)">
<defs>
<clipPath id="case-practice-4-wide-1">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-practice-4-wide-1)">
<rect x="10" y="8" width="300" height="220" fill="#dedfda" />
<path d="M10 75L310 75" stroke="#718387" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<rect x="55" y="75" width="12" height="128" fill="#536d77" />
<path d="M50 203L74 203" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="142" y="75" width="12" height="72" fill="#536d77" />
<path d="M137 147L161 147" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="222" y="27" width="12" height="88" fill="#536d77" />
<path d="M217 115L241 115" stroke="#9e7445" stroke-width="2" fill="none"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">B</text>
</g>
<g transform="translate(0 260)">
<defs>
<clipPath id="case-practice-4-wide-2">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-practice-4-wide-2)">
<rect x="10" y="8" width="300" height="220" fill="#dedfda" />
<path d="M10 75L310 75" stroke="#718387" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<rect x="55" y="75" width="12" height="128" fill="#536d77" />
<path d="M50 203L74 203" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="142" y="75" width="12" height="72" fill="#536d77" />
<path d="M137 147L161 147" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="222" y="75" width="12" height="40" fill="#536d77" />
<path d="M217 115L241 115" stroke="#9e7445" stroke-width="2" fill="none"/>
<path d="M60 75L299 75" stroke="#9e7445" stroke-width="2" fill="none"/>
<text x="245" y="69" font-size="18" font-family="sans-serif" fill="#293b43">H</text>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">C</text>
</g>
</svg>

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 780" width="320" height="780" data-vf-case="practice-4" data-diagram-layout="compact" data-diagram-theme="native" role="img" aria-labelledby="case-practice-4-compact-title">
<title id="case-practice-4-compact-title">换成柱列：远处那根柱子出了什么问题？</title>
<rect width="100%" height="100%" fill="#f6f4ef"/>
<g transform="translate(0 0)">
<defs>
<clipPath id="case-practice-4-compact-0">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-practice-4-compact-0)">
<rect x="10" y="8" width="300" height="220" fill="#dedfda" />
<path d="M10 75L310 75" stroke="#718387" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<rect x="55" y="75" width="12" height="128" fill="#536d77" />
<path d="M50 203L74 203" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="142" y="75" width="12" height="72" fill="#536d77" />
<path d="M137 147L161 147" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="222" y="75" width="12" height="40" fill="#536d77" />
<path d="M217 115L241 115" stroke="#9e7445" stroke-width="2" fill="none"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">A</text>
</g>
<g transform="translate(0 260)">
<defs>
<clipPath id="case-practice-4-compact-1">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-practice-4-compact-1)">
<rect x="10" y="8" width="300" height="220" fill="#dedfda" />
<path d="M10 75L310 75" stroke="#718387" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<rect x="55" y="75" width="12" height="128" fill="#536d77" />
<path d="M50 203L74 203" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="142" y="75" width="12" height="72" fill="#536d77" />
<path d="M137 147L161 147" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="222" y="27" width="12" height="88" fill="#536d77" />
<path d="M217 115L241 115" stroke="#9e7445" stroke-width="2" fill="none"/>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">B</text>
</g>
<g transform="translate(0 520)">
<defs>
<clipPath id="case-practice-4-compact-2">
<rect x="10" y="8" width="300" height="220" rx="3"/>
</clipPath>
</defs>
<g clip-path="url(#case-practice-4-compact-2)">
<rect x="10" y="8" width="300" height="220" fill="#dedfda" />
<path d="M10 75L310 75" stroke="#718387" stroke-width="2" fill="none" stroke-dasharray="4 4"/>
<rect x="55" y="75" width="12" height="128" fill="#536d77" />
<path d="M50 203L74 203" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="142" y="75" width="12" height="72" fill="#536d77" />
<path d="M137 147L161 147" stroke="#9e7445" stroke-width="2" fill="none"/>
<rect x="222" y="75" width="12" height="40" fill="#536d77" />
<path d="M217 115L241 115" stroke="#9e7445" stroke-width="2" fill="none"/>
<path d="M60 75L299 75" stroke="#9e7445" stroke-width="2" fill="none"/>
<text x="245" y="69" font-size="18" font-family="sans-serif" fill="#293b43">H</text>
</g>
<text x="160" y="251" text-anchor="middle" font-size="21" font-family="sans-serif" fill="#555">C</text>
</g>
</svg>

<details data-vf-practice="4"><summary>先判断，再展开图解</summary>

B 把最远一根柱子的顶部抬到了共同视平线之上，底部位置却未变。柱高等于眼高时，三个顶部应都投到视平线上；A 和 C 符合此条件。B 可能表示那根柱子实际更高，或底座所在平面改变，但就不能继续声称“三根等高、同一地面”。先核对条件，再决定是否修改。

</details>

## 两个容易误判的地方

**情境一：** 一张照片里，近处小杯子比远处大水壶还小。这违反透视了吗？

<details><summary>展开参考思路</summary><p>没有。近大远小的直接比较需要实际尺寸相同，或明确考虑实物尺寸的差别。投影大小同时取决于尺寸与距离。</p></details>

**情境二：** 单点透视图里，盒子正面的上边和下边没有汇聚。需要改吗？

<details><summary>展开参考思路</summary><p>如果正面平行于画面，就不需要。两条边在画面里仍平行；向深处延伸的另一组边才朝对应消失点靠拢。先判断它们属于哪一组空间方向。</p></details>

可选实践：从齐桌面和高于桌面的位置看一个盒子。保持视线水平，比较可见顶面、遮挡和边线方向，再试着倾斜视线，留意条件改变了什么。

延伸阅读：[Getty：从前景到背景](https://www.getty.edu/education/teachers/classroom_resources/curricula/landscapes/lesson02.html)、[英国国家美术馆：消失点](https://www.nationalgallery.org.uk/paintings/glossary/vanishing-point)。
