【问题标题】:Rotation of an object in opengl在opengl中旋转对象
【发布时间】:2016-07-22 05:12:42
【问题描述】:

我需要在按左箭头键时旋转矩形对象。

我无法旋转它,或者它可能是。玩缓冲区可能有问题。

rotatef() 函数放置正确或问题出在哪里。

#include<stdlib.h>
#include<glut.h>
#include<stdio.h>
#include<math.h>
#include<time.h>


void rot()
{   glMatrixMode(GL_MODELVIEW);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity();
    glPushMatrix();

    glRotatef(30,0.0,0.0,1.0);
    glBegin(GL_POLYGON);
                glVertex2i(50,50);
                glVertex2i(170,50);
                glVertex2i(170,100);
                glVertex2i(50,100);
                glEnd();


    glPopMatrix();
}

void shape()
{

    glColor3f(1.0,0.0,0.0);


                glBegin(GL_POLYGON);
                glVertex2i(50,50);
                glVertex2i(170,50);
                glVertex2i(170,100);
                glVertex2i(50,100);
                glEnd();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    shape();
    glutSwapBuffers();
    glFlush();
}
void init()
{
    glClearColor(1.0,1.0,1.0,1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glOrtho(0,700,0,700,-1,1);
    glMatrixMode(GL_MODELVIEW);
}


void Keys(int key,int x,int y)
{
    if(key==GLUT_KEY_LEFT)
        rot();
     glutPostRedisplay();
}

void main(int argc,char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
    glutInitWindowSize(700,700);
    glutCreateWindow("tetris");

    glutDisplayFunc(display);

    glutSpecialFunc(Keys);
    init();
    glutMainLoop();
}

【问题讨论】:

  • 诸如“请、帮助、紧急”之类的语句是不必要的(而且可能会适得其反)。只要写一个好问题(stackoverflow.com/help/how-to-ask),答案就会(可能)来

标签: c++ c visual-studio opengl visual-studio-2008


【解决方案1】:

您在绘制旋转顶点后立即发布重新显示。 因此,在绘制旋转的顶点之后,在您的显示回调函数中,您清除窗口,然后在不旋转的情况下绘制您的顶点。这就是您将看到的内容(没有旋转),直到下一次更新。

一种方法是:

  1. 在显示功能中完成所有绘图
  2. 作为对按键的反应,只需更新角度(我猜您想逐步旋转)并重新显示。不要画任何东西,你的显示函数将使用更新后的角度。

【讨论】:

  • 它现在正在增量旋转,但不是以特定顺序 glRotatef(angle,0.0,0.0,1.0); 角度初始化为 0 并递增 90。它仍然像第一次那样旋转 90 和 270 和 180 及之后按向左箭头 > 10 次。它按顺序进行。
  • 尝试旋转较小的角度,我认为并非所有旋转都显示出来。这就像在电影中对车轮的运动进行采样,看似向后旋转。旋转例如超过 5 度,甚至 1 度。
  • 解决了先生if(key==GLUT_KEY_LEFT){ angle=90;if(angle&gt;360)angle-=360;}而不是angle=90; ,我给了angle+=90;
猜你喜欢
  • 1970-01-01
  • 2017-08-24
  • 2012-02-16
  • 1970-01-01
  • 2019-08-17
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多