首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

OpenGL视图变换的一些不明白之处,需解决,好手速进

2013-12-20 
OpenGL视图变换的一些不明白之处,急需解决,高手速进大致模型为围绕原点有四个方体,观察点放在原点,期望可

OpenGL视图变换的一些不明白之处,急需解决,高手速进
大致模型为围绕原点有四个方体,观察点放在原点,期望可以通过键盘事件,观察每个方体,就像独立游戏FEZ那样的效果,遇到的问题是:没有达到这样的效果,到底是哪里的问题呢;
代码如下:


// 摄像机逆时针相对于主墙壁的角度
double angle = 45;

// 初始化建模环境
void init()
{
// 设置清除颜色为黑色
glClearColor(0.0,0.0,0.0,0.0);
// 颜色模型平滑处理
glShadeModel(GL_SMOOTH);
// 启用深度缓存区
glEnable(GL_DEPTH_TEST);
}


// 自定义视图变换函数
void fezView()
{
glLoadIdentity();

// 观察点围绕着圆点,平行于xz平面转动,y轴为法线
glTranslatef(0.0, 0.0, 10.0);// 设置转动半径为10.0
glRotated(-angle, 0.0, 1.0, 0.0);// 围绕y轴转动
}


// 绘制墙壁
void drawWalls()
{
glPushMatrix();// 绘制房间前墙壁
glLoadIdentity();
glColor3f(1.0, 1.0, 0.0);
glScalef(10, 10, 1);
glTranslatef(0.0, 0.0, -150.0);
glutWireSphere(15,50,50);
glPopMatrix();
glPushMatrix();// 绘制房间左墙壁
glLoadIdentity();
glColor3f(1.0, 0.0, 0.0);
glScalef(1, 10, 10);
glTranslatef(-150.0, 0.0, 0.0);
glutWireSphere(15,50,50);
glPopMatrix();
glPushMatrix();// 绘制房间后墙壁
glLoadIdentity();
glColor3f(0.0, 1.0, 0.0);
glScalef(1, 10, 10);
glTranslatef(150.0, 0.0, 0.0);
glutWireSphere(15,50,50);
glPopMatrix();
glPushMatrix();// 绘制房间右墙壁
glLoadIdentity();
glColor3f(0.0, 0.0, 1.0);
glScalef(10, 10, 1);
glTranslatef(0.0, 0.0, 150.0);
glutWireSphere(15,50,50);
glPopMatrix();
}


// 绘制房间物品


// 光照,材质todo
//

// 绘制主世界事物
void FEZ()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// 设置观察点位置固定在房间的中心
fezView();

// 绘制世界
//drawWalls();
glLoadIdentity();
glColor3f(1.0, 0.0, 0.0);
glTranslatef(0.0, 0.0, -100);
glutWireSphere(50,30,30);
glLoadIdentity();
glColor3f(1.0, 1.0, 0.0);
glTranslatef(100.0, 0.0, 0.0);
glutSolidSphere(50,30,30);


glFlush();
glutSwapBuffers();
}


// 键盘事件处理
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 'a':
case 'A':
angle += 90.0;

break;
case 'd':
case 'D':
angle -= 90.0;

break;
default:
break;
}
// 刷新重绘
glutPostRedisplay();
}


// 调整窗口事件处理
void reshape(int w, int h)
{
// 重新设置视口的大小为窗口大小
glViewport(0, 0, (GLsizei)w, (GLsizei)h);

// 指定为投影区域
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// 配置视景体:上下视角60度, 视野长宽比16:9,近10,远200
gluPerspective(60, 16 / 9, 0.01, 10000);

// 视图模型变换,应保证视图变换先与模型变换
glMatrixMode(GL_MODELVIEW);
}


void idle()
{
}




int main(int argc , char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);// 窗口大小
glutInitWindowPosition(100,100);// 初始窗口位置
glutCreateWindow("Room");// 生成窗口,设置标题

init();
glutDisplayFunc(FEZ);// 重绘函数
glutReshapeFunc(reshape);// 注册窗口大小改变事件
glutKeyboardFunc(keyboard);// 注册键盘事件处理函数
//glutIdleFunc(idle);
glutMainLoop();// 主事件循环

return 0;

OpenGL C
[解决办法]
我怎么记得角度单位是弧度?
[解决办法]
引用:
我怎么记得角度单位是弧度?

本来就是弧度。

热点排行