Skip to content

Commit f810e31

Browse files
committed
add more about barycentric
1 parent 7596c72 commit f810e31

File tree

8 files changed

+58
-21
lines changed

8 files changed

+58
-21
lines changed

.vscode/settings.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"files.associations": {
3+
"random": "cpp",
4+
"cmath": "cpp"
5+
}
6+
}

Notes13.md

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,20 @@ Whitted Style: 多次递归反射, 就是在模拟光线在不断弹射的过程
6060

6161
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing7.png)
6262

63-
### 和显式表面怎么做呢?
63+
### 和显式表面求交点怎么做呢?
6464
刚才 f(xx) = 0 是一个隐式表面的几何表达形式.
6565

6666
显式表面其实是求光线和三角形面的交点.
6767

6868
PS
6969

70-
如果一个点在封闭物体内部, 不论物体形状如何, 从这个点出发任意一条射线, 与物体的交点一定是奇数
70+
如果一个点在封闭物体内部, 不论物体形状如何, 从这个点出发任意一条射线, 与物体的交点一定是奇数. 偶数的话一定是在物体外。
71+
72+
根据这个性质,可以用来判断是否在一个点是否在物体内部
73+
74+
该性质2D 3D 都满足
75+
76+
More 奇偶规则和非零缠绕规则 https://blog.csdn.net/g0ose/article/details/54933038
7177

7278
### 和三角形面的交点
7379

@@ -80,18 +86,29 @@ PS
8086

8187
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing8.png)
8288

83-
两个向量点乘是0 表示相互垂直 (p' 是平面上任意一个点)
89+
通过点法式(通过法线和一个点定义的平面)(图中左边的式子) 很容易判断一个点是不是在平面上
90+
91+
PS : 两个向量点乘是0 表示相互垂直 (p' 是平面上任意一个点)
8492

93+
More http://kjwy.5any.com/gdsx22/content/ch01/gdsx070501.htm
8594

86-
和前面和球球交点问题一样, 交点即在平面上 有在光线上. 因此两个公式都满足.
95+
和前面和球球交点问题一样, 交点即在平面上 又在光线上. 因此两个公式都满足.
8796
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing9.png)
8897

98+
之后判断点是否在三角形内(之前在点乘的时候介绍过方法)
99+
100+
89101
### 上面的方式是先和平面求交点, 再判断是否在三角形内. 有么有更加直接的办法呢?
90102
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/raytracing10.png)
91103

92-
注意公式中的 1 - b1 -b2 , 点既然在三角形内, 那么这个点可以使用中心坐标去表示. (重心坐标的一个性质就是 b1+ b2 + b3 = 1)
104+
MT 算法, 如果有解(满足 t > 0 && b1 >0 && b2 >0 && 1 - b0 - b2 > 0 ),得到的结果是一个重心坐标。
105+
106+
注意公式中的 1 - b1 -b2 , 点既然在三角形内, 那么这个点可以使用重心坐标去表示. (重心坐标的一个性质就是 b1+ b2 + b3 = 1)
107+
108+
剩下的部分就是解方程组了
93109

94-
剩下的部分就是接方程组了
110+
图中底下一大串是用来判断方程组是否有解
111+
More 克莱姆法则 https://zh.wikipedia.org/wiki/%E5%85%8B%E8%90%8A%E5%A7%86%E6%B3%95%E5%89%87
95112

96113

97114
## AABB 轴对齐包围盒

Notes7.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/zbuffer.jpg)
1717

1818

19-
O(n) 的计算深度的方法 每个物体诸葛遍历, 每个像素取最近的那个
19+
O(n) 的计算深度的方法 每个物体逐个遍历, 每个像素取最近的那个
2020

2121
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/zbuffer2.jpg)
2222

Notes9.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88

99
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/barycentric1.jpg)
1010

11-
求解
12-
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/barycentric2.jpg)
1311

14-
这里还可以看 [重心坐标](https://zhuanlan.zhihu.com/p/58199366)
12+
这里还可以看
13+
[重心坐标](https://zhuanlan.zhihu.com/p/58199366)
14+
15+
[重心坐标](https://zhuanlan.zhihu.com/p/65495373)
1516

1617
### 几何性质
1718

@@ -21,7 +22,7 @@
2122

2223
那么三角形重心的 重心坐标就是 α β γ 都等于 1/3 的时候, 也就是三个划分的三角形面积相同的时候.
2324

24-
![image](https://raw.githubusercontent.com/lumixraku/NotesForGraphics/master/images/barycentric2.jpg)
25+
2526

2627

2728
### 用途
@@ -34,6 +35,12 @@
3435
https://zhuanlan.zhihu.com/p/65495373
3536
在图形学中,利用重心坐标在三角形内部进行任何属性(位置、纹理坐标、颜色、法线、深度、材质属性..)的插值。一般我们通过其他步骤都会得到三角形顶点上的属性,但继续计算时需要用到三角形内部的某点的属性值,利用重心坐标可以得到三角形内部该值的平滑过渡。
3637

38+
打比方说,P1处纹理坐标为texcoord1,P2处为texcoord2,P3处为texcoord3,则P处纹理坐标就是 `texcoord=w1*texcoord1+w2*texcoord2+w3*texcoord3`
39+
40+
Read More
41+
42+
43+
3744

3845
## 纹理的应用
3946

task3/MyTask3/task3.xcodeproj/xcuserdata/lilin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@
77
<BreakpointProxy
88
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
99
<BreakpointContent
10-
uuid = "932C94A1-C619-4507-BE92-1AB99E1199A4"
10+
uuid = "0AC2C45A-3BF8-40AE-ADD4-F40FC9B67781"
1111
shouldBeEnabled = "No"
1212
ignoreCount = "0"
1313
continueAfterRunningActions = "No"
14-
filePath = "task3/main.cpp"
14+
filePath = "task3/rasterizer.cpp"
1515
startingColumnNumber = "9223372036854775807"
1616
endingColumnNumber = "9223372036854775807"
17-
startingLineNumber = "186"
18-
endingLineNumber = "186"
19-
landmarkName = "phong_fragment_shader(payload)"
20-
landmarkType = "9">
17+
startingLineNumber = "328"
18+
endingLineNumber = "328"
19+
landmarkName = "rst::rasterizer::rasterize_triangle(t, view_pos)"
20+
landmarkType = "7">
2121
</BreakpointContent>
2222
</BreakpointProxy>
2323
</Breakpoints>

task3/MyTask3/task3/rasterizer.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ void rst::rasterizer::rasterize_triangle(const Triangle& t, const std::array<Eig
273273
//Vector3f normal[3]; //normal vector for each vertex
274274

275275
//经过之前的处理后,传入三角形screen_space的坐标t.v以及viewspace的顶点坐标。
276-
auto v = t.toVector4();
276+
auto v = t.toVector4(); // w 是第四个分量 也就是 x y z w 齐次坐标
277277
int xmin = 0;
278278
int xmax = 0;
279279
int ymin = 0;
@@ -294,6 +294,9 @@ void rst::rasterizer::rasterize_triangle(const Triangle& t, const std::array<Eig
294294
xmax = xmaxf +1;
295295
ymin = yminf;
296296
ymax = ymaxf +1;
297+
298+
// xmin ~ xmax 表示三角形的点x 的变化范围。
299+
// xmin xmax ymin ymax 构成了三角形包围盒
297300

298301
// TODO: From your HW3, get the triangle rasterization code.
299302
// TODO: Inside your rasterization loop:
@@ -312,15 +315,19 @@ void rst::rasterizer::rasterize_triangle(const Triangle& t, const std::array<Eig
312315
if(insideTriangle(i+0.5,j+0.5,t.v))
313316
{
314317
//Depth interpolated
315-
auto[alpha, beta, gamma] = computeBarycentric2D(i, j, t.v);
318+
// alpha, beta, gamma 都是 float。表示重心坐标的系数 点p = alpha*V1 + beta*V2 + gamma*V3
319+
auto[alpha, beta, gamma] = computeBarycentric2D(i, j, t.v); // t.v 表示三角形的三个顶点 是一个数组
316320

317-
float Z = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
321+
// .w 分量是 1
322+
// 这是一个理论上就是 1 的值 (因为重心坐标各个系数之和就是 1) // 实际上因为存在误差, Z 是一个特别接近于1 的值, 同理因为误差 alpha + beta + gamma 也不是1 而是十分接近1 的值
323+
float Z = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
324+
318325
float zp = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
319326
zp*=Z;
320327

321328
if(zp < depth_buf[get_index(i,j)])
322329
{
323-
depth_buf[get_index(i,j)] = zp;
330+
depth_buf[get_index(i,j)] = zp;// 深度信息 总是取最小值 也就是离的越近??
324331
auto interpolated_color = interpolate(alpha, beta, gamma, t.color[0], t.color[1], t.color[2], 1);
325332
auto interpolated_normal = interpolate(alpha, beta, gamma,t.normal[0],t.normal[1],t.normal[2],1).normalized();
326333
auto interpolated_texcoords = interpolate(alpha, beta, gamma,t.tex_coords[0],t.tex_coords[1],t.tex_coords[2],1);

0 commit comments

Comments
 (0)