立即注册
 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广州大学城网业务调整

[OpenGL] [opengl]模型视图转换 [复制链接] qrcode

查看: 9577 | 回复: 3

523066680
发表于: 2010-5-8 20:06:50 | 显示全部楼层

啊 工作好忙,学习进度好慢,难受啊。。。。
最近刚理解opengl一些基础,因为感觉很基础,所以也没上传~
代码放上来了。
转动控制在 数字按键上, 按8向上转,   2- down ,  4 left,6-right 
 
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define xpix 500
#define ypix 500
int winid;
void display(void)
{
  float i;
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  glPointSize(30);
  glPushMatrix();
   glLineWidth(2);
   glBegin(GL_QUADS);
  
    //left  , red+green=yellow
    glColor3f(0.5,0.5,0.0);
    glVertex3f(-25.0,25.0,25.0);
    glVertex3f(-25.0,25.0,-25.0);
    glVertex3f(-25.0,-25.0,-25.0);
    glVertex3f(-25.0,-25.0,25.0);
   
    //right  , red+blue=...
    glColor3f(0.5,0.0,0.7);
    glVertex3f(25.0,25.0,25.0);
    glVertex3f(25.0,-25.0,25.0);
    glVertex3f(25.0,-25.0,-25.0);
    glVertex3f(25.0,25.0,-25.0);
    //front  
    glColor3f(0.0,0.0,0.8);
    glVertex3f(25.0,25.0,25.0);
    glVertex3f(-25.0,25.0,25.0);
    glVertex3f(-25.0,-25.0,25.0);
    glVertex3f(25.0,-25.0,25.0);
   
    //back
    glColor3f(0.5,0.0,0.0);
    glVertex3f(25.0,25.0,-25.0);
    glVertex3f(25.0,-25.0,-25.0);
    glVertex3f(-25.0,-25.0,-25.0);
    glVertex3f(-25.0,25.0,-25.0);
   glEnd();
  glPopMatrix();
  glutSwapBuffers();
}

void init(void)
{
   glClearColor(0.1,0.0,0.0,0.0);
   glEnable(GL_DEPTH_TEST);
}
void reshape(int x,int y)
{
     float fa=30.0;
     glViewport(0,0,xpix,ypix);
     glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      glOrtho(-80.0,80.0,-80.0,80.0,1.0,100.0);
      //left , right ,down , up , near,far ;
     glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
      gluLookAt(0.0,0.0,fa, 0.0,0.0,1.0,  0.0,1.0,fa);
     
}
void hitkey(unsigned char key,int mousex,int mousey)
{
    static float fa=50.0,ang=0.0,rx=0.0,ry=0.0,rz=0.0,add=5.0;
    switch (key)
    {
       case 'q':
            glutDestroyWindow(winid);
            exit(0);
            break;
       case '8':
            if (rx<360.0) {rx+=add;} else {rx=0.0;}
            break;
       case '2':
            if (rx>0.0) {rx-=add;} else {rx=360.0;}
            break;
       case '4':
            if (ry<360.0) {ry+=add;} else {ry=0.0;}
            break;
       case '6':
            if (ry>0.0) {ry-=add;} else {ry=360.0;}
            break;
    }
    glLoadIdentity();
    gluLookAt(0.0,0.0,fa, 0.0,0.0,1.0,  0.0,1.0,fa);
    glRotatef(rx,-1.0,0.0,0.0);
    glRotatef(ry,0.0,-1.0,0.0);
    glRotatef(rz,0.0,0.0,-1.0);
    glutPostRedisplay();
}
int main(int argc,char *argv[])
{
   glutInit(&argc,argv);
   glutInitWindowPosition(0,0);
   glutInitWindowSize(xpix,ypix);
   glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);
   winid=glutCreateWindow("r to change , q to quit");
   init();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutKeyboardFunc(hitkey);
   glutMainLoop();
   return 0;
}
跳转到指定楼层
523066680
发表于: 2010-6-12 09:40:20 | 显示全部楼层




模型变幻矩阵,自己练习~
w a  s d 四个作为方向键 控制翻转

代码和目标程序请看附件

GL2.rar

67 KB, 下载次数: 6

gwxiaoyun
发表于: 2010-6-12 12:15:05 | 显示全部楼层

523066680
发表于: 2010-6-29 10:32:48 | 显示全部楼层

首先,opengl为你假设了一个摄像头(也是你的视角)在观察物体


默认的情况下 摄像头在正视物体。最简单的情况下你只需要描绘眼前的物体就可以了

而实际上,需要定义的内容有
          摄像头所在位置,镜头所朝方向,指定摄像头的上方坐标

gluLookAt(ax,ay,az,    bx,by,bz,   cx,cy,cz);
比如
gluLookAt(0.0,0.0,10.0, 0.0,0.0,0.0, 0.0,1.0,10.0);
那么就是在 xy面原点,距离z轴原点10.0的地方, 朝立体坐标原点看去。
但是这时还缺一个因素-- 摄像机自身的颠倒,是倒立着看,还是斜着身子看,还是正看
0.0,1.0,10.0 指定了摄像头的上方 -- 在自身所在位置,y=1.0的地方为向上
这个例子中:
要让图像倒过来,向上点可以定义为 0.0,-1.0,10.0

glOrtho(x_act, x_end, y_act, y_end, near, far);
定义 x 坐标范围(左右) , y 坐标范围(上下),
还有两个参数:
上面前四个参数定义的是镜头可以看到的正面的截面大小。(正前方可视范围)

而考虑到实际视图,还需要定义可以看到的最近距离和最远距离。
near,far就是对应的。

一般near和far必须是正的,因为距离是绝对值。

比如 near=1.0 , far=10.0 ,就是说可以看到 离自身 1米 到 10米远的事物

实际上就是定义了整个可视的立体范围。


变幻函数:
glRotatef(angel, isx, isy, isz);
旋转矩阵函数,对于当前视图矩阵,  angle为旋转的角度,(0~360度)
x y z ,谁不等于0, 就表示当前模型将在该轴上旋转 angel度
同时不等于0的话则是不同轴上的组合旋转了。

glRotatef(1.0, 0.0, 0.0, 1.0);
表示 以z轴为核心,逆时针旋转1度。
(关于逆时针个人理解:数学上0度位于3点钟方向(x轴右边), 夹角线逆时针旋转所造成的角度,属于正的角度。)
如果是-1度 则是顺时针旋转。
快速回复 返回顶部 返回列表