欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenGL实现摄像机漫游/三次贝塞尔曲线

程序员文章站 2022-03-05 14:49:39
...

通过openglAPI实现摄像机漫游,以及观察生成的贝塞尔曲面

#include "stdafx.h"
#include <GL/glut.h>
#include <stdlib.h>
#include<iostream>
using namespace std;
void init(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0); //背景黑色
}
float posz;
float posx;
float posy;
float speed;
float centerx;
float centery;
float centerz;
float cita = 0;
#define PI 3.1415926
GLfloat ctrlPoints[3][3][3] = { { { -4.0f, 0.0f, 4.0f },
{ -2.0f, 4.0f, 4.0f },
{ 4.0f, 0.0f, 4.0f } },

{ { -4.0f, 0.0f, 0.0f },
{ -2.0f, 4.0f, 0.0f },
{ 4.0f, 0.0f, 0.0f } },

{ { -4.0f, 0.0f, -4.0f },
{ -2.0f, 4.0f, -4.0f },
{ 4.0f, 0.0f, -4.0f } } };
void drawgrid()
{
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    //glLoadIdentity();
    glBegin(GL_LINES);
    for (int i = 0; i < 50; i+=1)
    {   
        glColor3f(1.0, 1.0, 1.0);
        glVertex3f(-25+i,0,50); //定点坐标范围
        glVertex3f(-25+i,0,-50);
    }
    for (int i = 0; i < 50; i += 1)
    {
        glColor3f(1.0, 1.0, 1.0);
        glVertex3f(-50, 0, -25 + i); //定点坐标范围
        glVertex3f(50 + i, 0, -25 + i);
    }
    glEnd();

    glPopMatrix();
}
void DrawPoints()
{
    glPointSize(2.5f);
    glBegin(GL_POINTS); for (int i = 0; i < 3; ++i)for (int j = 0; j < 3; j++)
    {
        glVertex3fv(ctrlPoints[i][j]);
    }
    glEnd();
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0); //画笔白色
    glLoadIdentity();
    gluLookAt(posx, posy,posz, centerx, centery, centerz, 0.0, 1.0, 0.0);
    drawgrid();
    glPushMatrix();
    glTranslatef(0, 0, 10);
    glutWireTeapot(2);
    glPopMatrix();
    glPushMatrix();
    glTranslatef(5, 0, 10);
    glutWireTeapot(2);
    glPopMatrix();
    glPushMatrix();
    glShadeModel(GL_SMOOTH  );
    glPolygonMode(GL_FRONT, GL_FILL);
    glBegin(GL_TRIANGLES);

    glColor3f(1,0,0);
    glVertex3f(2, 0, 0);
    glNormal3f(0, 0, 1);

    glColor3f(0, 1, 0);
    glVertex3f(0, 2, 0);
    glNormal3f(0, 0, 1);

    glColor3f(0, 0, 1);
    glVertex3f(0, 0, 0);
    glNormal3f(0, 0, 1);

    glEnd();
    glPopMatrix();
    glEnable(GL_AUTO_NORMAL);
    glColor3f(1, 0, 0);
    glMap2f(GL_MAP2_VERTEX_3, 0, 10, 3, 3, 0, 10, 9, 3, &ctrlPoints[0][0][0]);
    glEnable(GL_MAP2_VERTEX_3);
    glMapGrid2f(10,0,10.0f,10,0,10);
    glEvalMesh2(GL_LINE, 0, 10, 0, 10);
    DrawPoints();

    glutSwapBuffers();
    cout << posx << " "<<posy<<" "<<posz<<endl;
    cout << centerx << " " << centery << " " << centerz << endl;
    cout << cita << endl;
    cout << endl;
}


void keyboard(unsigned char key,int x,int y) {
    cout << key << " "<<x<<" "<<y<<endl;
    int r = 5;
    switch (key) {
    case 'w':
        posx -= speed*sin(cita/180.0f*PI);
        posz += speed*cos(cita / 180.0f*PI);
        centerx = posx -r* sin(cita / 180.0f*PI);
        centerz = posz + r* cos(cita / 180.0f*PI);
        break;

    case 'v':
        posx -= r*sin(cita / 180.0f*PI);
        posz += r*cos(cita / 180.0f*PI);
        //centerx = posx - r* sin(cita / 180.0f*PI);
        //centerz = posz + r* cos(cita / 180.0f*PI);
        break;
    case's':
        posx += speed*sin(cita / 180.0f*PI);
        posz -= speed*cos(cita / 180.0f*PI);
        centerx = posx -r*sin(cita / 180.0f*PI);
        centerz = posz + r* cos(cita / 180.0f*PI);
        break;
    case'a':
        posx += speed*cos(cita / 180.0f*PI);
        posz += speed*sin(cita / 180.0f*PI);
        centerx = posx - r* sin(cita / 180.0f*PI);
        centerz = posz + r*cos(cita / 180.0f*PI);
        break;
    case'd':
        posx -= speed*cos(cita / 180.0f*PI);
        posz -= speed*sin(cita / 180.0f*PI);
        centerx = posx -r*sin(cita / 180.0f*PI);
        centerz = posz + r* cos(cita / 180.0f*PI);
        break;
    //case 'i':
    //  centery += speed;
    //  break;
    //case'k':
    //  centery-= speed;
    //  break;
    case'j':
        cita--;
        if (cita == 360) cita = 0;
        centerx = posx -r*sin(cita / 180.0f*PI);
        centerz = posz + r* cos(cita / 180.0f*PI);
        break;
    case'l':
        cita++;
        if (cita == -360) cita = 0;
        centerx = posx - r* sin(cita / 180.0f*PI);
        centerz = posz + r*cos(cita / 180.0f*PI);
        break;

    }

    glutPostRedisplay();
}
void reshape(int w, int h)
{
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
int main(int argc, char** argv)
{
    centerx = 5;
    centery = 0;
    centerz = 10;
    posx = posy = posz = 0;
    posy = 1;
    posz = 20;
    speed = 0.5;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow(argv[0]);
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
    return 0;
}

结果图
OpenGL实现摄像机漫游/三次贝塞尔曲线