现在的旋转比较快,我想改慢一点
原来的旋转代码如下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中还可以怎么改使
旋转速度变慢

解决方案 »

  1.   


    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.   

    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
    这个就是,自己随便改(乘号后面的)速度。
      

  3.   

    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
    2.0f系数改小。
      

  4.   

    应该改的是 /1000.0f , 前面2.0f*D3DX_PI 是圆周率, /1000.0f 这个值才是关键
      

  5.   

        UINT  iTime  = timeGetTime() % 1000; 
        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的话就可能导致转不满一周的情况。完了。