默认情况下,我画了一个三维坐标轴,使用下面的两个语句使绘制出来的图形围绕x、y轴旋转,
        glRotatef(m_xRotation, 1.0, 0.0, 0.0);
glRotatef(m_yRotation, 0.0, 1.0, 0.0);
但现在我使用了
glTranslatef(-10.0,10.0,0.0);
把绘图坐标沿x、y轴调整了,
现在该怎样做才能使现在的图形绕着现在的x、y轴旋转,而不是按照原来的x、y轴旋转?
请指教!谢谢!

解决方案 »

  1.   

    建议为为每一个元件建立一个矩阵。元件变换后保存矩阵,在下次变换前载入你保存的矩阵。
    glLoadMatrixf((GLfloat*)&m_fMarix);  //载入变换后的矩阵
    glGetFloatv(GL_MODELVIEW_MATRIX,(GLfloat *)&m_fMarix); //保存变换后的矩阵
      

  2.   

    没弄明白
    “建议为为每一个元件建立一个矩阵”
    “元件”指什么?
    能给出具体操作语句吗?
    我的绘图代码如下:void CTrochoidView::OnDraw(CDC* /*pDC*/)
    {
    CTrochoidDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
    return; // TODO: 在此处为本机数据添加绘制代码
    //清除颜色缓冲和深度缓冲
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //用单位矩阵替换当前矩阵
    glLoadIdentity();
    //旋转角度
    glRotatef(m_xRotation, 1.0, 0.0, 0.0);
    glRotatef(m_yRotation, 0.0, 1.0, 0.0);
    //glRotatef(m_xRotation,  - 10.0, 0.0+10.0, 0.0);
    //glRotatef(m_yRotation, -10.0, 11.0, 0.0);
    glTranslatef(-10.0,10.0,0.0);
    this->DrawCoordinateSystem();
    GetDataFromXMLFile(_T("trochoidData.xml")); //从XML文件获取数据,参数为XML文件名
    GetWorld3DCoordinate();
    GetWorldCoordinateRange();
    GetLogic3DCoordinate();
    GetLogicCoordinateRange();
    DrawTrochoidLine();
    //强制绘图完成
    glFinish();
    //交换缓冲区数据
    SwapBuffers(wglGetCurrentDC());
    }
      

  3.   

    现在的情况是:
    按照默认情况下我绘制出的三维坐标系原点在屏幕的中心,
    我想把这个坐标原点移动到靠近左上方的位置,所以使用了glTranslatef(-10.0,10.0,0.0); 
    并使图形按照现在绘制的坐标轴旋转,
    我不知道有没有别的方法能实现这种效果,
    如果有别的方法也行,比如使用移动视口之类的
      

  4.   

    glLoadMatrixf
    glPopMatrixf
    先把你需要用矩阵存起来,在进行完具体的操作,可以用Pop恢复,函数和存储都是opengl提供。还需要自己创建么?不清楚了,初学。
      

  5.   

    没懂你意思了。你要是想按照变换后的坐标轴旋转,在环绕之前改变就好了。
    glTranslatef(-10.0,10.0,0.0); 
    glRotatef(m_xRotation, 1.0, 0.0, 0.0); 
    glRotatef(m_yRotation, 0.0, 1.0, 0.0); 
    //glRotatef(m_xRotation,  - 10.0, 0.0+10.0, 0.0); 
    //glRotatef(m_yRotation, -10.0, 11.0, 0.0); 
    不清楚你要实现的功能。
      

  6.   

    元件就是指一个独立的物体。比如说一个圆柱。
    需要自己创建,如果你视图中有多个物体,你如何做到在原来变换的基础上再次变换(没有规律)呢(不影响其它的元件)。这就需要为每一个元件保存自己的矩阵,在变换时载入上次变换的矩阵,变换后在保存矩阵。最简单的方法
    m_xRotation =?;  //在其他的地方设置
    m_yRotation =?;
    m_xMove =?;//glLoadIdentity();  //注销
    //旋转角度 
    glRotatef(m_xRotation, 1.0, 0.0, 0.0); 
    glRotatef(m_yRotation, 0.0, 1.0, 0.0); 
    glTranslatef(m_xMove,10.0,0.0); m_xRotation =0; //在其他的地方恢复
    m_yRotation =0;
    m_xMove =0;
      

  7.   

    m_xRotation =0; //使用后恢复 
    m_yRotation =0; 
    m_xMove =0;