|
|
发表于 2005-6-22 21:00:00
|
显示全部楼层
Re:旋转并不容易!
openGL没用过,不过旋转应和DX中一样,如要围绕本地Y轴旋转,正确做法应该先得旋转矩阵,然后通过坐标系转换为世界坐标系中的矩阵。我在DX中让人物拐弯是先让人物旋转后再移到它应该在的世界坐标位置,在渲染后单位化世界坐标系(3步)。由于在用旋转矩阵设置渲染状态,实际是改变了世界坐标系,而人物实际上一直在坐标原点。旋转场景中任意物体是最复杂的,但DX有一个围绕任意轴旋转的函数,只要你找到任意物体要旋转的轴在世界坐标系的位置,同时还要将它移到原点,旋转,然后再移回去就可以了。
下面是我的游戏场中一个水车的旋转代码
////////////////////初始化水车旋转的相关变量//////////////////////
ComUnitV(&h_shuiche);//水车旋转用
shuicheAngle = 0.0f;//旋转角度
shuicheL=D3DXVECTOR3(-1,0,0);//水车旋转相对轴向
linshi=D3DXVECTOR3(-7058.9f,350.0f,4801.0f);//水车的世界坐标位置
shuicheLen=D3DXVec3Length(&linshi);
//////////////////////旋转水车//////////////////////////////////////
if(i==9)
{
D3DXMATRIX mat1;
D3DXMATRIX mat3;
D3DXVECTOR3 h1
D3DXMatrixRotationAxis(&mat3,&h_shuiche,shuicheAngle);
h1.x=linshi.x*mat3._11+linshi.y*mat3._12+linshi.z*mat3._13+mat3._14;
h1.y=linshi.x*mat3._21+linshi.y*mat3._22+linshi.z*mat3._23+mat3._24;
h1.z=linshi.x*mat3._31+linshi.y*mat3._32+linshi.z*mat3._33+mat3._34;
h1/=D3DXVec3Length(&h1);
h1*=shuicheLen;
h1-=linshi;
D3DXMatrixTranslation(&mat1,h1.x,h1.y,h1.z);
D3DXMatrixMultiply(&mat3,&mat1,&mat3);
m_pD3DDevice->SetTransform( D3DTS_WORLD, &mat3 );
m_pMesh->DrawSubset(i);
D3DXMatrixIdentity(&mat1);
D3DXMatrixIdentity(&mat3);
m_pD3DDevice->SetTransform(D3DTS_WORLD, &mat1);
shuicheAngle = ((int)(0.06*timeGetTime())%360)*PI1;
if(shuicheAngle>2*D3DX_PI)
{
shuicheAngle = 0.0f;
} |
|