欢迎来到NiceSpace!祝大家开心每一天!
  • C++
  • 图形学
3D图形学总结(一)—世界坐标转换

 一个在局部模型坐标下的立方体,如图:

该立方体共8个顶点,在局部坐标中的坐标可以在图中看到,如果把该立方体放入世界坐标系中(world_x,world_y,world_z)处,即局部坐标的中心点(0,0,0)移动到(world_x,world_y,world_z),那么它的8个顶点也要跟着移动,以v0点为例(其他点跟v0类似),v0的坐标为(10,10,10),它移动到世界中后的坐标就是(10+world_x,10+world_y,10+world_z),这个过程就是世界坐标转换。图示:

世界坐标转换运算可以直接将顶点坐标x,y,z分别加上世界坐标(world_x,world_y,world_z)完成转换,也可以通过矩阵完成,点(x,y,z)平移(world_x,world_y,world_z)后:

为了方便运算上面使用的是4D齐次坐标,所以经过矩阵运算后就完成了从局部坐标到世界坐标的转换,而矩阵:

被称作世界坐标转换矩阵。

构建世界坐标转换矩阵源码:

//点和向量四维
typedef struct VECTOR4D_TYP
{
	union
	{
		float M[4];
		struct
		{
			float x, y, z, w;
		};
	};
} VECTOR4D, POINT4D, *VECTOR4D_PTR, *POINT4D_PTR;
 
//4x4矩阵
typedef struct MATRIX4X4_TYP
{
	union
	{
		float M[4][4];
		struct
		{
			float M00, M01, M02, M03;
			float M10, M11, M12, M13;
			float M20, M21, M22, M23;
			float M30, M31, M32, M33;
		};
	};
} MATRIX4X4, *MATRIX4X4_PTR;
 
//多边形结构
typedef struct POLY4DV1_TYP
{
	int state;
	int attr;
	int color;
 
	POINT4D_PTR vlist;
	int vert[3];
} POLY4DV1, *POLY4DV1_PTR;
 
//基于顶点的列表和多边形列表的物体
typedef struct OBJECT4DV1_TYP
{
	int id;
	char name[64];
	int state;
	int attr;
	float avg_radius;
	float max_radius;
 
	POINT4D world_pos;
 
	VECTOR4D dir; //物体在局部坐标下的旋转角度
	VECTOR4D ux, uy, uz; //记录物体朝向的坐标轴
 
	int num_vertices; //物体顶点数
 
	POINT4D vlist_local[64]; //顶点局部坐标
	POINT4D vlist_trans[64]; //顶点转换坐标
 
	int num_polys; //物体的多边形数
	POLY4DV1 plist[128];
}OBJECT4DV1, *OBJECT4DV1_PTR;
 
//矩阵初始化
void Mat_Init_4X4(MATRIX4X4_PTR ma,
	float m00, float m01, float m02, float m03,
	float m10, float m11, float m12, float m13,
	float m20, float m21, float m22, float m23,
	float m30, float m31, float m32, float m33)
 
{
	ma->M00 = m00; ma->M01 = m01; ma->M02 = m02; ma->M03 = m03;
	ma->M10 = m10; ma->M11 = m11; ma->M12 = m12; ma->M13 = m13;
	ma->M20 = m20; ma->M21 = m21; ma->M22 = m22; ma->M23 = m23;
	ma->M30 = m30; ma->M31 = m31; ma->M32 = m32; ma->M33 = m33;
 
}
 
//构建世界坐标变换矩阵
void BuildMatrixWorld(OBJECT4DV1_PTR obj)
{
	//世界坐标转换矩阵
	MATRIX4X4 matworld;
	Mat_Init_4X4(&matworld,
		1, 0, 0, 0,
		0, 1, 0, 0,
		0, 0, 1, 0,
		obj->world_pos.x, obj->world_pos.y, obj->world_pos.z, 1);
}

 

随机文章
深入理解字符串(编码,解码,乱码问题) 3D图形学总结(三)—相机坐标转换(UVN相机) 3D图形学总结(六)—背面消除与物体剔除 Django本地配置mysql(windows系统) 3D图形学总结(十一)—深度缓存