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

通过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;
}


结果图
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值