新手求助(急),一个旋转的立方体问题

LittleFish185 2010-05-24 10:40:59
小鸟刚接触OpenGL,老师给了一个实验,要求是绘制一个3D的彩色立方体,在空闲时绕顶点(1,1,1)X轴方向旋转。下面是我写的代码,但是问题是:1.它不转....(无奈~) 2.绕顶点(1,1,1)不知道怎么做~
帮我修改下面的代码,指点一下吧~

#include <stdlib.h>
#include <GL/glut.h>
#include <stdio.h>

static GLfloat spin = 36.0;
int singleb, doubleb;



void colorcube(void)
{
glRotated(30,0,0,1);
glBegin(GL_QUADS);

glColor3f(0.0, 1.0, 0.0);
glVertex3f( 1.0, 1.0, -1.0);
glVertex3f(-1.0, 1.0, -1.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f( 1.0, 1.0, 1.0);

glColor3f(1.0, 0.5, 0.0);
glVertex3f( 1.0, -1.0, 1.0);
glVertex3f(-1.0, -1.0, 1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f( 1.0, -1.0, -1.0);

glColor3f(1.0, 0.0, 0.0);
glVertex3f( 1.0, 1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(-1.0, -1.0, 1.0);
glVertex3f( 1.0, -1.0, 1.0);

glColor3f(1.0, 1.0, 0.0);
glVertex3f( 1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(-1.0, 1.0, -1.0);
glVertex3f( 1.0, 1.0, -1.0);

glColor3f(0.0, 0.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(-1.0, 1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, 1.0);

glColor3f(1.0, 1.0, 0.0);
glVertex3f( 1.0, 1.0, -1.0);
glVertex3f( 1.0, 1.0, 1.0);
glVertex3f( 1.0, -1.0, 1.0);
glVertex3f( 1.0, -1.0, -1.0);

glEnd();

}




void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

gluLookAt(5.0,5.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
colorcube();

glFlush();
glutSwapBuffers();
}

void spinDisplay (void)
{
spin = spin + 36.0;
if (spin > 360.0)
spin = spin - 360.0;

glutSetWindow(singleb);
glLoadIdentity();
glRotatef (spin, 0.0,1.0, 0.0);
glutPostRedisplay();
glutSetWindow(doubleb);
glLoadIdentity();
glRotatef(spin, 0.0,1.0, 0.0);
glutPostRedisplay();
glFlush();
}



void myReshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(45.0, float(w) / h, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);

}




void init(int width,int height)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST); /* Enable hidden--surface--removal */

glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (float)width / (float)height, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
}



void main(int argc, char **argv)
{
glutInit(&argc, argv);

/* need both double buffering and z buffer */
int winWidth = 650;
int winHeight = 500;

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE |GLUT_DEPTH);
glutInitWindowSize(winWidth, winHeight);
glutCreateWindow("3D Cube");
glutDisplayFunc(display);
init(winWidth,winHeight);
glutReshapeFunc(myReshape);
glutIdleFunc(spinDisplay);
glutMainLoop();
}
...全文
121 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LittleFish185 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangbinds 的回复:]
没用过OpenGL,只用过D3D,所以代码没看。
简单说下思路,不知道OpenGL和D3D是不是一样。
首先定时的改变世界矩阵使物体沿x轴旋转,D3D中是有相关api的,直接可以生成需要的矩阵和世界矩阵相乘即可。
然后把物体平移到(1,1,1)的位置。就好了。
[/Quote]
谢谢您的帮助~
LittleFish185 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 budtang 的回复:]
#include <stdlib.h>
#include <GL/glut.h>
#include <stdio.h>

static GLfloat spin = 36.0;
int singleb, doubleb;

void colorcube(void)
{
// glRotated(30,0,0,1);
glBegin(GL_QUADS);

glColor3f……
[/Quote]

谢谢,我试试~ 我不熟悉C++,又刚学OPENGL,后来用java做了这个习题~
LittleFish185 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhangci226 的回复:]
这句话什么意思??

在空闲时绕顶点(1,1,1)X轴方向旋转
[/Quote]

应该就是绕这个点旋转,呵呵...
budweiser 2010-05-25
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <GL/glut.h>
#include <stdio.h>

static GLfloat spin = 36.0;
int singleb, doubleb;

void colorcube(void)
{
// glRotated(30,0,0,1);
glBegin(GL_QUADS);

glColor3f(0.0, 1.0, 0.0);
glVertex3f( 1.0, 1.0, -1.0);
glVertex3f(-1.0, 1.0, -1.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f( 1.0, 1.0, 1.0);

glColor3f(1.0, 0.5, 0.0);
glVertex3f( 1.0, -1.0, 1.0);
glVertex3f(-1.0, -1.0, 1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f( 1.0, -1.0, -1.0);

glColor3f(1.0, 0.0, 0.0);
glVertex3f( 1.0, 1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(-1.0, -1.0, 1.0);
glVertex3f( 1.0, -1.0, 1.0);

glColor3f(1.0, 1.0, 0.0);
glVertex3f( 1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(-1.0, 1.0, -1.0);
glVertex3f( 1.0, 1.0, -1.0);

glColor3f(0.0, 0.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(-1.0, 1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, 1.0);

glColor3f(1.0, 1.0, 0.0);
glVertex3f( 1.0, 1.0, -1.0);
glVertex3f( 1.0, 1.0, 1.0);
glVertex3f( 1.0, -1.0, 1.0);
glVertex3f( 1.0, -1.0, -1.0);

glEnd();
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(1.f,1.f,1.f);
glRotatef(spin, 1.f,0.f,0.f);

colorcube();
glPopMatrix();
// glFlush();
glutSwapBuffers();
}

void spinDisplay (void)
{
spin = spin + 1.0;
if (spin > 360.0)
spin = spin - 360.0;

//glutSetWindow(singleb);
//glLoadIdentity();
//glRotatef (spin, 0.0,1.0, 0.0);
//glutPostRedisplay();
//glutSetWindow(doubleb);
//glLoadIdentity();
//glRotatef(spin, 0.0,1.0, 0.0);
//glutPostRedisplay();
// glFlush();
}



void myReshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(45.0, float(w) / h, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
gluLookAt(5.0,5.0,10.0,1.0,1.0,1.0,0.0,1.0,0.0);
}

void init(int width,int height)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST); /* Enable hidden--surface--removal */

glShadeModel(GL_SMOOTH);
//glMatrixMode(GL_PROJECTION);
//glLoadIdentity();
//gluPerspective(45.0, (float)width / (float)height, 0.1, 100.0);
//glMatrixMode(GL_MODELVIEW);
}

void TimerFunction(int value)
{
// Redraw the scene with new coordinates
glutPostRedisplay();
glutTimerFunc(3,TimerFunction, 1);
}

void main(int argc, char **argv)
{
glutInit(&argc, argv);

/* need both double buffering and z buffer */
int winWidth = 650;
int winHeight = 500;

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE |GLUT_DEPTH);
glutInitWindowSize(winWidth, winHeight);
glutCreateWindow("3D Cube");
glutDisplayFunc(display);
glutReshapeFunc(myReshape);
glutIdleFunc(spinDisplay);

init(winWidth,winHeight);
glutTimerFunc(33, TimerFunction, 1);
glutMainLoop();
}

楼主,代码按照你的需求改了下, 不过不是很确定“在空闲时绕顶点(1,1,1)X轴方向旋转”这句话的的意思, 好友就是建议楼主在不太清楚某个函数的用法时, 不要乱用, 先查文档看一下究竟是什么意思。
凤朝凰 2010-05-25
  • 打赏
  • 举报
回复
没用过OpenGL,只用过D3D,所以代码没看。
简单说下思路,不知道OpenGL和D3D是不是一样。
首先定时的改变世界矩阵使物体沿x轴旋转,D3D中是有相关api的,直接可以生成需要的矩阵和世界矩阵相乘即可。
然后把物体平移到(1,1,1)的位置。就好了。
张赐 2010-05-25
  • 打赏
  • 举报
回复
这句话什么意思??

在空闲时绕顶点(1,1,1)X轴方向旋转

LittleFish185 2010-05-24
  • 打赏
  • 举报
回复
自己顶一下~没人帮忙?

4,499

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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