图形旋转后,如何记住新坐标????

qinglangtaozi 2011-01-15 01:03:04
图形旋转后,如何记住新坐标。平移还好记,可是旋转后呢?我自己用cos sin算,可是不对啊
我旋转后,在双击选中物体(以便单独移动该物体),可是一双击物体的位置就乱了,在旋转,也是乱跑。。。。。

void CDesign::DrawProduct(GLenum mode)
{
if(ProductIsOK)
{
for(int i=0;i<4;i++)
{
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(0.0,0.0,-10.0); //z轴后退,在-10处作图,非负看不见
//------图形旋转,若检查到选择模式下(任何一个被选中),这里的旋转角度是0,不起作用的-----

if(isXrota)
{
if(X_rota !=X_rota_old )
{
GLfloat Rx = pow( pow(pCubelist[i]->y ,2) + pow(pCubelist[i]->z +10 ,2), 0.5);
glTranslatef(pCubelist[i]->x,0,0);//这样做,初始位置是一下飙回来的
glRotatef(X_rota,1.0,0.0,0.0);
//glRotatef(Y_rota,0.0,1.0,0.0);
glTranslatef(0,Rx,0);

//----选中的新位置值----

pCubelist[i]->x = pCubelist[i]->x;
pCubelist[i]->y = pCubelist[i]->y+Rx*cos(X_rota*PI/180)-Rx*cos(X_rota_old*PI/180);
pCubelist[i]->z = pCubelist[i]->z+Rx*sin(X_rota*PI/180)-Rx*sin(X_rota_old*PI/180);

}
}else
{
if(Y_rota !=Y_rota_old)
{
GLfloat Ry = pow( pow(pCubelist[i]->x ,2) + pow(pCubelist[i]->z +10 ,2), 0.5);
glTranslatef(0,pCubelist[i]->y,0); //这样做,初始位置是一下飙回来的
//glRotatef(X_rota,1.0,0.0,0.0);
glRotatef(Y_rota,0.0,1.0,0.0);
glTranslatef(Ry,0,0);

//----选中的新位置值----

pCubelist[i]->x = pCubelist[i]->x +Ry*cos(-Y_rota*PI/180)-Ry*cos(-Y_rota_old*PI/180);
pCubelist[i]->y = pCubelist[i]->y;
pCubelist[i]->z = pCubelist[i]->z+Ry*sin(-Y_rota*PI/180)-Ry*sin(-Y_rota_old*PI/180);

}
}

if(X_rota ==X_rota_old && Y_rota ==Y_rota_old)
{
//------各个物体坐标移到自己上一次的位置,在此基础上去平移--------
glRotatef(X_rota,1.0,0.0,0.0);
glRotatef(Y_rota,0.0,1.0,0.0);
glTranslatef(pCubelist[i]->x,pCubelist[i]->y,pCubelist[i]->z+10);
}

//------选中图形位移,执行了上面得旋转,既该物体不是选择模式-----
if(mode==GL_SELECT)
{
glLoadName(i);//选择命名,感觉每次点击都命一次名,好浪费资源
}
//------选中的移动-----
if(pCubelist[i]->selected)
{
glPushMatrix();
//----选中的新位置值----
pCubelist[i]->x = pCubelist[i]->x + X_angle;
pCubelist[i]->y = pCubelist[i]->y - Y_angle;
pCubelist[i]->z = pCubelist[i]->z + Z_angle;

glTranslatef(X_angle/250.0, -Y_angle/250.0, Y_angle/250.0); //opengl的Y坐标跟计算机坐标是反的


pCubelist[i]->Draw();
glPopMatrix();
}else
{
//-------没有选中的原地画出-----经历旋转或平移后画出物体--------

pCubelist[i]->Draw();
}

glPopMatrix();

}//for(int i=0;i<4;i++)

//------------所有4个都旋转完,在记录下上一次的转换角度------
X_rota_old=X_rota;
Y_rota_old=Y_rota;
}//if(ProductIsOK)
SwapBuffers(hDC);
}
...全文
214 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qinglang7010 2011-01-22
  • 打赏
  • 举报
回复
你用LOOKAT
zhoujk 2011-01-16
  • 打赏
  • 举报
回复
到我的资源去下载图像旋转的代码,是C#写的,稍稍改一下就可以在C++里面用。这里有两个算法,较新的使用了双线性插值法,老的一个没有用。
renxu350 2011-01-15
  • 打赏
  • 举报
回复
另外,物体移动到新位置的时候,需要保存世界矩阵,
glPushMatrix(),
然后再旋转
renxu350 2011-01-15
  • 打赏
  • 举报
回复
旋转物体后,物体的世界矩阵已经变换了,
如果要按照原世界坐标系移动的话,需要先设置单位矩阵,
OGL应该是glLoadIdentity(),
然后才可以再对物体进行世界移动变换
ichanging 2011-01-15
  • 打赏
  • 举报
回复
我记得应该是用矩阵计算的,不是这样算的,旋转,缩放,都是矩阵乘以矩阵,依稀记得

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧