第二界矩阵
Keep in touch :zpxocivuby@126.com
目的:指导别人使用矩阵
任务:编写教程,编写代码
阅读对象:d3d入门者,c/c++熟练,windows编程熟练,VC IDE熟练
描述:
矩阵在3d游戏当中担当着十分重要的角色。虽然在某些方面不如四元数(quaternion)但是我们不得不承认矩阵是计算机图形学的基础。
下面我们就来学习一下这个东东
矩阵的概念
What are matrices and how do they work? (矩阵是什么和它们怎样工作)
矩阵其实是一个高级的数学主题(参看线性代数),所以,在此我只能尽力地、简要地概括一下。矩阵就像是一个表格,有一定数目的行与列;每个格子中都一个数字或表达式。通过特定的矩阵,我们可以对3D对象中的顶点坐标进行运算,来实现类似移动、旋转、缩放这样的操作。在DirectX中,矩阵就是4X4的数表。下面的这幅图是一个矩阵的例子,这个矩阵能使一个对象(由它的所有顶点)缩放到原来的五倍。
那么我们用它来作甚么啊?其实很简单我们仅仅用它来做变换。
首先,给出一个点a(x,y,z),它是相对于我们想象空间点o(0,0,0)的,如果相对原点改变为(1,0,0)怎么半啊?那么a点变成(x-1,y,z).
这么说吧,其实说白了矩阵就是将一个位置的点通过变换矩阵移动到另一个位置(这样才能产生动画啊!)。你不用把矩阵看的很神秘,你就把它当成一个可以让你随心所欲的变换位置的工具。
基本的矩阵操作函数有以下几种:
1. D3DXMatrixRotationX(D3DXMATRIX *out ,FLOAT Angle);//围绕x轴转动
2. D3DXMatrixRotationY(D3DXMATRIX *out ,FLOAT Angle);//围绕y轴转动
3. D3DXMatrixRotationZ(D3DXMATRIX *out ,FLOAT Angle); //围绕z轴转动
4. D3DXMatrixRotationYawPitchRoll(D3DXMATRIX *out ,FLOAT x, FLOAT y, FLOAT z)//在xyz方向上偏移x,y,z大小
5. D3DXMatrixScaling(D3DXMATRIX *out ,FLOAT x, FLOAT y, FLOAT z)//缩放比例
6. D3DXMatrixShadow(D3DXMATRIX *out , D3DXVECTOR4* pLight, D3DXPLANE *pPlane)//平面投影矩阵
7. D3DXMatrixTranslation()//建立移动矩阵
8. D3DXMatrixTransformation(D3DXMATRIX *pOut, D3DXVECTOR3 *pScalingCenter, D3DXQUATERNION *pScalingRotation, D3DXVECTOR3 *pScaling, D3DXVECTOR3 *pRotationCenter, D3DXQUATERNION *pRotation, D3DXVECTOR3 *pTranslation);
这个函数我要给大家仔细的讲一下(竖起耳朵听啊^_^)
第一个参数:D3DXMATRIX *pOut返回的转换矩阵
第二个参数: D3DXVECTOR3 *pScalingCenter 缩放的原点
第三个参数: D3DXQUATERNION * pScalingRotation 这是个四元素(什么?什么是四元素?看来这个函数介绍要花点时间了。
D3DXQUATERNION这个结构有四个内容x,y,z,w其中xyz表示一个向量,w则表示一个旋转度,该结构表示的是围着xyz向量旋转w)
第四个参数: D3DXVECTOR3 *pScaling 缩放向量(同上面两个参数联系起来那就是在pScalingCenter原点,pScaling方向上缩放|pScaling|大小,或旋转pScalingRotation)
第五个参数:旋转圆点
第六个参数:旋转的四元素
第七个参数:旋转向量
当得到你想要的转换矩阵之后,你就可以用ID3DXEffectStateManager::SetTransform()来设置你要操作的对象了,参数说明:
D3DTRANSFORMSTATETYPE State, 转换的类型,一般是D3DTS_VIEW(视点转换), D3DTS_PROJECTION(项目转换)等
D3DMATRIX *pMatrix转换矩阵
现在来看看代码吧
其他部分都一样,有两个地方需要解释一个是在setup()方法中,另一个是在Display()方法中
D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);//
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
//以上我们定义了三个向量,这三个向量是用来建立左手观察矩阵的
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &position, &target, &up);
建立左手观察矩阵的函数
概念讲述
左手观察矩阵
下面的两幅图演示了左手3D 迪卡尔坐标系统是怎样工作的。
Fig 2.3
Fig 2.4
为什么称为左手观察矩阵呢?这样,你将左手平放在胸前,拇指与其他指头垂直,掌心向上,你可以看到掌心的方向与图2.3的y方向是一样的食指的方向与x方向是一样的拇指的方向与z轴的方向是一样的。(你可能会问,那有左手的,就应改有右手的啊,是的有右手的,只要将图2.3中的x轴方向反过来就是了)
Device->SetTransform(D3DTS_VIEW, &V);
设置视点转换
//以下是设置项目转换矩阵
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI * 0.5f, // 90 - degree
(float)Width / (float)Height,
1.0f,
1000.0f);
Device->SetTransform(D3DTS_PROJECTION, &proj);
在Display()方法中需要添加几行代码
D3DXMATRIX Ry;
//申明一个矩阵
static float y = 0.0f;
D3DXMatrixRotationY(&Ry, y);
//以y的偏移量建立y轴旋转矩阵
y += timeDelta;//还记得timeDelta时代表什么吗?对了它是当前的时间差(上次循环到这次的时间,很少啊(毫秒艾!!!))
if( y >= 6.28f )//为什么要判断大于6.28呢?2∏是一周啊∏≈3.14啊,你可以试着改变一下该值看看有什么事情发生
y = 0.0f;
Device->SetTransform(D3DTS_WORLD, &Ry);
好了讲完了,运行一下看看吧,一个四边形围着y轴在转啊!^_^
下一界我们要进入我们的正题了――骨骼动画的基本概念,我会带你一步步的进入到(母体matrix中)嘿嘿
今天又写完了一界了不知道大家看了有没有效果,或者说我的方法是不是有问题,如果你有好的建议或者意见请与我联系 zpxocivuby@126.com
申明:代码是引用Frank Luna他老人家的代码,我无意窜取他的劳动果实,只是懒得重新写代码所以拿来用一下。过后我会自己再写个比较复杂的,之所以用他老人家的代码是因为直接明了,没有那么多的类阿,模式啊什么的。代码中我会添加注释信息
附件下载地址