目录
一、3D Transformations(三维变换)(续笔记02)
二、Viewing transformation(观测变换)
1、View / Camera transformation(视图/相机变换)
2、Projection transformation(投影变换)
① Orthographic projection(正交投影)
② Perspective Projection(透视投影)
一、3D Transformations(三维变换)(续笔记02)
(注意绕y轴转的矩阵与绕x轴、z轴旋转的矩阵的规律有不同!)
三维空间中旋转的矩阵表示公式:
二、Viewing transformation(观测变换)
1、View / Camera transformation(视图/相机变换)
(注意:
①View / Camera Transformation(视图变换)是进行平移再进行旋转,而笔记02中的Affine Transformations(仿射变换)是先旋转再平移
②求R逆用了特例法(X令其为[1,0,0,0]^T, Y令其为[0,1,0,0]^T, Z令其为[0,0,1,0]^T)。向量(g×t)为,向量t为
,向量-g为
。
③旋转矩阵的逆矩阵就是它的转置矩阵,就是说旋转矩阵是正交矩阵(R^(-1) = R^(T))
)
2、Projection transformation(投影变换)
① Orthographic projection(正交投影)
2D:
3D:
② Perspective Projection(透视投影)
fovY(视角),aspect ratio(宽高比):
三、作业一
写的代码:
#include "Triangle.hpp"
#include "rasterizer.hpp"
#include <eigen3/Eigen/Eigen>
#include <iostream>
#include <opencv2/opencv.hpp>
constexpr double MY_PI = 3.1415926;
Eigen::Matrix4f get_view_matrix(Eigen::Vector3f eye_pos)
{
Eigen::Matrix4f view = Eigen::Matrix4f::Identity();
Eigen::Matrix4f translate;
translate << 1, 0, 0, -eye_pos[0], 0, 1, 0, -eye_pos[1], 0, 0, 1,
-eye_pos[2], 0, 0, 0, 1;
view = translate * view;
return view;
}
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.
float r = rotation_angle/180*MY_PI;
Eigen::Matrix4f rotate;
rotate << cos(r), -sin(r), 0, 0,
sin(r), cos(r), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1;
model = rotate * model;
return model;
}
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.
zNear = -zNear;
zFar = -zFar;
float fovY = eye_fov/180*MY_PI;
float t = abs(zNear)*tan(fovY/2);
float r = aspect_ratio*t;
float l = -r;
float b = -t;
Eigen::Matrix4f translate, scale, persp2ortho;
translate << 1, 0, 0, -(l+r)/2,
0, 1, 0, -(t+b)/2,
0, 0, 1, -(zNear+zFar)/2,
0, 0, 0, 1;
scale << 2/(r-l), 0, 0, 0,
0, 2/(t-b), 0, 0,
0, 0, 2/(zNear-zFar), 0,
0, 0, 0, 1;
persp2ortho << zNear, 0, 0, 0,
0, zNear, 0, 0,
0, 0, zNear+zFar, -zNear*zFar,
0, 0, 1, 0;
projection = translate*scale*persp2ortho;
return projection;
}
成果图片:
参考:
games101——作业1_games101作业1-优快云博客
GAMES101 作业1_games101作业1-优快云博客
GAMES 101 作业 1 - Los1r - 博客园 (cnblogs.com)
Games101作业1三角形上下颠倒问题 - 知乎 (zhihu.com)
虚拟机中截图方法: