使用键盘旋转——glut/OpenGL
我试图使我的对象根据需要的轴旋转(通过按x、y、z),然后用相同的键启动/停止旋转。这是我的密码:使用键盘旋转——glut/OpenGL,opengl,glut,Opengl,Glut,我试图使我的对象根据需要的轴旋转(通过按x、y、z),然后用相同的键启动/停止旋转。这是我的密码: #include <glut.h> #include <stdio.h> static GLfloat spin = 0.0; void init(void){ glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); } void action(void) { } void display(void)
#include <glut.h>
#include <stdio.h>
static GLfloat spin = 0.0;
void init(void){
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
}
void action(void)
{
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glBegin(GL_LINE_LOOP);
glColor3f(1.00, 0.00, 0.00);
glVertex3f(0.00, 0.00, 0.00);
glVertex3f(0.00, 0.00, -1.00);
glVertex3f(0.50, 0.00, -1.00);
glVertex3f(0.75, 0.0, -0.75);
glVertex3f(0.25, 0.25, -1.0);
glVertex3f(0.50, 0.50, -0.50);
glColor3f(0.00, 1.00, 0.00);
glVertex3f(0.00, 0.00, 0.00);
glVertex3f(0.00, 0.00, 1.00);
glVertex3f(0.50, 0.00, 1.00);
glVertex3f(0.75, 0.0, 0.75);
glVertex3f(0.25, 0.25, 1.0);
glVertex3f(0.50, 0.50, 0.50);
glEnd();
glPopMatrix();
glutSwapBuffers();
glFlush();
}
//spin function
void spinDisplay(void){
spin = spin + 0.02;
if (spin > 360.0)
spin = spin - 360.0;
glutPostRedisplay();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 0.5, 15.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(1.5, 1.5, 1.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
//keyboard event handler
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 27: // Escape key
exit(0);
break;
case 'x':
glRotatef(spin, 1.0, 0.0, 0.0);
break;
case 'y':
glRotatef(spin, 0.0, 1.0, 0.0);
break;
case 'z':
glRotatef(spin, 0.0, 0.0, 1.0);
break;
case 'r':
glutIdleFunc(action);
break;
}
glutPostRedisplay();
}
void mouse(int button, int state, int x, int y){
switch (button){
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(spinDisplay);
break;
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutKeyboardFunc(keyboard);
glutIdleFunc(action);
glutMainLoop();
return 0;
}
#包括
#包括
静态GLfloat自旋=0.0;
void init(void){
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_平滑);
}
无效行动(无效)
{
}
作废显示(作废)
{
glClear(GLU颜色缓冲位);
glPushMatrix();
glBegin(GL_线_环);
GL3F(1.00,0.00,0.00);
glVertex3f(0.00,0.00,0.00);
glVertex3f(0.00,0.00,-1.00);
glVertex3f(0.50,0.00,-1.00);
glVertex3f(0.75,0.0,-0.75);
glVertex3f(0.25,0.25,-1.0);
glVertex3f(0.50,0.50,-0.50);
GL3F(0.00,1.00,0.00);
glVertex3f(0.00,0.00,0.00);
glVertex3f(0.00,0.00,1.00);
glVertex3f(0.50,0.00,1.00);
glVertex3f(0.75,0.0,0.75);
glVertex3f(0.25,0.25,1.0);
glVertex3f(0.50,0.50,0.50);
格伦德();
glPopMatrix();
glutSwapBuffers();
glFlush();
}
//自旋函数
void显示(void){
自旋=自旋+0.02;
如果(旋转>360.0)
自旋=自旋-360.0;
再发现();
}
空洞重塑(整数w,整数h)
{
GLVIEW(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_投影);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,0.5,15.0);
glMatrixMode(GLU模型视图);
glLoadIdentity();
gluLookAt(1.5,1.5,1.5,0.0,0.0,0.0,0.0,1.0,0.0);
}
//键盘事件处理程序
无效键盘(无符号字符键,整数x,整数y)
{
开关(钥匙)
{
案例27://逃生钥匙
出口(0);
打破
案例“x”:
glRotatef(自旋,1.0,0.0,0.0);
打破
案例“y”:
glRotatef(自旋,0.0,1.0,0.0);
打破
案例“z”:
glRotatef(自旋,0.0,0.0,1.0);
打破
案例“r”:
glutIdleFunc(行动);
打破
}
再发现();
}
无效鼠标(int按钮、int状态、int x、int y){
开关(按钮){
案例过量左按钮:
如果(状态==GLUT\U DOWN)
glutIdleFunc(旋转显示);
打破
案例过量右按钮:
如果(状态==GLUT\U DOWN)
glutIdleFunc(空);
打破
违约:
打破
}
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500500);
位置(100100);
glutCreateWindow(argv[0]);
init();
GLUTREFORUNC(重塑);
glutDisplayFunc(显示器);
glutMouseFunc(小鼠);
键盘Func(键盘);
glutIdleFunc(行动);
glutMainLoop();
返回0;
}
我在键盘上有我想要的每个键,但我想知道glRotatef——也就是说,它是否属于那里。我创建了一个函数action,我打算用它调用glutIdleFunc(),但不确定如何将旋转合并到它中。即使我能得到一些关于我的键盘呼叫如何/为什么不正确的澄清,那也太好了 保持状态
您希望将当前旋转状态写入某个变量。这样,当你想画你的场景时,它就会被知道
struct rot_state {
bool rotating; // animation/movement happening
float x,y,z; // current rotation values
int current_axis; // 0 for x, 1 for y, 2 for z
}
该状态保持当前旋转,程序可以处理该旋转
动画
glutIdleFunc
通过增加(动画化)正确轴来完成本例中的所有工作app_state.x+=increment代码>
Glut调用每次都是在它无所事事并处理循环时进行的。因此,它被用作动画逻辑的门,然后强制在帧上重画
虽然可以做得更好,但我不想模糊原始代码
陈列
显示帧时,您可以只使用已有的信息并应用旋转
glRotatef(app_state.x, 1, 0, 0);
glRotatef(app_state.y, 0, 1, 0);
glRotatef(app_state.z, 0, 0, 1);
密码
#包括
#包括
结构状态{
布尔旋转;//动画/运动正在发生
浮动x,y,z;//当前旋转值
int current_axis;//0代表x,1代表y,2代表z
}应用程序状态;
void init(void){
//设置初始应用程序状态
app_state.rotating=false;
app_state.x=app_state.y=app_state.z=0.0f;
app_state.current_轴=0;
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_平滑);
}
无效行动(无效)
{
//为旋转设置动画
浮动增量=1.0f;
开关(应用程序状态、当前轴)
{
案例0:
app_state.x+=增量;
打破
案例1:
app_state.y+=增量;
打破
案例2:
app_state.z+=增量;
打破
违约:
打破
}
再发现();
}
作废显示(作废)
{
glClear(GLU颜色缓冲位);
glPushMatrix();
//应用旋转
glRotatef(app_state.x,1,0,0);
glRotatef(应用程序状态y,0,1,0);
glRotatef(app_state.z,0,0,1);
glBegin(GL_线_环);
GL3F(1.00,0.00,0.00);
glVertex3f(0.00,0.00,0.00);
glVertex3f(0.00,0.00,-1.00);
glVertex3f(0.50,0.00,-1.00);
glVertex3f(0.75,0.0,-0.75);
glVertex3f(0.25,0.25,-1.0);
glVertex3f(0.50,0.50,-0.50);
GL3F(0.00,1.00,0.00);
glVertex3f(0.00,0.00,0.00);
glVertex3f(0.00,0.00,1.00);
glVertex3f(0.50,0.00,1.00);
glVertex3f(0.75,0.0,0.75);
glVertex3f(0.25,0.25,1.0);
glVertex3f(0.50,0.50,0.50);
格伦德();
glPopMatrix();
glutSwapBuffers();
glFlush();
}
空洞重塑(整数w,整数h)
{
GLVIEW(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_投影);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,0.5,15.0);
glMatrixMode(GLU模型视图);
glLoadIdentity();
gluLookAt(1.5,1.5,1.5,0.0,0.0,0.0,0.0,1.0,0.0);
}
//键盘事件处理程序
无效键盘(无符号字符键,整数x,整数y)
{
开关(钥匙)
{
案例27://逃生钥匙
出口(0);
打破
案例“x”:
app_state.current_轴=0;
打破
案例“y”:
app_state.current_轴=1;
打破
案例“z”:
app_状态。当前_轴=2;
打破
案例“r”:
app_state.rotating^=1;
glutIdleFunc(应用程序状态旋转?操作:NULL);
打破
}
再发现();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
#include <glut.h>
#include <stdio.h>
struct rot_state {
bool rotating; // animation/movement happening
float x,y,z; // current rotation values
int current_axis; // 0 for x, 1 for y, 2 for z
} app_state;
void init(void){
// Setting up initial app state
app_state.rotating = false;
app_state.x = app_state.y = app_state.z = 0.0f;
app_state.current_axis = 0;
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
}
void action(void)
{
// Animate the rotation
float increment = 1.0f;
switch (app_state.current_axis)
{
case 0:
app_state.x += increment;
break;
case 1:
app_state.y += increment;
break;
case 2:
app_state.z += increment;
break;
default:
break;
}
glutPostRedisplay();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
// Apply the rotations
glRotatef(app_state.x, 1, 0, 0);
glRotatef(app_state.y, 0, 1, 0);
glRotatef(app_state.z, 0, 0, 1);
glBegin(GL_LINE_LOOP);
glColor3f(1.00, 0.00, 0.00);
glVertex3f(0.00, 0.00, 0.00);
glVertex3f(0.00, 0.00, -1.00);
glVertex3f(0.50, 0.00, -1.00);
glVertex3f(0.75, 0.0, -0.75);
glVertex3f(0.25, 0.25, -1.0);
glVertex3f(0.50, 0.50, -0.50);
glColor3f(0.00, 1.00, 0.00);
glVertex3f(0.00, 0.00, 0.00);
glVertex3f(0.00, 0.00, 1.00);
glVertex3f(0.50, 0.00, 1.00);
glVertex3f(0.75, 0.0, 0.75);
glVertex3f(0.25, 0.25, 1.0);
glVertex3f(0.50, 0.50, 0.50);
glEnd();
glPopMatrix();
glutSwapBuffers();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 0.5, 15.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(1.5, 1.5, 1.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
//keyboard event handler
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 27: // Escape key
exit(0);
break;
case 'x':
app_state.current_axis = 0;
break;
case 'y':
app_state.current_axis = 1;
break;
case 'z':
app_state.current_axis = 2;
break;
case 'r':
app_state.rotating ^= 1;
glutIdleFunc(app_state.rotating ? action : NULL);
break;
}
glutPostRedisplay();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutIdleFunc(action);
glutMainLoop();
return 0;
}