没有合适的资源?快使用搜索试试~ 我知道了~
3D渲染原理---完善上次传的同名文件。 提供矩阵推导方法。
资源推荐
资源详情
资源评论
3D 原理
一、3D 渲染管线
模型空间 → 世界空间 → 摄像机空间 → 剪切空间 → 标准化设备坐标 → 视口
Local/Object Space ⸺ ModelView Matrix →
World Space ⸺ Viewing Matrix →
Eye/Camera Space ⸺ Projection Matrix →
Clip Space ⸺ Perspective Divide →
NDC Space ⸺ Viewport Matrix →
Screen Space
实现 3D 显现可以简化, 多数使用单位阵, 仅处理 2 个矩阵
World Space = Eye/Camera Space ⸺ Projection Matrix Perspective Divide →
Clip Space、NDC Space ⸺ Viewport Matrix →
Screen Space
然后取其乘积, 仅保存一个矩阵, 运动通过基本的平移、绕轴旋转、反射等等显现.
非常简单!
本程序实验上述思路.
1、 Eye/Camera Space ⸺ Projection Matrix Perspective Divide → Clip/NDC Space
Frustum → NDC
Frustum 的近远平面距离分别为 n,f.
近平面的举行参数为 l,r, t,b 即 left,right,top,bottom.
x'/n=x/z, y'/n=y/z.
z'=a/z+b: n→-1, f→-1. perspective divide,
--不知道为什么不用线性函数?
--用线性函数凑不出射影变换矩阵.
z' 的函数图形为
从 a/n+b=-1, a/f+b=1 得到
a=2/(1/f-1/n),
b= 1-2/(1 - f /n) = -(1+f/n)/(1 - f /n) = -(n+f)/(n-f).
故
z'=2fn/(n-f) /z + (f+n)/(f-n)
考虑到 x,y 的缩放 [l,r]↦[-1,1], [t,b]↦[-1,1],所以
x'=
2
𝑟
―
𝑙
∙
𝑛𝑥
𝑧
―
𝑟
+
𝑙
𝑟
―
𝑙
y'=
2
𝑏
―
𝑡
∙
𝑛𝑦
𝑧
―
𝑏
+
𝑡
𝑏
―
𝑡
o
-1
1
n
H
Projection Transform
f
z
x
x'
z'=
―
2𝑓𝑛
𝑓
―
𝑛
∙
1
𝑧
+
𝑓
+
𝑛
𝑓
―
𝑛
矩阵 x'=Px
P=
2𝑛
𝑟
―
𝑙
―
𝑟
+
𝑙
𝑟
―
𝑙
2𝑛
𝑏
―
𝑡
―
𝑏
+
𝑡
𝑏
―
𝑡
𝑓
+
𝑛
𝑓
―
𝑛
―
2𝑓𝑛
𝑓
―
𝑛
1
𝑥′
𝑦′
𝑧′
𝑡′
=
2𝑛
𝑟
―
𝑙
―
𝑟
+
𝑙
𝑟
―
𝑙
2𝑛
𝑏
―
𝑡
―
𝑏
+
𝑡
𝑏
―
𝑡
𝑓
+
𝑛
𝑓
―
𝑛
―
2𝑓𝑛
𝑓
―
𝑛
1
𝑥
𝑦
𝑧
1
考虑到 NDC 为左手系, z-方向相反, 以 NDC 为标准 z 值是负数, 所以 z 换为-z, 得到
𝑥′
𝑦′
𝑧′
𝑡′
=
=
2𝑛
𝑟
―
𝑙
𝑟
+
𝑙
𝑟
―
𝑙
2𝑛
𝑏
―
𝑡
𝑏
+
𝑡
𝑏
―
𝑡
―
𝑓
+
𝑛
𝑓
―
𝑛
―
2𝑓𝑛
𝑓
―
𝑛
―
1
𝑥
𝑦
𝑧
1
2、Clip Space、NDC Space ⸺ Viewport Matrix → Screen Space
x' =xo+(x+1)*W/2, x' =yo+(y+1)*H/2.
矩阵 x'=Vx
V=
𝑊/2
𝑥𝑜
+
𝑊/2
𝐻/2
𝑦𝑜
+
𝐻/2
1
1
𝑥′
𝑦′
0
1
=
𝑊/2
𝑥𝑜
+
𝑊/2
𝐻/2
𝑦𝑜
+
𝐻/2
1
1
𝑥
𝑦
0
1
网友@The fool 还考虑了远近平面 f,n, 矩阵为
V=
𝑊/2
𝑥𝑜
+
𝑊/2
𝐻/2
𝑦𝑜
+
𝐻/2
𝑓
―
𝑛
2
𝑓
+
𝑛
2
1
o
(xo, yo)
-1
1
W
H
Viewport Transform
𝑥′
𝑦′
𝑧′
1
=
𝑊/2
𝑥𝑜
+
𝑊/2
𝐻/2
𝑦𝑜
+
𝐻/2
𝑓
―
𝑛
2
𝑓
+
𝑛
2
1
𝑥
𝑦
𝑧
1
这样 z'该理解为 n →f, 而 z∈[-1,1].
唯一需要存储的 3D 变换矩阵
T=
𝑊/2
𝑥𝑜
+
𝑊/2
𝐻/2
𝑦𝑜
+
𝐻/2
1
1
𝑛
𝑛
𝑓
+
𝑛
𝑓
―
𝑛
―
2𝑓𝑛
𝑓
―
𝑛
1
=
=
𝑊𝑛/2
(𝑥𝑜
+
𝑊/2)
𝑓
+
𝑛
𝑓
―
𝑛
―
(𝑥𝑜
+
𝑊/2)
2𝑓𝑛
𝑓
―
𝑛
𝐻𝑛/2
(𝑦𝑜
+
𝐻/2)
𝑓
+
𝑛
𝑓
―
𝑛
―
(𝑥𝑜
+
𝐻/2)
2𝑓𝑛
𝑓
―
𝑛
𝑓
+
𝑛
𝑓
―
𝑛
―
2𝑓𝑛
𝑓
―
𝑛
1
0
二、对投影矩阵的进一步讨论
Colobot使用的投影矩阵 LoadProjectionMatrix 为
// cot(v)/a
// cot(v)
// (n+f)/(n-f) 2fn/(n-f)
// -1
// 其中 v= fov/2, a=aspect = w/h
即 P =
𝑐𝑜𝑡𝑣
𝑎
𝑐𝑜𝑡𝑣
―
𝑓
+
𝑛
𝑓
―
𝑛
―
2𝑓𝑛
𝑓
―
𝑛
―
1
网友@The fool 的理解 https://blog.csdn.net/wangdingqiaoit/article/details/51589825
透视投影把相机坐标系中的截头体 Frustum 映射到标准立方体 NDC 中, 其中[l,r]、[b,t]、[n,f]
分别映射到[−1,1]. 如图. 近平面 –n, 远平面 –f .
利用相似性,
通过俯视图可得: x'/(-n) = x/z
通过侧视图可得: y'/(-n) = y /z
负号是因为 NDC 使用了左手系, z' 指向里面.
剩余13页未读,继续阅读
资源评论
tbyang2012
- 粉丝: 0
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功