计算机图形学入门踩坑记录1

计算机图形学入门踩坑记录1

0.前言

学习实现一个渲染器tinyrenderer,在看到第二节Lesson2的时候有一点没看懂,现记录如下, ssloy/tinyrenderer 链接: 目标github地址

1.不明白的地方

图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"头文件,报错很多,不得不全部替换掉了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值