3D图形学学习总结(一)—世界坐标转换

原文链接:  http://www.nicemxp.com/articles/18

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

该立方体共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);
}

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值