games101:二,视图变换(projection、 view、 model)+ 作业1

视图变换(Viewing Transformation)

模型视图变换由四个变换合成:
M = M m o d e l ∗ M v i e w ∗ M p e r M = M_{model} * M_{view} * M_{per} M=MmodelMviewMper

模型变换(modeling tranformation)

即模型本身的旋转,平移,缩放等操作:

缩放、平移
绕坐标轴旋转
绕任意轴旋转

视口变换(viewport transformation)

在这里插入图片描述

投影变换(projection tranformation)

M p e r = M o r t h o ∗ M p e r s p − > o r t h o M_{per} = M_{ortho}*M_{persp->ortho} Mper=MorthoMpersp>ortho

正交投影变换(Orthographic Projection Transformation)

正交投影定义
正交投影示意图
因此, M o r t h o = M 缩 放 ∗ M 平 移 = M_{ortho} = M_{缩放} * M_{平移} = Mortho=MM=在这里插入图片描述

透视投影变换(Perspective Projection Transformation)

在这里插入图片描述
在这里插入图片描述,因此在这里插入图片描述
求第三行这里运用透视投影的一个性质:

可视空间,即本节第一张图的Frustum的前后面变换之后z坐标不变
即:
A n + B = n 2 An + B = n^2 An+B=n2
A f + B = f 2 Af + B = f^2 Af+B=f2
解出:A = n+f; B = −nf

因此 M p e r s p − > o r t h o = M_{persp->ortho} = Mpersp>ortho=在这里插入图片描述


最后, M p e r = M o r t h o ∗ M p e r s p − > o r t h o M_{per} = M_{ortho}*M_{persp->ortho} Mper=MorthoMpersp>ortho
在这里插入图片描述

作业1

Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
    Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
    
    Eigen::Matrix4f rotat;
    float theta = rotation_angle/180.0*M_PI;
    rotat << cos(theta), -1.0*sin(theta), 0,0,
    sin(theta), cos(theta), 0,0,
    0,0,1,0,
    0,0,0,1;
    
    model = rotat*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();
    
    float rad = (MY_PI / 180.0) * eye_fov;
    
    float tanHalfFovy = std::tan(rad / 2);
//直接用了最终公式
    projection(0,0) = 1.0 / (aspect_ratio * tanHalfFovy);
    projection(1,1) = 1.0 / (tanHalfFovy);
    projection(2,2) =  (zFar + zNear) / (zFar - zNear);
    projection(2,3) = (2.0 * zFar * zNear) / (zFar - zNear);
    projection(3,2) = 1.0;
    projection(3,3) = 0.0;
    
    return projection;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值