计算机图形学入门踩坑记录1
0.前言
学习实现一个渲染器tinyrenderer,在看到第二节Lesson2的时候有一点没看懂,现记录如下, ssloy/tinyrenderer 链接: 目标github地址
1.不明白的地方
2.解析
参考来自链接: 维基百科.
意思就是当一个点(P)位于三角形中时,根据第一节图中的所示的推导,其中第一个公式对应的1-u-v对应λ1,u对应λ2,v对应λ3。
又有λ1+λ2+λ3=1。
(几何意义为点P与三角形的顶点所分割的3部分面积比例和为1)
求二元一次方程组得到u v的表达式。
文章中给出具体代码如下:
Vec3f u = cross(Vec3f(pts[2][0] - pts[0][0], pts[1][0] - pts[0][0], pts[0][0] - P[0]), Vec3f(pts[2][1] - pts[0][1], pts[1][1] - pts[0][1], pts[0][1] - P[1]));
//传入方程组的常数共6个
template <typename T> vec<3, T> cross(vec<3, T> v1, vec<3, T> v2) {
return vec<3, T>(v1.y * v2.z - v1.z * v2.y, v1.z * v2.x - v1.x * v2.z, v1.x * v2.y - v1.y * v2.x);
}
//解方程结果返回结果vec3(v=值1/值3,u=值2/值3)故后边判断了值3是否为0
Vec3f barycentric(Vec2i* pts, Vec2i P) {
Vec3f u = cross(Vec3f(pts[2][0] - pts[0][0], pts[1][0] - pts[0][0], pts[0][0] - P[0]), Vec3f(pts[2][1] - pts[0][1], pts[1][1] - pts[0][1], pts[0][1] - P[1]));
/* `pts` and `P` has integer value as coordinates
so `abs(u[2])` < 1 means `u[2]` is 0, that means
triangle is degenerate, in this case return something with negative coordinates */
if (std::abs(u[2]) < 1) return Vec3f(-1, 1, 1);//分母不为0
//返回λ1 λ2 λ3
return Vec3f(1.f - (u.x + u.y) / u.z, u.y / u.z, u.x / u.z);
}
3.不足之处
由于使用了cross函数,导致更新了"geometry.h"头文件,报错很多,不得不全部替换掉了。