opengl中鼠标的问题

fensejingling 2009-05-04 05:17:50
我现在需要做一个小的opengl场景的程序
需要用鼠标操作,之后场景可以变化
就是我点鼠标向左拖动,之后场景就变换到了左边,点右边就到了右边,还可以上下移动,
我找了一个例子,也自己做了一个仿照例子
可是还是不行也不知道是为什么了
哪位大哥大姐的能帮帮我啊
还有一个星期就要交作业了
着急啊
...全文
152 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fensejingling 2009-05-04
  • 打赏
  • 举报
回复
哦,明白啦,我再改改去,谢谢啦
菜牛 2009-05-04
  • 打赏
  • 举报
回复
我没记错的话,你就是那个定义了坐标变化却没有应用到矩阵中去的。你的display 函数中glTranslatef用的都是常量啊!
fensejingling 2009-05-04
  • 打赏
  • 举报
回复
我的程序如下
float heading=0.0, lookupdown=0.0;
float beginX, beginY, currentX, currentY;
GLfloat yrot;
typedef struct {
GLubyte *p;
unsigned int height;
unsigned int width;
} IMGREC;
struct matrix{
float x;
float y;
float z;
} Position;
IMGREC *image[2];
typedef struct {
char id[2];
long int filesize;
long int reserved;
long int headersize;
long int infoSize;
long int width;
long int depth;
short int biPlanes;
short int bits;
char biCompression;
long int biSizeImage;
long int biXPelsPerMeter;
long int biYPelsPerMeter;
long int biClrUsed;
long int biClrImportant;
} BMPREC;
void loadbmp(char *name,IMGREC *img)
{
FILE *fp;
BMPREC data;
int psize;
int i;
GLubyte temp;
if ((fp=fopen(name,"rb"))==NULL)
{
printf("Can't open file.\n");
exit(-1);
}
fread(&(data.id[0]),sizeof(char),1,fp);
fread(&(data.id[1]),sizeof(char),1,fp);
fread(&(data.filesize),sizeof(long int),1,fp);
fread(&(data.reserved),sizeof(long int),1,fp);
fread(&(data.headersize),sizeof(long int),1,fp);
fread(&(data.infoSize),sizeof(long int),1,fp);
fread(&(data.width),sizeof(long int),1,fp);
fread(&(data.depth),sizeof(long int),1,fp);
fread(&(data.biPlanes),sizeof(short int),1,fp);
fread(&(data.bits),sizeof(short int),1,fp);
fread(&(data.biCompression),sizeof(char),1,fp);
fread(&(data.biSizeImage),sizeof(long int),1,fp);
fread(&(data.biXPelsPerMeter),sizeof(long int),1,fp);
fread(&(data.biYPelsPerMeter),sizeof(long int),1,fp);
fread(&(data.biClrUsed),sizeof(long int),1,fp);
fread(&(data.biClrImportant),sizeof(long int),1,fp);
if (!((toupper(data.id[0])=='B')&&(toupper(data.id[1])=='M')))
{
printf("File isn't a bitmap file.\n");
exit(-1);
}
if (data.biCompression!=0)
{
printf("Can't support compress bitmap file.\n");
exit(-1);
}
if (data.bits != 24)
{
printf("data.bits = %d\n",data.bits);
printf("Require only 24 bit bitmap file.\n");
exit(-1);
}
psize=data.depth*data.width*3 ;
if ( (img->p=(GLubyte *)malloc(psize)) == NULL)
{
printf("Out of memory.\n");
exit(-1);
}
fread( img->p, sizeof(GLubyte), psize,fp);
for(i=0;i <psize;i+=3)
{
// bgr --> rgb
temp = img->p[i];
img->p[i] = img->p[i+2];
img->p[i+2] = temp;
};
img->width=data.width;
img->height=data.depth;
fclose(fp);
}
void mouse(int button, int state, int x, int y){
if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN){
beginX=x;
beginY=y;
}
//reset current x and y values
if(button==GLUT_LEFT_BUTTON && state==GLUT_UP){
currentX=currentX+x-beginX;
currentY=currentY+y-beginY;
}
}
void mousemotion(int x, int y){
//currentX + (beginX-x) - direction faced in X
heading = -(x-beginX+currentX)*0.5f;
//currentY + (y-beginY) - direction faced in Y
lookupdown = (y-beginY+currentY)*0.5f;
//rotation about y axis
yrot = heading;

}
void init ( void )
{
GLfloat glfLightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat glfLightDiffuse[] = { 0.7f, 0.7f, 0.7f, 1.0f };
GLfloat glfLightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glLightfv(GL_LIGHT0, GL_AMBIENT, glfLightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, glfLightDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR,glfLightSpecular);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
if((image[0] = (IMGREC *)malloc(sizeof(IMGREC))) == NULL)
{
printf("Out of memory.\n");
exit(-1);
}
loadbmp("wood.bmp",image[0]);
glBindTexture(GL_TEXTURE_2D, 0); // bind this texture to id = 0

// set paremeters for this
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
void drawCube()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D); // enable texture
// use wood texture
glTexImage2D(GL_TEXTURE_2D, 0, 3, image[0]->width, image[0]->height,
0, GL_RGB, GL_UNSIGNED_BYTE, image[0]->p );
glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, 1.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-1.0, -1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(1.0, -1.0, 1.0);
glEnd();

glBegin(GL_POLYGON);
glNormal3f(0.0, 0.0, -1.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0, 1.0, -1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, -1.0, -1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, 1.0, -1.0);
glEnd();

glBegin(GL_POLYGON);
glNormal3f(-1.0, 0.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(-1.0, 1.0, -1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, -1.0, 1.0);
glEnd();

glBegin(GL_POLYGON);
glNormal3f(1.0, 0.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, -1.0, 1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, -1.0, -1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(1.0, 1.0, -1.0);
glEnd();

glBegin(GL_POLYGON);
glNormal3f(0.0, 1.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0, 1.0, -1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(1.0, 1.0, -1.0);
glEnd();

glBegin(GL_POLYGON);
glNormal3f(0.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, -1.0, -1.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, -1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, -1.0, 1.0);
glEnd();
}

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

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -8.0);

drawCube();

glFlush();
glutSwapBuffers();
}

void reshape(int width, int height)
{
GLdouble gldAspect;

gldAspect = width / height;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0,
gldAspect,
1.0,
10.0);
glViewport(0, 0, width, height);
}

void keyboard ( unsigned char key, int x, int y )
{
switch ( key ) {

case 'f':
glutFullScreen ( );
break;
case 'w':
glutReshapeWindow ( 250,250 );
break;
default:
break;
}
}

void idle_func()
{
glutPostRedisplay();
}

int main ( int argc, char** argv )
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(250, 250);
glutCreateWindow(argv[0]);
init();
glutMouseFunc(mouse);
glutMotionFunc(mousemotion);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutIdleFunc(idle_func);
glutMainLoop();
return 0;
}

19,464

社区成员

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

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