???????课程链接
???????学霸笔记
???????绕 Z 轴旋转很简单,如果希望旋转方向相反,将 alpha 换为 -alpha 即可
Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
float angle = rotation_angle * M_PI / 180.0;
model << cos(angle), sin(angle), 0, 0,
-sin(angle), cos(angle), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1;
return model;
}
???????透视投影求解为
M
p
e
r
s
p
=
M
o
r
t
h
o
?
M
p
e
r
s
p
?
>
o
r
t
h
o
M_{persp}=M_{ortho}*M_{persp->ortho}
Mpersp?=Mortho??Mpersp?>ortho?
???????其中
M
o
r
t
h
o
M_{ortho}
Mortho? 为:
???????我们忽略掉第二个矩阵(平移操作),同时摄像机上方为 Y 轴正方向(如果与你显示的不一致,就将 Y 轴翻转即可)
???????其中
M
p
e
r
s
p
?
>
o
r
t
h
o
M_{persp->ortho}
Mpersp?>ortho? 为: ???????现在来看函数结构:
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio, float zNear, float zFar)
???????其中 eye_fov 是视广角的对角,aspect_ratio 是纵横比,根据视广角和纵横比,可以计算水平和垂直方向的视广角,计算思路。
???????而 zNear 和 zFar 分别对应 n 和 f。根据视广角,n 和 f 也就可以计算出 l,r 和 b,t。
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
float zNear, float zFar)
{
Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
Eigen::Matrix4f persp_ortho = Eigen::Matrix4f::Identity();
Eigen::Matrix4f ortho = Eigen::Matrix4f::Identity();
float n = zNear, f = zFar;
persp_ortho << n, 0, 0, 0,
0, n, 0, 0,
0, 0, n + f, -n * f,
0, 0, 1, 0;
float tb = tan(eye_fov * M_PI / 2.0 / 180.0) * cos(atan(aspect_ratio)) * fabs(zNear) * 2;
float rl = tb / aspect_ratio;
float nf = zNear - zFar;
ortho << 2.0 / rl, 0, 0, 0,
0, -2.0 / tb, 0, 0,
0, 0, 2.0 / nf, 0,
0, 0, 0, 1;
projection = ortho * persp_ortho;
return projection;
}
???????根据题目描述,是一个
v
0
(
2.0
,
0.0
,
?
2.0
)
,
v
1
(
0.0
,
2.0
,
?
2.0
)
,
v
2
(
?
2.0
,
0.0
,
?
2.0
)
v_{0}(2.0,0.0,-2.0), v_{1}(0.0,2.0,-2.0), v_{2}(-2.0,0.0,-2.0)
v0?(2.0,0.0,?2.0),v1?(0.0,2.0,?2.0),v2?(?2.0,0.0,?2.0) 的三角形。同时,设置 A 操作逆时针旋转,D 操作顺时针旋转。
???????最后,话说 C++ 有无角度转弧度制的函数?
|