一、學習目的
(1)掌握多面體的存儲方法。
(2)掌握圖形的幾何變換及投影變換。
(3)掌握三維形體不同投影方法的投影圖的生成原理。
(4)掌握多面體投影圖繪制的編程方法。
二、學習內容
(1)編程實現一個長方體的正軸測投影圖。
(2)編程實現一個長方體的斜平行投影圖。
(3)編程實現一個長方體的一點透視圖。
三、基本算法
1. ?坐標系變換算法
-
?旋轉矩陣構造
用于將任意投影面對齊到標準坐標系(如XOY平面)。通過繞軸旋轉(如繞X/Y/Z軸),結合 ?羅德里格斯旋轉公式?或 ?歐拉角,生成旋轉變換矩陣,使投影面法向量對齊目標軸(如Z軸)。 -
?平移變換
將投影面平移到原點,簡化投影計算。
2. ?投影矩陣算法
-
?正軸測投影
通過正交投影矩陣移除深度坐標(Z軸),結合繞軸旋轉實現立體效果。 -
?斜平行投影
引入 ?錯切矩陣?(Shear Matrix),沿某一軸向偏移深度坐標,模擬斜視角。 -
?一點透視投影
構造 ?透視矩陣,引入滅點(Vanishing Point)。
四、具體代碼
import numpy as np
import matplotlib.pyplot as pltclass Cube:def __init__(self, size=1):self.vertices = np.array([[0, 0, 0],[size, 0, 0],[size, size, 0],[0, size, 0],[0, 0, size],[size, 0, size],[size, size, size],[0, size, size]])self.edges = [[0, 1], [1, 2], [2, 3], [3, 0],[4, 5], [5, 6], [6, 7], [7, 4],[0, 4], [1, 5], [2, 6], [3, 7]]def orthographic_projection(self):return self.vertices[:, :2]def oblique_parallel_projection(self, alpha=np.pi/4, l=0.5):P = np.array([[1, 0, -l*np.cos(alpha)],[0, 1, -l*np.sin(alpha)],[0, 0, 0]])return np.dot(self.vertices, P.T)def one_point_perspective_projection(self, d=5):P = np.array([[1, 0, 0, 0],[0, 1, 0, 0],[0, 0, 1, 0],[0, 0, -1/d, 0]])homogeneous_vertices = np.hstack((self.vertices, np.ones((8, 1))))projected = np.dot(homogeneous_vertices, P.T)return (projected[:, :2].T / projected[:, 3]).Tdef plot_projection(self, projection, title):projected_vertices = projection()plt.figure()for edge in self.edges:plt.plot(projected_vertices[edge, 0], projected_vertices[edge, 1], 'b')plt.title(title)plt.axis('equal')plt.show()if __name__ == '__main__':cube = Cube()cube.plot_projection(cube.orthographic_projection, 'Orthographic Projection')cube.plot_projection(lambda: cube.oblique_parallel_projection(), 'Oblique Parallel Projection')cube.plot_projection(cube.one_point_perspective_projection, 'One-Point Perspective Projection')
五、運行結果
六、項目簡介
# 立方體投影項目
## 項目概述
這個Python項目演示了立方體的三種不同投影方法:正交投影、斜平行投影和一點透視投影。
## 投影方法說明
1. **正交投影(Orthographic Projection)**: 直接忽略Z坐標,將3D點投影到XY平面
2. **斜平行投影(Oblique Parallel Projection)**: 保持平行線,但以一定角度顯示
3. **一點透視投影(One-Point Perspective Projection)**: 模擬人眼看到的透視效果
## 運行要求
- Python 3.x
- NumPy
- Matplotlib
## 示例代碼
```python
import numpy as np
import matplotlib.pyplot as plt
from cube_projections import Cube
cube = Cube()
cube.plot_projection(cube.orthographic_projection, 'Orthographic Projection')
```
## 預期輸出
運行后會顯示三個窗口,分別展示三種不同的立方體投影效果圖。