怎样改变OpenGL中的旋转坐标轴的位置

时间:2022-06-10 10:42:31
默认情况下,我画了一个三维坐标轴,使用下面的两个语句使绘制出来的图形围绕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轴旋转?
请指教!谢谢!

10 个解决方案

#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


先把矩阵存起来,然后执行操作,然后再恢复
这个过程跟移动坐标原点,围绕坐标轴旋转是什么样的关系?

#7


呵呵,谢谢LUCIzm
实现了

#8


元件就是指一个独立的物体。比如说一个圆柱。
需要自己创建,如果你视图中有多个物体,你如何做到在原来变换的基础上再次变换(没有规律)呢(不影响其它的元件)。这就需要为每一个元件保存自己的矩阵,在变换时载入上次变换的矩阵,变换后在保存矩阵。

最简单的方法
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;



#9


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

#10


谢谢mycool2001
真不好意思,我结贴太快了
已经结贴了
没法给您分了
虽然分数很少,但还是有些歉疚
Sorry!

#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


先把矩阵存起来,然后执行操作,然后再恢复
这个过程跟移动坐标原点,围绕坐标轴旋转是什么样的关系?

#7


呵呵,谢谢LUCIzm
实现了

#8


元件就是指一个独立的物体。比如说一个圆柱。
需要自己创建,如果你视图中有多个物体,你如何做到在原来变换的基础上再次变换(没有规律)呢(不影响其它的元件)。这就需要为每一个元件保存自己的矩阵,在变换时载入上次变换的矩阵,变换后在保存矩阵。

最简单的方法
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;



#9


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

#10


谢谢mycool2001
真不好意思,我结贴太快了
已经结贴了
没法给您分了
虽然分数很少,但还是有些歉疚
Sorry!