比特微 计算机基础知识 压制组装机 微信商家收款 人脸识别 excel terminal ionic framework underscorejs 后台管理界面模板 后台管理网页模板 后台页面模板 git视频 bootstrap文件上传样式 matlab读入图片 python运行环境 python随机数 python生成随机数 python对象 python图形化编程 python开发界面 python写入txt文件 java基础入门 java时间格式 java文件复制 python源码下载 广告代码 路由器有辐射吗 jb51 东方头条邀请码 相机权限 maya2008 手机知识 怎么设置迅雷为默认下载器 js跳出for循环 苹果x银色 pr视频加速 ps从入门到精通 php小数点保留2位 ppt格式刷怎么用
当前位置: 首页 > 学习教程  > 编程语言

Games101 pa1 构建模型变换,和透视投影矩阵

2021/1/28 23:51:32 文章标签:

知识总结:变换的流程 (1) 模型变换,pa中模型只绕z轴旋转 (2)视图变换,作用是调整摄像机的位置 (3)投影变换,pa中要求是透视投影,透视投影可看成挤…

知识总结:变换的流程
(1) 模型变换,pa中模型只绕z轴旋转
(2)视图变换,作用是调整摄像机的位置
(3)投影变换,pa中要求是透视投影,透视投影可看成挤压 + 正交变换

代码分析:
(1)获得视图变换矩阵(main.cpp)
视图变换的作用是移动摄像机,可看成是物体的反向移动

Eigen::Matrix4f get_view_matrix(Eigen::Vector3f p/;eye_pos)
{
    Eigen::Matrix4f view = Eigen::Matrix4f::Identity();//4*4单位矩阵
    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;
}

(2)模型变换矩阵,效果是使模型绕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.
    Eigen::Matrix4f R;
    R << cos(rotation_angle),sin(rotation_angle), 0, 0,sin(rotation_angle), cos(rotation_angle), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1;
    return R;
    
    return model;
}

(3)构建透视投影矩阵
光看课程还有很多细节没太清楚…包括get_projection_matrix这个函数的参数是什么意思pdf上也没有解释…图形学新手废了好大劲,主要参考了一个大佬的文章
参考文章
总之,透视投影可看成是挤压 + 正交投影(平移+缩放)
难度集中在挤压矩阵persp2ortho的构建上,为此需要注意:
1、近平面上的点都x,y,z都不会变 2、远平面上的点z不会变
其余的点遵循相似三角形的原理,解方程组可得到矩阵
在这里插入图片描述

Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
                                      float zNear, float zFar)
{
    Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
    Eigen::Matrix4f persp2ortho = Eigen::Matrix4f::Identity();
    persp2ortho << zNear, 0, 0, 0,
            0, zNear, 0, 0,
            0, 0, zNear + zFar, -zNear * zFar,
            0, 0, 1, 0;

    double halfEyeRadian = eye_fov * MY_PI / 2 / 180.0;
    double top = zNear * tan(halfEyeRadian);
    double bottom = -top;
    double right = top * aspect_ratio;
    double left = -right;

    Eigen::Matrix4f orthoScale = Eigen::Matrix4f::Identity();
    orthoScale << 2 / (right - left), 0, 0, 0,
            0, 2 / (top - bottom), 0, 0,
            0, 0, 2 / (zNear - zFar), 0,
            0, 0, 0, 1;

    Eigen::Matrix4f orthoTrans = Eigen::Matrix4f::Identity();
    orthoTrans << 1, 0, 0, -(right + left) / 2,
            0, 1, 0, -(top + bottom) / 2,
            0, 0, 1, -(zNear + zFar) / 2,
            0, 0, 0, 1;

    Eigen::Matrix4f matrixOrtho = orthoScale * orthoTrans;

    projection = matrixOrtho * persp2ortho;

    return projection;
}

效果:
在这里插入图片描述
具体的过程还有一些细节都还不是很清楚…


本文链接: http://www.dtmao.cc/news_show_650303.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?