hw2

在屏幕上画出一个实心三角形.
相较于hw1,多了一些内容,需要好好看下框架.

判断$(x,y)$对应的pixel否在三角形内部.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
static bool insideTriangle(int x, int y, const Vector3f* _v)

{
// TODO : Implement this function to check if the point (x, y) is inside the triangle represented by _v[0], _v[1], _v[2]
Vector2f vertex2p[3], vertex2vertex[3];
int i;
//储存顶点到测试点的向量
for (i = 0;i < 3;i++) {
vertex2p[i] << x - _v[i].x(), y - _v[i].y();
}
//储存顶点到顶点之间的向量
for (i = 0;i < 3;i++) {
vertex2vertex[i] << _v[(i + 1) % 3].x() - _v[i].x(), _v[(i + 1) % 3].y() - _v[i].y();
}
//计算叉乘法.
int result[3];
for (i = 0;i < 3;i++) {
result[i] = vertex2vertex[i].x()*vertex2p[i].y()
-vertex2vertex[i].y()*vertex2p[i].x();
}
if(result[0]>0 && result[1]>0 && result[2]>0){
return true;
}
else if(result[0]<0 && result[1]<0 && result[2]<0){
return true;
}
else{
return false;
}

}

先限定下founding box范围,提高效率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void rst::rasterizer::rasterize_triangle(const Triangle& t) {
auto v = t.toVector4();

// TODO : Find out the bounding box of current triangle.
// iterate through the pixel and find if the current pixel is inside the triangle
float xmin,ymin,xmax,ymax;
xmin=std::min(std::min(v[0].x(),v[1].x()),v[2].x());
ymin=std::min(std::min(v[0].y(),v[1].y()),v[2].y());
xmax=std::max(std::max(v[0].x(),v[1].x()),v[2].x());
ymax=std::max(std::max(v[0].y(),v[1].y()),v[2].y());
xmin=std::floor(xmin);
xmax=std::ceil(xmax);
ymin=std::floor(ymin);
ymax=std::ceil(ymax);

for(int x=xmin;x<=xmax;x++){
for(int y=ymin;y<=ymax;y++){
if(insideTriangle(x+0.5,y+0.5,t.v)){
// If so, use the following code to get the interpolated z value.
auto[alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);
float w_reciprocal = 1.0/(alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
z_interpolated *= w_reciprocal;
// TODO : set the current pixel (use the set_pixel function) to the color of the triangle (use getColor function) if it should be painted.
if (z_interpolated<depth_buf[get_index(x,y)]){
set_pixel(Vector3f(x,y,z_interpolated),t.getColor());
depth_buf[get_index(x,y)]=z_interpolated;
}
}
}
}

阅读更多

hw1

总的来说,hw1是比较简单的.
本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵,只要记得上课时候给的公式,写进去就行.

  • 旋转矩阵
    注意,cos,sin等,需要的参数为弧度制(rad),而不是角度制
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Eigen::Matrix4f get_model_matrix(float rotation_angle) {
    Eigen::Matrix4f model = Eigen::Matrix4f::Identity();

    // TODO: Implement this function
    // Create the model matrix for rotating the triangle around the Z axis.
    // Then return it.
    rotation_angle = rotation_angle / 180 * MY_PI;
    Eigen::Matrix4f rotate;
    rotate << cos(rotation_angle), -sin(rotation_angle), 0, 0,
    sin(rotation_angle), cos(rotation_angle), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1;
    model = rotate * model;
    return model;
    }

先进行挤压,再进行正交投影得到结果

  • persp2ortho

    • 透视投影到正交投影的变化矩阵
  • ortho

    • 正交矩阵
      projection = ortho * persp2ortho * projection;
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      Eigen::Matrix4f get_projection_matrix(float eye_fov,
      float aspect_ratio,
      float zNear,
      float zFar) {
      // Students will implement this function

      Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();

      // TODO: Implement this function
      // Create the projection matrix for the given parameters.
      // Then return it.
      Eigen::Matrix4f persp2ortho = Eigen::Matrix4f::Identity();
      Eigen::Matrix4f ortho = Eigen::Matrix4f::Identity();

      float top = abs(zNear) * tan(eye_fov / 2 / 180 * MY_PI);
      float bottom = -top;
      float right = top * aspect_ratio;
      float left = -right;

      persp2ortho << zNear, 0, 0, 0, 0, zNear, 0, 0, 0, 0, zNear + zFar,
      -zNear * zFar, 0, 0, 1, 0;

      ortho << 2 / (right - left), 0, 0, -(right + left) / (right - left), 0,
      2 / (top - bottom), 0, -(top + bottom) / (top - bottom), 0, 0,
      2 / (zNear - zFar), -(zNear + zFar) / (zNear - zFar), 0, 0, 0, 1;

      projection = ortho * persp2ortho * projection;
      return projection;
      }

最后得到的结果与官方答案不同,图形倒转了.这是zNear值导致的.
根据课上的内容,看向的是Z轴负半轴,Z<0; 而代码中,看向Z正半轴,Z>0;

小问题懒得修改了.

顺便学习了一下cmake的相关知识
[[07archive/tech/cmake|cmake]]

阅读更多

Zettelkasten flow

把感兴趣或者觉得自己将来会用到的笔记收集起来,然后用一种标准化的方式去处理这些笔记,建立笔记之间的*联系*
*连接*is every thing
大脑:专注于创造,思考
卡片盒:储存细节和参考资料

我应该把zk部分放在哪里呢?

用卡片盒方法做笔记写论文的流程

  • 做临时笔记。 写在diary里面,主要白天微博阅读的内容,自己的一些想法

  • 做文献笔记。读书时候的highlights和notes,导入到highlights文件夹下

  • 做永久笔记。找到碎片化笔记之间的联系,找到一个主题,输出东西

每个笔记只包含一个想法,记笔记的时候要像写给别人看的一样:用整句话,解释来源,参考了什么,用词尽量准确、简单、清晰。做完之后,就可以把第一步的瞬时笔记扔掉,把第二步的文献笔记放进你的文献管理系统。你现在可以把它们忘掉了。所有重要的东西已经在你的卡片箱里了。

  1. 把永久笔记放到你的卡片盒。注意点:1)把新笔记放在相关笔记的旁边;2)添加相关笔记的链接;3)要确保你可以重新找到这条笔记(可以做一个索引卡,上面列出所有相关的笔记)。
  2. 构建主题。从你的笔记中地构建出你写作的主题、研究的问题等等。
  3. 撰写草稿。把你的笔记转写成一个文章的草稿。
  4. 修改润色。重读草稿,润色。重复。

卡片盒所遵循的几个原则:

  1. 所有的思考都是在写的过程中发生的。写是唯一重要的事情。
  2. 没有人的写作是从零开始的,你的笔记就是你做的准备。
  3. 不要从上到下给你的笔记分类,而是从下往上(bottom-up)慢慢归纳出你的主题分类。
  4. 工具不会改变你的流程,工具只是帮你把你的流程更顺利地运转下去。

my conclusion

在实践书中这套工作流程时,给自己更多的耐心,在学习和实践方面交替进行多次
![[02literature/book/卡片笔记写作法:如何实现从阅读到写作#^9c11d4]]
用自下而上的流程
整理[[02literature/book/卡片笔记写作法:如何实现从阅读到写作]]笔记
记忆有两块:提取强度与储存强度。加强联系提升前者,加强记忆提升后者。具体手段是,zk与anki

阅读更多

markdown

Markdown语言入门

html语法在markdown中也能用

标题1

标题2

标题3

标题4

标题5
标题6

粗体文本粗体文本
斜体文本斜体文本
删除线文本

无序

阅读更多

latex

refering

数学模式

行内与行间

排版有所不同,行内更适合短式子,行间更适合长式子或者公式推导

  • 行内公式
    ${f(x)=anx^n+a{n-1}x^{n-1}+a_{n-2}x^{n-2}}+\cdots$

  • 行间公式

输入上下标

^ 表示上标, _ 表示下标。
$\sum_i^na_i$

1
$\sum_i^na_i$

除法

阅读更多

102

Lec1 课程介绍

GAMES:Graphics And Mixed Environment Symposium

101偏渲染
201偏动画
102偏建模

图像是由像素表达的离散的点
图形是具有数学表达的几何对象,矢量图

光栅化

文字都是矢量图,不论怎么放大都是清晰的
储存的是点线的坐标,在经过重新计算之后,会清晰的呈现出来

渲染

光的计算科学

  1. 光源
  2. 几何
  3. 纹理
  4. 材质

仿真

阅读更多

配置环境

环境配置

难绷,论坛上给的虚拟机是ubuntu18 并且是virtual box的版本.
想用vmware虚拟机跑.将vdi格式转化为vmdk,并创建对应的虚拟机.
问题在于VMware tools安装失败.每次安装完成之后,再reboot,就会变成没有VMware tools…搞不懂.
还是在windows上配置环境算了…

看了下windows配置eigen和opencv有点麻烦,选择换成虚拟机ubuntu20.04LTS自己配置


更新
breaking news!
官方给的虚拟机,转换为vmware之后,vmwaretools安装成功了…
直接用就行了.配置环境结束.

ubuntu具体设置

参考

遇上vscode编译时候报错

1
/usr/bin/gcc -fdiagnostics-color=always -g /home/l4rk/games101/pa0.c -o /home/l4rk/games101/pa0 /usr/bin/ld: /tmp/ccjPHxdQ.o: in function `main': /home/l4rk/games101/pa0.c:6: undefined reference to `sin' collect2: error: ld returned 1 exit status

阅读更多