【计算机图形学之旅】【Game101】二:Transformation Cont 和 作业0

【计算机图形学之旅】【Games101】二:Transformation Cont 和 作业0


Games101课程


提示:以下是知识点总结,详细讲解可以去看课程

一、正交投影

简而言之:
通过两个变换矩阵将立方体投影到以原点为中心的111的立方体里面


二、透视投影

  • 将远平面“压缩”成近平面
  • 要知道任意点xy的值都是只有缩放关系,但是z值有平移关系,且近平面坐标不变,远平面Z坐标不变
  • 通过远平面的的点的坐标对应关系(三角形的相似)
  • 取近平面的中心点通过 矩阵 变换还是本身
  • 求得变换矩阵

通过变换矩阵可以得到类似正交投影的立方体,然后重复正交投影的变换即可得到最终的变换矩阵


三、知识疑点

1.左手系和右手系的区别:

参考

  • Maya 和 OPenGL 使用右手坐标系, DirectX, pbrt, PRMan 使用左手坐标系。
  • 左手系:X叉乘Y是得不到Z轴,但是其Z轴越大表示越远
  • 右手系:X叉乘Y能得到Z轴,但是其Z轴越大表示越近

2.齐次坐标

参考
齐次坐标的引进就可以很方便的用矩阵表示平移


四:作业

旋转矩阵

Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
    // TODO: Implement this function
    // Create the model matrix for rotating the triangle around the Z axis.
    // Then return it.
    //初始化为单位矩阵
    Eigen::Matrix4f model = Eigen::Matrix4f::Identity();           
    //定义转换矩阵
    Eigen::Matrix4f rotation;               
    //c++中三角函数是弧度制
    double angle = rotation_angle / 180 * MY_PI;

    rotation <<
        cos(angle ), -sin(angle), 0, 0,
        sin(angle ), cos(angle), 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1;
    model = rotation * model;
    return model;
}


透视变换矩阵

Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
                                      float zNear, float zFar)
{
    // Students will implement this function
    // TODO: Implement this function
    // Create the projection matrix for the given parameters.
    // Then return it.
    Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
    
    Eigen::Matrix4f projectiveMatrix;
    Eigen::Matrix4f orthographicMatrix;

    //(透视->正交)矩阵
    projectiveMatrix << zNear, 0, 0, 0,
        0, zNear, 0, 0,
        0, 0, zNear + zFar, -zNear * zFar,
        0, 0, 1, 0;
        
    //正交变换矩阵
    //FOV是整个视锥的弧度
    float alpha = 0.5 * eye_fov * MY_PI / 180.0f;
    double w, h, z;

    h = zNear * tan(alpha ) * 2;
    w = h * aspect_ratio;
    z = zFar - zNear;

	//由于XY的坐标是对称的,故平移矩阵XY的平移量为0
	//该矩阵为两个矩阵叠加的结果
    orthographicMatrix << 
        2 / w, 0, 0, 0,
        0, 2 / h, 0, 0,
        0, 0, 2 / z, -(zFar + zNear) / 2,
        0, 0, 0, 1;


    projection = orthographicMatrix * projectiveMatrix * projection;

    return projection;
}

罗德里格斯公式

罗德里格斯公式的推导

//TODO

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值