现在的旋转比较快,我想改慢一点
原来的旋转代码如下D3DXMATRIX matWorld;
D3DXMATRIX matTranlate,matRotation;
UINT iTime = timeGetTime() % 1000;
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
D3DXMatrixRotationY( &matRotation, fAngle );
//D3DXMatrixTranslation(&matTranlate,0.0,theight,0.0);
//D3DXMatrixMultiply(&matWorld,&matRotation,&matTranlate); //设置世界矩阵
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );我改了fAngle的值,结果旋转效果有问题,旋转不正常,请问dx中还可以怎么改使
旋转速度变慢
原来的旋转代码如下D3DXMATRIX matWorld;
D3DXMATRIX matTranlate,matRotation;
UINT iTime = timeGetTime() % 1000;
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
D3DXMatrixRotationY( &matRotation, fAngle );
//D3DXMatrixTranslation(&matTranlate,0.0,theight,0.0);
//D3DXMatrixMultiply(&matWorld,&matRotation,&matTranlate); //设置世界矩阵
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );我改了fAngle的值,结果旋转效果有问题,旋转不正常,请问dx中还可以怎么改使
旋转速度变慢
void ENmatrix::ENmatrixFrameStep(float delta,D3DXVECTOR3 move,D3DXVECTOR3 scale)
{
//获得世界矩阵,观察矩阵和投影矩阵;P88
m_pd3dDevice->GetTransform( D3DTS_WORLD, &Save_System);//存放未结合ROTA,MOVE值 //创建一个单位矩阵。
D3DXMatrixIdentity(&World_Scale);
D3DXMatrixIdentity(&World_Rotate);
D3DXMatrixIdentity(&World_Move); D3DXMatrixScaling( &World_Scale,scale.x, scale.y,scale.z);
//设置模型移动
D3DXMatrixTranslation(&World_Move,move.x,move.y,move.z); World_Move*=World_Scale; //rotate
D3DXMatrixRotationX( &World_RotateX, 0 );//原点转动
D3DXMatrixRotationY( &World_RotateY, 0 );
D3DXMatrixRotationZ( &World_RotateZ, 0 );
D3DXMatrixMultiply(&World_Rotate,&World_RotateX,&World_RotateY);
D3DXMatrixMultiply(&World_Rotate,&World_Rotate,&World_RotateZ);//复合几何变换;P72(设置缩放与旋转结合缩放才起作用)
//D3DXMatrixMultiply(&matWorld_RM,&matWorld_RXYZ,&matWorld_MXYZ);
//D3DXMatrixMultiply(& ob->at->LHxxRMMatrix,& ob->at->LHxxRMMatrix,&matWorld_RM);
//D3DXMatrixMultiply(&matWorld_RM,&matWorld_RM,&matWorld_Scal);
//D3DXMatrixTranspose(&matTranspose, &matWorld_RXY);//颠倒 调换 左转变为右转 //LHxxRMMatrix:结合ROTA,MOVE
// D3DXMatrixMultiply(&World_Move,&World_Scale,&World_Move);
D3DXMatrixMultiply(&World_Transform,&World_Rotate,&World_Move);
// ob->LHxxRMMatrix=matWorld_RXYZ*matWorld_MXYZ; m_pd3dDevice->SetTransform( D3DTS_WORLD, &Save_System);//还原原来的位置
}这种旋转方法是对矩阵复合转换,对自身的网格点数据不会产生化.应该说这种方法不好.下面这种方法,你试试,它是model做3条线(XYZ坐标),计算它们的哪一条轴是不转的.void ENobject3D::LHxx3DOB_ROTATEX(char *name,float angle)
{
TList=ENobject3DListOb.GetNode(name);
LHxx3DOBJECT *ob=TList->ObjectData; ob->LHxx3DAngle.x+=angle;
if(ob->LHxx3DAngle.x>=PI*4)
{
ob->LHxx3DAngle.x-=PI*2;
}
//自身轴(用于计算绕哪一条axes)
Tline_ListOb=ob->line3DOb->ENlineListOb.GetNode(name);
LHxxLOCALLINE_TYP *line=Tline_ListOb->ObjectData; D3DXVECTOR3 ac=line[1].LHxxLP-line[0].LHxxLP;
D3DXVec3Normalize(&ac,&ac);
LHxx3DMODELVERTEX* pDst;
ob->LHxx3DMVertexBuffer->Lock( 0, 0, (void**)&pDst, 0 );
for(DWORD i=0;i<ob->LHxx3DMNumVertices;i++)
{
LHxxAXIS_ROTATEPOINT(angle,ac,D3DXVECTOR3(0,0,0),pDst[i].LHxxMP);
}
//将顶点坐标COPY TO模型网格点坐标
memcpy(ob->LHxx3DMVertex,pDst,ob->LHxx3DMNumVertices * sizeof(LHxx3DMODELVERTEX ) );
ob->LHxx3DMVertexBuffer->Unlock();
}
//点绕轴旋转 不转模型
void ENobject3D::LHxxAXIS_ROTATEPOINT(float angle,D3DXVECTOR3 AxisP1,D3DXVECTOR3 AxisP2,D3DXVECTOR3 &Point)
{ //AxisP1:转的方向与原点相减的向量
//AxisP2:以原点为旋转中心
//Point:要旋转的点 float x, float y, float z;
AxisP1-=AxisP2;//求得转动点与原始点矢量
x=AxisP1.x;
y=AxisP1.y;
z=AxisP1.z;
D3DXVECTOR3 vNewView; // 获得观察方向矢量(原始点矢量)
D3DXVECTOR3 vView =Point-AxisP2;
// 计算角度的cos和sin值
float cosTheta = (float)cosf(angle);
float sinTheta = (float)sinf(angle); // 计算新的观察点坐标X
vNewView.x = (cosTheta + (1 - cosTheta) * x * x) * vView.x;
vNewView.x += ((1 - cosTheta) * x * y - z * sinTheta) * vView.y;
vNewView.x += ((1 - cosTheta) * x * z + y * sinTheta) * vView.z; // 计算新的观察点坐标Y
vNewView.y = ((1 - cosTheta) * x * y + z * sinTheta) * vView.x;
vNewView.y += (cosTheta + (1 - cosTheta) * y * y) * vView.y;
vNewView.y += ((1 - cosTheta) * y * z - x * sinTheta) * vView.z; // 计算新的观察点坐标Z
vNewView.z = ((1 - cosTheta) * x * z - y * sinTheta) * vView.x;
vNewView.z += ((1 - cosTheta) * y * z + x * sinTheta) * vView.y;
vNewView.z += (cosTheta + (1 - cosTheta) * z * z) * vView.z;
Point = AxisP2 + vNewView;
}
这个就是,自己随便改(乘号后面的)速度。
2.0f系数改小。
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;从这两句来看,原代码的意思是要1秒旋转一周。
第一句的1000是指1000毫秒,第二句的1000.0是指将圆周分为1000份。每毫秒增加1份,于是1秒就转了一圈。你想要改为2秒旋转一周的话就改成:
UINT iTime = timeGetTime() % 2000;
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 2000.0f;两个要一起改,只改了fAngle的话就可能导致转不满一周的情况。完了。