openGL漫游功能简单实现
最近弄openGL漫游功能的时候,在网上找了好多源码都没有达到预期效果,然后就自己写了一个算法分享一下。
上下键实现位移,左右键实现转动。
算法思想:由于改变观察点函数原型为:
void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);
所以R的作用就是和角度s_angle算出转动之后眼睛应该看向的位置。
#define PI 3.141592653
#define R 100
static GLfloat s_eye[] = { 0, 0.0, 1 };        // 观察点的位置
static GLfloat s_at[] = { 0.0, 0.0, 0.0 };     //观察点的观察方向
static GLfloat s_angle = 0.0;        //转动角度
tatic float rad = 0;     //根据转动的角度算出弧值
float speed = 0.1;     //移动的速度
.........
s_at[0] = float(s_eye[0] + R * sin(rad));     // 根据转动角度算出眼睛看的物体的位置的x坐标    
	s_at[2] = float(s_eye[2] - 100 * cos(rad));  //根据转动角度算出眼睛看的物体的位置的y坐标
	s_at[1] = s_eye[1];              //z坐标不变
	gluLookAt(s_eye[0], s_eye[1], s_eye[2], s_at[0], s_at[1], s_at[2], 0.0, 1.0, 0.0);
..............
if (g_keys->keyDown[VK_UP])
	{
		rad = float(PI*s_angle / 180.0f);
		s_eye[2] -= (float)cos(rad) * speed;
		s_eye[0] += (float)sin(rad) * speed;
		//如果按上方向键,沿着转换角度后的方向前进,speed为每次前进的步长,通过sin和cos函数实现沿着现
		//有角度方向前进。
	}
	if (g_keys->keyDown[VK_DOWN])
	{
		rad = float(PI*s_angle / 180.0f);
		s_eye[2] += (float)cos(rad) * speed;
		s_eye[0] -= (float)sin(rad) * speed;
		//如果按下方向键,沿着转换角度后的方向后退,speed为每次前进的步长,通过sin和cos函数实现沿着现
		//有角度方向前进。
	}
	if (g_keys->keyDown[VK_LEFT])
	{
		s_angle -= 0.1;
		rad = float(PI*s_angle / 180.0f);    //每次转动0.1度并算出相应的弧度制
	}
	if (g_keys->keyDown[VK_RIGHT])
	{
		s_angle += 0.1;
		rad = float(PI*s_angle / 180.0f);
	}
openGL漫游功能简单实现的更多相关文章
- php对文本文件进行分页功能简单实现
		
php对文本文件进行分页功能简单实现 <!DOCTYPE> <html> <head> <meta http-equiv="Content-type ...
 - HTML-003-模拟IDE代码展开收起功能简单示例
		
当先我们在日常的编程开发工作中使用编程工具(例如 Eclipse.Sublime 等等)都有相应的代码折叠展开功能,如下图所示,极大的方便了我们的编码工作.
 - R语言的帮助使用和图形功能简单介绍
		
R语言的帮助使用和图形功能简单介绍 R语言帮助,在Windows桌面下,有很多种.最长使用的是在命令行下help() > help.start() 会在浏览器中,打开帮助的主页 watermar ...
 - 轩辕展览-VR虚拟展厅设计如何实现全景漫游功能
		
什么是在线3d漫游?如何在VR虚拟展厅设计之中实现3d漫游功能?让我们来分享3dVR虚拟展厅的在线漫游. 实际上,在线3d漫游就是通过3d仿真场景,使用鼠标和键盘在虚拟空间之中自由漫游,它可以从高空俯 ...
 - OpenGL学习-------绘制简单的几何图形
		
本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的 ...
 - OpenGL学习 (一) - 简单窗口绘制
		
一.OpenGL 简介 OpenGL 本质: OpenGL(Open Graphics Library),通常可以认为是API,其包含了一系列可以操作图形.图像的函数.但深究下来,它是由Khronos ...
 - IOS微信分享功能简单实现
		
PS:此文以简单实现功能为主,不足之前还望指点,大神勿喷. 在此之前如何申请微信认证的Key就不说了,公司一般会有人搞 1.首先下载微信SDK:微信SDK下载地址(更多关于微信SDK信息文档请访问官方 ...
 - python网络编程--socketserver 和 ftp功能简单说明
		
1. socketserver 我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信.它是在socket的基础上进行了一层封装,也 ...
 - cesium 实现路径漫游功能
		
功能:路径漫游. 详细:绘制多个路径,删除路径,漫游路径选择,路径漫游. ①绘制路径 ②保存路径 ③路径切换 ④路径漫游 ⑤路径删除 ⑥删除完成
 
随机推荐
- JS  点击弹出图片/ 仿QQ商城点击左右滚动幻灯片/  相册模块,点击弹出图片,并左右滚动幻灯片
			
1, 点击弹出图片 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
 - Odoo 8.0 new API 之Environment
			
""" An environment wraps data for ORM records: - :attr:`cr`, the current database cur ...
 - 【资源】HTML5工具篇:10个营销人也能轻松使用的在线编辑平台
			
一 3, 2015 in 资源 作者:Teeya 2014年,HTML5 页面作为营销界新宠儿,“多快好省”的杰出代表,其灵活性高.开发成本低且制作周期短的种种特性使其在移动营销领域大放异彩. 此前, ...
 - 目录的文件权限-X
			
所有目录务必保持具有X权限(可执行权限)!!,否则无法进入该目录及子目录,且无法读取该目录及子目录下的文件或子目录
 - 使用ZIM桌面维基做笔记
			
最近尝试了使用ZIM做笔记,感觉还不错 ubuntu下直接到软件中心即可安装,或者 sudo apt-get install zim windows下的到此下载http://www.glump.net ...
 - javascript:cors跨域postMessage、xhr2和xmldomain
			
一.h5 postMessage node http-server配置服务器 有关配置:请参考我的http://www.cnblogs.com/leee/p/5502727.html 我把文件夹a配置 ...
 - 微博mid和id转换
			
mid为62进制编码,id为常见的10进制编码. id从低位到高位,7个数字为一组,转换为62进制,并顺序合并,即转换为mid. mid从地位到高位,4个字母为一组,转换为10进制,并右移7位,计算和 ...
 - Angular-表单动态添加删除
			
angular本身不允许去操作DOM,在angular的角度来说,所有操作都以数据为核心,剩下的事情由angular来完成.所以说,想清楚问题的根源,解决起来也不是那么困难. 前提 那么,要做的这个添 ...
 - List与Json的相互转换
			
List 与 Json 的相互转换,需要使用到6个jar包,如果不引用这些jar包,需要写的代码量比较多,这里暂时记录的是使用jar包来进行转换的情况. 下面图片是测试demo的结构,仅供参考,需要注 ...
 - Ehcache Demo
			
转自: https://my.oschina.net/zb0423/blog/60957http://www.cnblogs.com/fsjin/articles/3521261.html Ehcac ...