引言
这一节的作业主要是为了引导大家配置环境,并学习Eigen库的矩阵、向量等操作。本篇帖子用来记录一下我的心路历程和最终代码。
环境配置
①先来说一下我在环境配置上吃的苦,我本身装有VMware虚拟机,内核用的是Ubuntu,考虑到Linux在搞开发上的优越性,我打算用这个完成图形学作业,但是真的太太太麻烦了!闫老师那边已经给了Virtual Box和内核,所以真正用Linux并且配置环境的帖子很少!比较有参考性的一个博主的博客我放在这里,该博主的配置时间比较新,对于以后还想尝试环境配置的同学应该会很有帮助:
pa0环境:
【GAMES101闫令琪图形学】作业0(配置开发环境)_hans774882968的博客-CSDN博客_games101 作业0
pa1环境:
【GAMES101闫令琪图形学】作业1(配置opencv4.5.4,并解决常见错误)_hans774882968的博客-CSDN博客
在Windows系统下的环境配置可参考:
https://zhuanlan.zhihu.com/p/259208999
以上方法我都尝试过,Linux上的问题在于我在安装OpenCV(这属于pa1了)时,无法下载相关依赖包,下载总是报错说某些依赖包的依赖有错,反复百度无果,遂放弃;Windows上其实已经接近成功了,但是下载完Eigen、CMake、OpenCV之后无法再头文件正确引用(猜测是系统路径或者是VSCode的json文件没有配置好,我觉得后续有可能修复好)。在我走投无路之时,我寻思干脆就用老师的吧,大不了就是多点内存,下完——真香!求各位还在环境中挣扎的,牺牲空间换时间吧,真的很好用。这里给出对应的百度网盘,以及作业论坛中关于虚拟机相关问题的帖子:
链接:百度网盘 请输入提取码 密码:92c9
未压缩的虚拟机百度云链接发布公告 – 计算机图形学与混合现实研讨会
代码
第一部分:
关于 Matrix 的使用样例展示了如何定一个三维浮点矩阵进行输出,请自行根据注释与 Vector 部分的经验探索矩阵加减、数乘、矩阵乘法、矩阵乘向量的用法。
这部分理解向量和矩阵的计算方式即可写出,主要在于熟悉Eigen库,这里给出一个关于Eigen库许多操作的链接,以便后续学习:
Eigen学习(五)块操作_Fearless的博客-CSDN博客_eigen块操作
#include<cmath>
#include<eigen3/Eigen/Core>
#include<eigen3/Eigen/Dense>
#include<iostream>
int main(){
// Basic Example of cpp
std::cout << "Example of cpp \n";
float a = 1.0, b = 2.0;
std::cout << a << std::endl;
std::cout << a/b << std::endl;
std::cout << std::sqrt(b) << std::endl;
std::cout << std::acos(-1) << std::endl;
std::cout << std::sin(30.0/180.0*acos(-1)) << std::endl;
// Example of vector
std::cout << "Example of vector \n";
// vector definition
Eigen::Vector3f v(1.0f,2.0f,3.0f);
Eigen::Vector3f w(1.0f,0.0f,0.0f);
// vector output
std::cout << "Example of output \n";
std::cout << v << std::endl;
// vector add
std::cout << "Example of add \n";
std::cout << v + w << std::endl;
// vector scalar multiply
std::cout << "Example of scalar multiply \n";
std::cout << v * 3.0f << std::endl;
std::cout << 2.0f * v << std::endl;
//vector dot product
std::cout << "Example of dot product \n";
std::cout << v.transpose()*w << std::endl;
// Example of matrix
std::cout << "Example of matrix \n";
// matrix definition
Eigen::Matrix3f i,j;
i << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0;
j << 2.0, 3.0, 1.0, 4.0, 6.0, 5.0, 9.0, 7.0, 8.0;
// matrix output
std::cout << "Example of output \n";
std::cout << i << std::endl;
// matrix add i + j
std::cout << "Example of matrix add \n";
std::cout << i+j <<std::endl;
// matrix scalar multiply i * 2.0
std::cout << "Example of scalar multiply \n";
std::cout << i * 2.0f << std:: endl;
// matrix multiply i * j
std::cout << "Example of matrix multiply \n";
std::cout << i*j << std::endl;
// matrix multiply vector i * v
std::cout << "Example of matrix multiply vector \n";
std::cout << i*v <<std::endl;
return 0;
}
第二部分:
给定一个点 P =(2,1) , 将该点绕原点先逆时针旋转 45 ◦ ,再平移 (1,2), 计算出变换后点的坐标(要求用齐次坐标进行计算)。
#include<iostream>
#include<cmath>
#include<eigen3/Eigen/Core>
#include<eigen3/Eigen/Dense>
int main(){
Eigen::Vector3f p(2.0f,1.0f,1.0f);
Eigen::Matrix3f rou;
rou<< cos(45.0/180*acos(-1)),-sin(45.0/180*acos(-1)),1.0,
sin(45.0/180*acos(-1)),cos(45.0/180*acos(-1)),2.0,
0.0,0.0,1.0;
Eigen::Vector3f q;
q = rou*p;
std::cout<<"旋转矩阵"<<std::endl;
std::cout<<rou<<std::endl;
std::cout<<"被操作向量"<<std::endl;
std::cout<<p<<std::endl;
std::cout<<"乘积结果"<<std::endl;
std::cout<<q<<std::endl;
return 0;
}