Triangle类分析

Triangle.h代码如下:

//
// Created by LEI XU on 4/11/19.
//

#ifndef RASTERIZER_TRIANGLE_H
#define RASTERIZER_TRIANGLE_H

#include <eigen3/Eigen/Eigen>

using namespace Eigen;
class Triangle{

public:
    //逆时针
    Vector3f v[3]; /*the original coordinates of the triangle, v0, v1, v2 in counter clockwise order*/
    /*Per vertex values*/
    Vector3f color[3]; //color at each vertex;
    Vector2f tex_coords[3]; //texture u,v
    Vector3f normal[3]; //normal vector for each vertex

    //Texture *tex;
    Triangle();

    //设置三角形某个顶点的坐标
    void setVertex(int ind, Vector3f ver); /*set i-th vertex coordinates */
    void setNormal(int ind, Vector3f n); /*set i-th vertex normal vector*/
    void setColor(int ind, float r, float g, float b); /*set i-th vertex color*/
    Vector3f getColor() const { return color[0]*255; } // Only one color per triangle.
    void setTexCoord(int ind, float s, float t); /*set i-th vertex texture coordinate*/
    //将三角形三个顶点转换为齐次坐标
    std::array<Vector4f, 3> toVector4() const;
};

#endif //RASTERIZER_TRIANGLE_H
  • v是存储三个顶点的直角坐标的数组,逆时针

  • setVertex设置第i个顶点的直角坐标

  • setNormal设置第i个顶点的法向量

  • setColor设置第i个顶点的RGB颜色;

其他有些不需要深究的简化处理,比如此处默认一个三角形只有一个颜色,于是getColor仅返回第一个顶点颜色;从getColor 可以看出来color[]是一个归一化的数据,需要乘255获取真实的RGB;setTexCoord纹理坐标,用于插值,本节不深究。

toVector4的实现

toVector4的作用是将三角形顶点的直角坐标转换为齐次坐标,实现如下:

std::array<Vector4f, 3> Triangle::toVector4() const
{
    std::array<Eigen::Vector4f, 3> res;
    //将v的所有元素经lambda表达式的变换后填充到res内
    std::transform(std::begin(v), std::end(v), res.begin(), [](auto& vec) { return Eigen::Vector4f(vec.x(), vec.y(), vec.z(), 1.f); });
    return res;
}

这里主要利用std::transformv中的数据经过一系列处理后填充到res中,transform的作用是对一个序列中的元素应用某个操作(函数或 lambda),并将结果写入另一个序列中

toVector4 中,这个操作由lambda表达式定义:

[](auto& vec) { 
    return Eigen::Vector4f(vec.x(), vec.y(), vec.z(), 1.f); 
}

由于是在std::transform中,vecv中的每个元素,即每个顶点的直角坐标向量。处理后的结果是原本的坐标加上第四个元素1.f

举例如下:

Vector3f(1, 2, 3);

→ Vector4f(1, 2, 3, 1)

rasterize_triangle实现

关于这个函数的详细分析:由于后续作业对这个函数的实现更完善,切逻辑不完全相同,故在后续作业中分析。