games101作业1

本文介绍了如何使用Eigen库在C++中实现三维空间中绕Z轴的旋转矩阵和透视投影矩阵。get_model_matrix函数关注于Z轴旋转,而get_projection_matrix函数涉及透视到正交变换和正交投影,用于设置视口和深度范围。代码示例展示了如何构建这些矩阵并应用于图形渲染。
摘要由CSDN通过智能技术生成

作业1的大致要求就是让我们实现如下两个函数,一个是返回在三维空间中绕着Z轴旋转的矩阵,另一个是返回投影矩阵。正确完成这两个函数之后,运行代码你就会在窗口中看到一个三角形,并且按a键和d键会发生旋转。

在这里插入图片描述

首先来实现get_model_matrix函数,在这个函数里只需要写出绕着Z轴旋转的旋转矩阵就行,下图是物体绕着X,Y,Z轴旋转的旋转矩阵公式

在这里插入图片描述
根据旋转矩阵的公式就可以直接写出对应的旋转矩阵,代码如下:

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 angle = rotation_angle/180*acos(-1);
    //创建旋转矩阵
    model << cos(angle),-sin(angle),0,0,
        sin(angle),cos(angle),0,0,
        0,0,1,0,
        0,0,0,1;
    return model;
}

接着实现get_projection_matrix函数,在这个函数里需要创建透视投影矩阵。创建透视投影矩阵的过程是将透视变换为正交,在进行正交投影即可。该函数提供的参数eye_fov表示垂直可视角度,aspect_ratio表示宽高比,zNear表示相机与近平面的距离,zFar表示相机与远平面的距离。

  • 透视变正交
    矩阵公式如下:
    在这里插入图片描述

  • 正交投影矩阵
    公式如下(先平移在缩放):
    在这里插入图片描述

    公式里面参数的意义如下:
    在这里插入图片描述

    在这里需要注意的是透视变为正交之后,本例中的 l 和 r、t 和 b是关于原点对称的,所以公式中的 l + r = 0,t + b = 0,相当于沿着 Z 轴平移。

代码如下:

//返回透视投影矩阵
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 m = Eigen::Matrix4f::Identity();;
    m << zNear,0,0,0,
        0,zNear,0,0,
        0,0,zNear+zFar,-zNear*zFar,
        0,0,1,0;
    
    //创建正交投影矩阵
    Eigen::Matrix4f q1 = Eigen::Matrix4f::Identity(),q2 = Eigen::Matrix4f::Identity();

    float top = tan(eye_fov/2/180*acos(-1)) * -zNear
    float bottom = -top;
    float right = top * aspect_ratio;
    float left = -right;
    //缩放
    q1 << 2.0/(right - left),0,0,0,
        0,2.0/(top - bottom),0,0,
        0,0,2.0/(zNear - zFar),0,
        0,0,0,1;

    //平移
    q2 << 1,0,0,-(right+left)/2.0,
        0,1,0,-(top+bottom)/2.0,
        0,0,1,-(zNear+zFar)/2.0,
        0,0,0,1;

    projection = q1 * q2 * m;

    return projection;
}

默认结果如下:
在这里插入图片描述

按了三下d结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

译制片~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值