【GAMES101】作业2笔记记录
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::transform
将v
中的数据经过一系列处理后填充到res
中,transform的作用是对一个序列中的元素应用某个操作(函数或 lambda),并将结果写入另一个序列中。
toVector4
中,这个操作由lambda表达式定义:
[](auto& vec) {
return Eigen::Vector4f(vec.x(), vec.y(), vec.z(), 1.f);
}
由于是在std::transform
中,vec
是v
中的每个元素,即每个顶点的直角坐标向量。处理后的结果是原本的坐标加上第四个元素1.f
。
举例如下:
Vector3f(1, 2, 3);
→ Vector4f(1, 2, 3, 1)
rasterize_triangle实现
关于这个函数的详细分析:由于后续作业对这个函数的实现更完善,切逻辑不完全相同,故在后续作业中分析。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 RanranranQAQ
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果