环境搭建
由于作业的提交早已经不受支持,因为本项目存在的意义就是为对计算机图形学感兴趣的朋友做一个参考,来更深入的理解闫老师的课程内容精髓所在。
推荐使用的地址:
roeas/GAMES101-Premake: 一键配置 GAMES101 作业框架及运行环境(含答案) 这是一个降低了图形学作业环境配置的,利用Windows系列系统进行学习的图形学框架,能让人将专注点放在对应的工程和技术栈之上,值得学,再次感恩作者并为作者打一个广告233.
配置好后的环境显示
- 需要自行配置的:Cmake和VS2022.(其中vs2022不必过多赘述,Cmake选择二进制文件中的Windows x64 Installer)
- 官方文档readme比较完善了,目前来看还不需要更详细的说明,根据环境要求配置即可。
作业零:熟悉cpp,cmake编译以及库Eigen
要求部分
- 给定一个点P=(2,1),将该点绕原点先逆时针旋转45◦,再平移(1,2),计算出 变换后点的坐标(要求用齐次坐标进行计算)
- 利用camke进行编译
重点
- 在这里我们使用了线性代数库Eigen进行坐标的相应变换实现。
- 进行数学的相应建模思想以及对应实现。
- 上手使用Cmake的相应功效。
具体实现
由于本作业代码量较小,采取逐步解析的方式完成。
- Step1:定义待定旋转点
Eigen::Vector3d P_h(2, 1, 1);
2.Step2:旋转 利用旋转矩阵对P点进行对应的坐标点旋转(公式如下,前式为旋转矩阵的齐次坐标点式写法(逆时针形式),带入后便为对应数值。
- 特别注意:在Eigen中计算角度时使用的是弧度制,需要转为弧度。
- 若使用Eigen,推荐都是用Eigen库中定义的常量进行对应的运算。
// 定义旋转矩阵(逆时针旋转45度)
double angle = 45.0 * EIGEN_PI / 180.0; // 将角度转换为弧度
Eigen::Matrix3d R;
R << cos(angle), -sin(angle), 0,
sin(angle), cos(angle), 0,
0, 0, 1;
3.Step3:平移 利用平移矩阵对该点进行相应的坐标移动。值得注意的是:在这一步平移当中,我们用的仍然为齐次坐标的乘法思想,将1,2加入,其中1,1部分保持原矩阵(原向量点的位置不变)。
Eigen::Matrix3d T;
T << 1, 0, 1,
0, 1, 2,
0, 0, 1;
4.Step4:变化并输出结果 依次右乘对应的矩阵,根据输出找到对应的结果即可。这里输出后进行一部分相应的笛卡尔坐标化。
Eigen::Vector3d P_h_prime = R * P_h; // 旋转
Eigen::Vector3d P_h_double_prime = T * P_h_prime; // 平移
// 输出变换后的点
std::cout << "变换后的点P''的齐次坐标为: " << std::endl;
std::cout << P_h_double_prime << std::endl;
// 转换为笛卡尔坐标
Eigen::Vector2d P_double_prime_cartesian(P_h_double_prime(0), P_h_double_prime(1));
std::cout << "变换后的点P''的笛卡尔坐标为: ("
<< P_double_prime_cartesian(0) << ", "
<< P_double_prime_cartesian(1) << ")" << std::endl;
return 0;
注意矩阵需要进行右乘操作,以及eigen库的重写方法可以直接使用这一点要注意好。
实现效果(输出结果)
变换后的点P''的齐次坐标为:
1.70711
4.12132
1
变换后的点P''的笛卡尔坐标为: (1.70711, 4.12132)
通过一个简单的线性变化实验,我们初步学习了Eigen API,为后面图形学更深入的使用做好了准备。