三维空间下任意三角形到二维的矩阵变换
**为了获得三维空间中 三角形平面上的点和三角形三个点的位置关系,并将其展现在平面上(纹理映射用),需要将三维空间中的三角形做矩阵变换,使其一点在原点上,一边在坐标轴上,平铺在xoz平面上。
解决方法:需要做一次平移矩阵变换与三次旋转矩阵变换。
加载eigen库,代码如下:
#include
#include <Eigen/Dense>
#include <math.h>
using namespace Eigen;
using namespace std;
struct Point
{
double x, y, z;
};
int main() {
//假设有三个点
Point A = {0,4.3,6};
Point B = {1,0.32,1};
Point C = { -1,0,3.9 };
//四次矩阵变换
Matrix4d m1,m2,m3,m4;
//装载点至向量
Vector4d PointA = { A.x,A.y,A.z,1 };
Vector4d PointB = { B.x,B.y,B.z,1 };
Vector4d PointC = { C.x,C.y,C.z,1 };
Vector4d TEMP;
double cos0, sin0;
m1 <<
1, 0, 0, -A.x,
0, 1, 0, -A.y,
0, 0, 1, -A.z,
0, 0, 0, 1;
TEMP = m1 * PointB;
cos0 = cos(atan( (TEMP[2] ) / (-(TEMP[1])) ));
sin0 = sin(atan( (TEMP[2] ) / (-(TEMP[1])) ));
m2 <<
1, 0, 0, 0,
0, cos0,-sin0, 0,
0, sin0, cos0, 0,
0, 0, 0, 1;
TEMP = m2 * (m1 * PointB);
cos0= cos(atan( -(TEMP[1]) / (TEMP[0]) ));
sin0= sin(atan( -(TEMP[1]) / (TEMP[0]) ));
m3 <<
cos0,-sin0, 0, 0,
sin0, cos0, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1;
TEMP = m3*(m2 * (m1 * PointC));
cos0 = cos(atan( (TEMP[1]) / (TEMP[2]) ));
sin0 = sin(atan( (TEMP[1]) / (TEMP[2]) ));
m4 <<
1, 0, 0, 0,
0, cos0, -sin0, 0,
0, sin0, cos0, 0,
0, 0, 0, 1;
Vector4d projectedA, projectedB, projectedC;
projectedA = m4*(m3*(m2*(m1*PointA)));
projectedB = m4*(m3*(m2*(m1*PointB)));
projectedC = m4*(m3*(m2*(m1*PointC)));
cout << projectedA << endl << endl;
cout << projectedB << endl << endl;
cout << projectedC << endl << endl;
cout << endl;
cout << "变换前三角形AB边长的平方:" << (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y) + (A.z - B.z) * (A.z - B.z) << endl;
cout << "变换后三角形AB边长的平方:"<< (projectedA.x() - projectedB.x()) * (projectedA.x() - projectedB.x()) + (projectedA.y() - projectedB.y()) * (projectedA.y() - projectedB.y()) + (projectedA.z() - projectedB.z()) * (projectedA.z() - projectedB.z()) << endl;
cout << "变换前三角形BC边长的平方:" << (C.x - B.x) * (C.x - B.x) + (C.y - B.y) * (C.y - B.y) + (C.z - B.z) * (C.z - B.z) << endl;
cout << "变换后三角形BC边长的平方:" << (projectedC.x() - projectedB.x()) * (projectedC.x() - projectedB.x()) + (projectedC.y() - projectedB.y()) * (projectedC.y() - projectedB.y()) + (projectedC.z() - projectedB.z()) * (projectedC.z() - projectedB.z()) << endl;