OpenGL: 平面阴影投射矩阵的推导
来源:互联网 发布:最优化例题 编辑:程序博客网 时间:2024/05/19 23:16
OpenGL 平面阴影投射矩阵的推导
OpenGL SuperBible 这本书介绍了一种阴影的实现方法, 将模型视图矩阵压平, 所有被绘制的物体都将位于这个平面的二维世界中. 不过这本书没有介绍该平面阴影投射矩阵是如何推导的.
假设平面方程 Ax + By + Cz + D = 0 已知, 光的方向L(Lx, Ly, Lz, 0)已知. 则模型视图空间的点 P(Px, Py, Pz, 1), 沿着光的方向投射到平面上的点为 S(Sx, Sy, Sz, 1). 其中我们设置向量 N(A, B, C, D). 现在我们需要求的是矩阵M, 使得 MP = S. 即 M左乘点P得到点S.
由于点S是P沿着光的方向L到达的, 所以可假设 S = P + kL. (k >= 0)
因为点S是平面上的一点, 所以 A*Sx + B*Sy + C*Sz + D = 0. 即 S*N = 0. 由于 S = P + kL, 所以 (P + kL) * N = 0, 推导可得出 k = -(P*N)/L*N
即 K = -(A*Px + B*Py + C*Pz + D)/(A*Lx + B*Ly + C*Lz), 代入 S = P + kL
Sx = Px + k*Lx = Px - (A*Px + B*Py + C*Pz + D)*lX/(A*Lx + B*Ly + C*Lz)
= [Px*(B*Ly + C*Lz) - Py*(B*Lx) - Px*(C*Lx) - 1*D*Lx]/(A*Lx + B*Ly + C*Lz)
= P*((B*Ly + C*Lz), -B*Lx, -C*Lx, -D*Lx)/(A*Lx + B*Ly + C*Lz)
同理
Sy = P*(-A*Ly, (A*Lx + C*Lz), -C*Ly, -D*Ly)/(A*Lx + B*Ly + C*Lz)
Sz = P*(-A*Lz, -B*Lz, (A*LX + B*Ly), -D*Lx)/(A*Lx + B*Ly + C*Lz)
Sw = P*(0, 0, 0, (A*Lx + B*Ly + C*Lz))/(A*Lx + B*Ly + C*Lz)
所以可得到矩阵M
2 {
3 // These just make the code below easier to read. They will be
4 // removed by the optimizer.
5 float a = planeEq[0];
6 float b = planeEq[1];
7 float c = planeEq[2];
8 float d = planeEq[3];
9
10 float dx = -vLightPos[0];
11 float dy = -vLightPos[1];
12 float dz = -vLightPos[2];
13
14 // Now build the projection matrix
15 proj[0] = b * dy + c * dz;
16 proj[1] = -a * dy;
17 proj[2] = -a * dz;
18 proj[3] = 0.0;
19
20 proj[4] = -b * dx;
21 proj[5] = a * dx + c * dz;
22 proj[6] = -b * dz;
23 proj[7] = 0.0;
24
25 proj[8] = -c * dx;
26 proj[9] = -c * dy;
27 proj[10] = a * dx + b * dy;
28 proj[11] = 0.0;
29
30 proj[12] = -d * dx;
31 proj[13] = -d * dy;
32 proj[14] = -d * dz;
33 proj[15] = a * dx + b * dy + c * dz;
34 // Shadow matrix ready
35 }
- OpenGL: 平面阴影投射矩阵的推导
- OpenGL: 视图矩阵的推导
- OpenGL: 视图矩阵的推导
- OpenGL投影矩阵的推导
- OpenGL: 视图矩阵的推导
- 投影矩阵的推导(OpenGl)
- OpenGL 投影矩阵的推导
- OpenGL 投影矩阵的推导
- 3D光照阴影 平面阴影矩阵推导及代码实现
- DirectX中阴影矩阵的推导过程
- D3DXMatrixShadow创建一个平面的阴影矩阵
- D3DXMatrixShadow创建一个平面的阴影矩阵
- OpenGL中投影矩阵的推导
- OpenGL学习脚印: 投影矩阵的推导
- OpenGL投影矩阵的推导过程
- openGL中投影矩阵的推导
- OpenGL投影矩阵推导
- OpenGL: 3D中投影矩阵公式的推导
- Perl开发者必须了解的14个资源
- 人心本无染,心静自然清 ——赞“落梅”
- 巩俐挽老总现身捞金 与人打招呼无架子
- 不使用引擎,如何开发游戏
- 杭电 1008 Elevator
- OpenGL: 平面阴影投射矩阵的推导
- Android NavigationBar中虚拟键调查
- linux grep命令
- mysql存储过程
- 利用观察者模式实现通知
- [IOS]TableView Cell重用机制及TableView方法说明
- css div的水平、垂直同时居中
- Struts2 使用annotation从action跳转到action并传递参数
- 第六周作业