立方体绕对角线旋转后想平移却不是延x轴平移怎么办,代码在下面

刀口耳 2018-06-09 12:38:16
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>

static GLfloat r = .7f,x1,x2;

/*************************************************/
/*void GLCube(GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2)
功能 :绘制长方体
输入参数:(x1,y1,z1),(x2,y2,z2)长方体的一条对角线的顶点
输出参数:无
返回值:无 */
/************************************************/

void GLCube(GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//绘制方柱体六个面
glBegin(GL_POLYGON);
//glNormal3f(0.0f, -1.0f, 0.0f);
glVertex3f(x1, y1, z1);
glVertex3f(x2, y1, z1);
glVertex3f(x2, y1, z2);
glVertex3f(x1, y1, z2);
glEnd();

glBegin(GL_POLYGON);
//glNormal3f(0.0f, 0.0f, -1.0f);
glVertex3f(x2, y2, z1);
glVertex3f(x2, y1, z1);
glVertex3f(x1, y1, z1);
glVertex3f(x1, y2, z1);
glEnd();

glBegin(GL_POLYGON);
//glNormal3f(-1.0f, 0.0f, 0.0f);
glVertex3f(x1, y2, z2);
glVertex3f(x1, y2, z1);
glVertex3f(x1, y1, z1);
glVertex3f(x1, y1, z2);
glEnd();

glBegin(GL_POLYGON);
//glNormal3f(1.0f, 0.0f, 0.0f);
glVertex3f(x2, y2, z2);
glVertex3f(x2, y1, z2);
glVertex3f(x2, y1, z1);
glVertex3f(x2, y2, z1);
glEnd();

glBegin(GL_POLYGON);
//glNormal3f(0.0f, 1.0f, 0.0f);
glVertex3f(x1, y2, z1);
glVertex3f(x1, y2, z2);
glVertex3f(x2, y2, z2);
glVertex3f(x2, y2, z1);
glEnd();

glBegin(GL_POLYGON);
//glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(x2, y2, z2);
glVertex3f(x1, y2, z2);
glVertex3f(x1, y1, z2);
glVertex3f(x2, y1, z2);
glEnd();
//绘制左下角轴线
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINES);
glVertex3f(2*x2,2*y2,2*z1);
glVertex3f(2*x1,2*y1,2*z2);
glEnd();

}

/*************************************************/
/*void init(void)
功能 :初始化
输入参数:无
输出参数:无
返回值:无 */
/************************************************/

void init(void)
{
glClearColor(0.000f, 0.000f, 0.000f, 0.0f); //Background color
glEnable(GL_LIGHT0);//启用0号光源
glEnable(GL_LIGHTING);//启用灯源
glEnable(GL_DEPTH_TEST);//启用深度测试。
}

/*************************************************/
/*void display(void)
功能 :刷新窗口显示图形
输入参数:无
输出参数:无
返回值:无 */
/************************************************/

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清空颜色深度缓存
glPushMatrix();//把当前的模型视图矩阵压入堆栈中保存下来
glRotatef(45.0f, r,r,-2*r);//绕着向量(r,r,-2r)旋转45度
GLCube(-r, -r, -2*r, r, r, 2*r);//画出具体长方体
glPopMatrix();//将模型视图矩阵堆栈中的栈顶矩阵弹出,恢复原来的坐标系
glFlush();//刷新
}

/*************************************************/
/*void reshape (int w, int h)
功能 :平行投影
输入参数:w:宽,h:高
输出参数:无
返回值:无 */
/************************************************/

void reshape (int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);//设置机口
glMatrixMode(GL_PROJECTION); //指定哪一个矩阵是当前矩阵
glLoadIdentity();//重置当前指定的矩阵为单位矩阵
if (w <= h)
glOrtho(-2.5, 2.5, -2.5*(GLfloat)h/(GLfloat)w,
2.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);//平行投影
else
glOrtho(-2.5*(GLfloat)w/(GLfloat)h,
2.5*(GLfloat)w/(GLfloat)h, -2.5, 2.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

/*************************************************/
/*void keyboard(unsigned char key ,int x, int y)
功能 :根据键盘控制旋转,s绕对角线顺时针旋转,y逆时针旋转
esc退出
输入参数:key:键盘 x,y位置
输出参数:无
返回值:无 */
/************************************************/

void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 's':
glRotatef(3.0f,r,r,-2*r);
glutPostRedisplay();
break;
case 'f':
glRotatef(-3.0f,r,r,-2*r);
glutPostRedisplay();
break;
case 27:
exit(0);
break;
}
}

/*************************************************/
/*void Special(int key ,int x, int y)
功能 :根据键盘控制缩放和平移,
up放大,down缩小,left左平移,right右平移
输入参数:key:键盘 x,y位置
输出参数:无
返回值:无 */
/************************************************/

void Special(int key, int x, int y)
{
switch (key) {
case GLUT_KEY_UP:
glScalef(1.2,1.2,1.2);
glutPostRedisplay();//重新绘制窗口
break;
case GLUT_KEY_DOWN:
glScalef(0.8,0.8,0.8);
glutPostRedisplay();
break;
case GLUT_KEY_LEFT://就是这里想要平移,但是旋转之后就变成绕旋转轴平移,我要怎么消除旋转后的影响????????
glTranslatef(-0.5,0.0,0.0);
glutPostRedisplay();
break;
case GLUT_KEY_RIGHT:
glTranslatef(0.5,0.0,0.0);
glutPostRedisplay();
break;
}
}

int main(int argc, char** argv)
{
glutInit(&argc, argv); //固定格式
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);//缓存模式
glutInitWindowSize(800, 500); //显示框的大小
glutInitWindowPosition(100, 100);//确定显示框左上角的位置
glutCreateWindow("按【s】绕左下角顺时针旋转,按【f】逆时针旋转,按【←】左移,按【→】右移");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutSpecialFunc(Special);
glutMainLoop();//进人GLUT事件处理循环
return 0;
}
...全文
571 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2018-06-09
  • 打赏
  • 举报
回复
平移前先 转 回去 ?
刀口耳 2018-06-09
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster的回复:
左右 都是 glRotatef(-rotAngle,r,r,-2*r); glTranslatef(0.5,0.0,0.0); glRotatef(rotAngle,r,r,-2*r);
啊!是有用的,第一次用这个我把按s的地方改错了,现在可以了
刀口耳 2018-06-09
  • 打赏
  • 举报
回复
引用 9 楼 谁是我的谁的谁的回复:
[quote=引用 3 楼 qq_38787658 的回复:] [quote=引用 2 楼 谁是我的谁的谁的回复:]坐标系没有跟着变化吗?
应该就是坐标系在旋转之后发生了变化[/quote] 实时记录坐标系变化 并且作相应计算[/quote] 虽然知道问题在哪,但是不知道怎么解决
刀口耳 2018-06-09
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster的回复:
左右 都是 glRotatef(-rotAngle,r,r,-2*r); glTranslatef(0.5,0.0,0.0); glRotatef(rotAngle,r,r,-2*r);
我试了一下,按向左键就变成了移一下的同时转一下,移动方向也不是水平方向
  • 打赏
  • 举报
回复
引用 3 楼 qq_38787658 的回复:
[quote=引用 2 楼 谁是我的谁的谁的回复:]坐标系没有跟着变化吗?
应该就是坐标系在旋转之后发生了变化[/quote] 实时记录坐标系变化 并且作相应计算
schlafenhamster 2018-06-09
  • 打赏
  • 举报
回复
左右 都是 glRotatef(-rotAngle,r,r,-2*r); glTranslatef(0.5,0.0,0.0); glRotatef(rotAngle,r,r,-2*r);
schlafenhamster 2018-06-09
  • 打赏
  • 举报
回复
平移前先 转 回去 ? glRotatef(rotAngle,r,r,-2*r); glTranslatef(0.5,0.0,0.0); glRotatef(-rotAngle,r,r,-2*r); glutPostRedisplay(); // GLfloat rotAngle=0.0; case 's': rotAngle += 3.0f; 记录 总 旋转角
刀口耳 2018-06-09
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster的回复:
或者 y 轴 也 平移 一点 如 dy=-0.5*sin(3.0*3.14156/180.0); glTranslatef(-0.5,dy,0.0);
试了不行,干脆把这个直接设置成绕z轴转吧,不让它瞎转了
schlafenhamster 2018-06-09
  • 打赏
  • 举报
回复
或者 y 轴 也 平移 一点 如 dy=-0.5*sin(3.0*3.14156/180.0); glTranslatef(-0.5,dy,0.0);
刀口耳 2018-06-09
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster的回复:
平移前先 转 回去 ?
转玩就不知道哪是正的了
刀口耳 2018-06-09
  • 打赏
  • 举报
回复
引用 2 楼 谁是我的谁的谁的回复:
坐标系没有跟着变化吗?
应该就是坐标系在旋转之后发生了变化
  • 打赏
  • 举报
回复
坐标系没有跟着变化吗?

19,468

社区成员

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

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