闫令琪GAMES101笔记 变换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闫令琪GAMES101笔记 变换相关的知识,希望对你有一定的参考价值。
参考技术A[课程链接] https://www.bilibili.com/video/BV1X7411F744
先以2D的为例
(默认旋转以0,0点开始,逆时针旋转为正)
为什么要引入齐次坐标?
因为 平移不是线性变换 ,不再能够用一个矩阵乘以原向量获得新的向量
引入齐次坐标后,就可以将仿射变换用矩阵的乘法来表示
在齐次坐标下的旋转,缩放,平移
由线性变换和平移组成的,叫做 仿射变换
对一个物体做变换后,想还原回去,只需要乘以变换矩阵的 逆矩阵
矩阵的乘法不满足交换律,所以先平移再旋转和先旋转再平移得到的结果基本不一样(不排除特殊情况)
如果该图形的左下角不在原点上,可以先平移到原点,进行线性变换,再平移回去
点和向量的表示,主要是w分量的区别
注意 在绕y轴旋转时,由于z轴叉乘x轴得到y轴, 而x轴叉乘z轴得到-y, 所以正负号有所区别
四元数的优点
缺点
GAMES101闫令琪图形学作业0(配置开发环境)
去games101往期作业汇总帖下载作业0的压缩包。作业0是让你配环境的,很简单。
操作系统:VirtualBox虚拟机,Ubuntu20.04(比课程提供的虚拟硬盘版本更高!)
安装eigen和cmake
sudo apt-get install libeigen3-dev
sudo apt-get install cmake
cmake -version // 2022年2月10日:3.16.3
如果你的代码引用头文件时写了#include <Eigen/Dense>
,那么还需要把Eigen下的所有文件和子目录复制到/usr/include。
sudo cp -r /usr/include/eigen3/Eigen /usr/include
参考:https://www.cnblogs.com/lihanwen/p/9928063.html
安装make
参考:https://www.cnblogs.com/kongbursi-2292702937/p/14863515.html
sudo apt-get update
sudo apt-get install ubuntu-make
sudo apt-get install make
安装gcc
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install gcc-multilib
注意makefile要求先安装gcc,而gcc如果没安装gcc-multilib就算没安装完全!
编译运行
代码(main.cpp)
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Dense>
#include <iostream>
#include <cmath>
using namespace std;
double deg2rad (double v)
return v / 180.0 * M_PI;
void demos()
// Basic Example of cpp
cout << "Example of cpp \\n";
float a = 1.0, b = 2.0;
cout << a << endl;
cout << a / b << endl;
cout << sqrt (b) << endl;
cout << M_PI << endl;
cout << sin (deg2rad (30.0) ) << endl;
// Example of vector
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
cout << "Example of output \\n";
cout << v << endl;
// vector add
cout << "Example of add \\n";
cout << v + w << endl;
// vector scalar multiply
cout << "Example of scalar multiply \\n";
cout << v * 3.0f << endl;
cout << 2.0f * v << endl;
// Example of matrix
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
cout << "Example of output \\n";
cout << i << endl;
// matrix add i + j
// matrix scalar multiply i * 2.0
// matrix multiply i * j
// matrix multiply vector i * v
cout << j << endl;
cout << (i * j) << endl;
void solve()
Eigen::Vector3d v (2.0, 1.0, 1.0);
Eigen::Matrix3d rot, transform;
// 绕原点逆时针转45°
const double r = deg2rad (45);
rot << cos (r), -sin (r), 0, \\
sin (r), cos (r), 0, \\
0, 0, 1;
// 平移(1,2)
transform << 1, 0, 1, \\
0, 1, 2, \\
0, 0, 1;
v = rot * v;
cout << "after rotate: " << v << endl;
v = transform * v;
cout << "after transform: " << v << endl;
int main()
demos();
solve();
return 0;
参考pa0.pdf给的命令即可,我这里很顺利。
mkdir build
cd build
cmake ..
make
./Transformation
- 前两条命令是在项目根目录下执行的,后3条命令都是在
项目根目录/build
下执行的。显然后续再编译,从第3条命令开始即可。 - build文件夹大小1MB左右,好大,让人难过。
- 为什么可执行文件名叫Transformation?这个文件名是在CMakeLists.txt的add_executable中指定的。
作者:hans774882968
本文链接:https://blog.csdn.net/hans774882968/article/details/122858892
以上是关于闫令琪GAMES101笔记 变换的主要内容,如果未能解决你的问题,请参考以下文章
GAMES101闫令琪图形学作业1(配置opencv4.5.4,并解决常见错误)