- 浏览: 159928 次
- 性别:
- 来自: 广州
最新评论
-
雷蕾_ing:
...
python 模拟POST -
blink31:
TextOut不能换行,请问有其他的解决办法吗?
C++下的OpenGL文字显示的完美解决方案 -
lwz7512:
这么强悍!
在优酷的几道笔试题 -
lwz7512:
下了,谢谢分享!
opengl3D台球源代码 -
xltank:
今天过期了。。。
flash builder 序列号
LOD地形根据视点的变化决定是否进行网格分割,因此系统应设计一个视点类,来管理视点相关的数据。这节介绍的视点类是通用的,在很多网站都可下到这个类的代码,它可以用在OPENGL编程的各个场合,当然朋友也可根据需要自己增加相应功能!
/***********************************************************************
* Copyrights Reserved by QinGeSoftware
* Author : Qinge
* Filename : Camera.h 1.0
* Date: 2008-1-10
************************************************************************/
#pragma once
#include "Vector3.h"
class Camera
{
public:
Camera(void);
virtual ~Camera(void);
public:
CVector3 GetPosition(){return m_vPosition;} //获得摄像机位置
CVector3 GetView(){return m_vView;} //获得视线目标点
CVector3 GetUpVector() {return m_vUpVector;} //获得向上方向
CVector3 GetStrafe() {return m_vStrafe;} //获得平移方向的单位向量
void PosotionCamera(float positionX, float positionY, float positionZ,
float viewX, float viewY, float viewZ,
float upVectorX, float upVectorY, float upVectorZ); //初始化摄像机
void RotateView(float angle, float X, float Y, float Z); //绕(x,y,z)旋转angle
void SetViewByMouse(); //通过鼠标旋转场景
void RotateAroundPoint(CVector3 vCenter, float X, float Y, float Z); //绕点旋转
void StrafeCamera(float speed); //平移摄像机
void MoveCamera(float speed); //沿视线方向移动摄像机
void Look(); //设置视点相当于glLookAt()
void Update(); //更新视点位置。
void CheckForMovement(); //检查是否有视点变量更新
private:
CVector3 m_vPosition; //摄像机视点
CVector3 m_vView; //摄像机视线
CVector3 m_vUpVector; //摄像机向上方向
CVector3 m_vStrafe; //摄像机平移
const float fSpeed; //摄像机移动速度
};
/***********************************************************************
* Copyrights Reserved by QinGeSoftware
* Author : Qinge
* Filename : Camera.cpp 1.0
* Date: 2008-1-10
************************************************************************/
#include "StdAfx.h"
#include "Camera.h"
Camera::Camera(void):fSpeed(5.0f)
{
m_vPosition = CVector3(0,0,0);
m_vView = CVector3(0.0,1.0,0.5);
m_vUpVector = CVector3(0.0,0.0,1.0);
}
Camera::~Camera(void)
{
}
void Camera::PosotionCamera(float positionX, float positionY, float positionZ, float viewX, float viewY, float viewZ, float upVectorX, float upVectorY, float upVectorZ)
{
m_vPosition = CVector3(positionX, positionY+200, positionZ);
m_vView = CVector3(viewX, viewY, viewZ);
m_vUpVector = CVector3(upVectorX, upVectorY, upVectorZ);
}
void Camera::SetViewByMouse()
{
CPoint m_CurPt,m_PrePt;
HDC hDC = ::GetDC(NULL);
float angleY, angleZ;
CVector3 m_uAixs, m_vViewDire;
unsigned long WIDTH, HEIGHT;
WIDTH =::GetDeviceCaps(hDC,HORZRES); //获得屏幕分辨率
HEIGHT =::GetDeviceCaps(hDC,VERTRES); //
::GetCursorPos(&m_CurPt);
m_PrePt.x = WIDTH >>1; //分辨率/2
m_PrePt.y = HEIGHT >> 1;
::SetCursorPos(m_PrePt.x, m_PrePt.y); //固定光标在屏幕中心
angleY = (m_CurPt.x - m_PrePt.x )/1000.0; //根据鼠标移动距离确定旋转角度
angleZ = (m_CurPt.y - m_PrePt.y )/1000.0; //
m_vViewDire = m_vView - m_vPosition;
m_uAixs = m_vViewDire.CrossProduct(m_vViewDire,m_vUpVector); //得到平移向量
m_uAixs = m_uAixs.Normalize(m_uAixs);
RotateView(angleZ, m_uAixs.x, m_uAixs.y, m_uAixs.z); //绕任意轴旋转
RotateView(angleY,0,1,0); //绕y轴旋转
}
void Camera::RotateView(float angle, float x, float y, float z)
{
CVector3 vNewView;
CVector3 vView = m_vView - m_vPosition; //视线方向
float cosTheta = (float)cos(angle);
float sinTheta = (float)sin(angle);
//下面就是一个数学公式
vNewView.x = (cosTheta + (1 - cosTheta) * x * x) * vView.x;
vNewView.x += ((1 - cosTheta) * x * y - z * sinTheta) * vView.y;
vNewView.x += ((1 - cosTheta) * x * z + y * sinTheta) * vView.z;
vNewView.y = ((1 - cosTheta) * x * y + z * sinTheta) * vView.x;
vNewView.y += (cosTheta + (1 - cosTheta) * y * y) * vView.y;
vNewView.y += ((1 - cosTheta) * y * z - x * sinTheta) * vView.z;
vNewView.z = ((1 - cosTheta) * x * z - y * sinTheta) * vView.x;
vNewView.z += ((1 - cosTheta) * y * z + x * sinTheta) * vView.y;
vNewView.z += (cosTheta + (1 - cosTheta) * z * z) * vView.z;
m_vView = m_vPosition + vNewView; //视点+新向量=新视线目标点
}
void Camera::StrafeCamera(float speed)
{
//给视线目标点,视点增加一个增量
m_vPosition.x += m_vStrafe.x * speed;
m_vPosition.z += m_vStrafe.z * speed;
m_vView.x += m_vStrafe.x * speed;
m_vView.z += m_vStrafe.z * speed;
}
void Camera::MoveCamera(float speed)
{
CVector3 vVector = m_vView - m_vPosition;
vVector = vVector.Normalize(vVector);
m_vPosition.x += vVector.x * speed; //沿视线方向移动
m_vPosition.z += vVector.z * speed; //
m_vView.x += vVector.x * speed; //
m_vView.z += vVector.z * speed; //
}
void Camera::Update()
{
CVector3 vCross =m_vView.CrossProduct(m_vView - m_vPosition, m_vUpVector);
m_vStrafe = vCross.Normalize(vCross);
SetViewByMouse();
CheckForMovement();
}
void Camera::CheckForMovement() // 上下左右移动视点
{
if(GetKeyState(VK_UP) & 0x80 || GetKeyState('W') & 0x80)
{
MoveCamera(fSpeed);
}
if(GetKeyState(VK_DOWN) & 0x80 || GetKeyState('S') & 0x80)
{
MoveCamera(-fSpeed);
}
if(GetKeyState(VK_LEFT) & 0x80 || GetKeyState('A') & 0x80)
{
StrafeCamera(-fSpeed);
}
if(GetKeyState(VK_RIGHT) & 0x80 || GetKeyState('D') & 0x80)
{
StrafeCamera(fSpeed);
}
}
void Camera::Look() //等于gluLookAt()
{
gluLookAt(m_vPosition.x, m_vPosition.y, m_vPosition.z,
m_vView.x, m_vView.y, m_vView.z,
m_vUpVector.x, m_vUpVector.y, m_vUpVector.z);
}
发表评论
-
GUI设计禁忌
2010-01-07 12:02 956本文列举Jeff Johnson:《GUI设计禁忌》一书中 ... -
LOD地形设计(二)
2010-01-05 05:02 1185自从LOD地形第一节推出以来,受到不少朋友的关注,本人真是受宠 ... -
LOD地形设计(一)
2010-01-05 05:01 1086在大规模的三维场 ... -
Windows SDK笔记
2009-04-16 16:45 1377应程序需求需要重写窗体内子控件某一特定消息,可怜我苦苦找了 ... -
关于的glut 的配置
2009-02-09 17:46 1668OpenGL 是一套 用于三维作图的API。与Direct3 ... -
OpenGL的消隐与双缓冲(2)
2009-02-09 17:46 1596#include "stdafx.h" ... -
C语言读取bmp位图文件(含bmp格式定义)
2009-02-09 17:45 3856loadbmp.h #ifndef _LOADBMP_H_ ... -
openGL贴图(借助glx),并测试性能(FPS)2
2009-02-09 17:45 1158client.c #include <sys/type ... -
alpha混合技术
2009-02-09 17:44 1468alpha混合技术 alpha混合技术对熟悉游戏的人来说不会 ... -
C语言将raw data(rgb/rgba)写成bmp文件(bmp24或32)
2009-02-09 17:44 3658int bmp_write(unsigned char *im ... -
OpenGL坐标变换专题
2009-02-09 17:43 2504OpenGL通过相机模拟、可 ... -
对话框中OpenGL的设置
2009-02-09 17:43 2140from:http://huhuiowen.blog.16 ... -
OpenGL曲线绘制:线段
2009-02-09 17:42 1821以线段方式绘制曲线。例如:正弦曲线。 glBegin(GL_ ... -
用VC++做OpenGL程序框架时出现非法错误
2009-02-09 17:40 9761.OpenGL.cpp 文件包含的头文件有没有{}不配对的情 ... -
opengl编写游戏的可移植性 具体表现
2009-02-09 17:39 1051OpenGL是个与硬件无关的软件接口,可以在不同的平台如Win ... -
什么是显卡的OpenGL模式
2009-02-09 17:39 1620OpenGL是近几年发展起来的一个性能卓越的三维图形标准。 ... -
关于-opengl在魔兽中的应用
2009-02-09 17:38 1940OpenGL在画质上是优于Direct的,这个“画质”不是指感 ... -
如何让显卡支持OpenGL模式????????
2009-02-09 17:38 3255OPENGL 不支持问题 这也 ... -
opengl3D台球源代码
2009-01-20 09:59 23943D台球,可以平面也可以从不同角度击球,使用OPENGL渲染, ... -
Jeff Molofee(NeHe)的OpenGL教程 - 碰撞检测与模型运动
2009-01-20 09:30 1616原 文 : Lesson 31: Collis ...
相关推荐
场景漫游说明文档 包括场景切割地形LOD无限地形等等
地形渲染的动态LOD四叉树算法,读者应该熟悉递归程序设计,以及基本的VC OpenGL编程.
基于GML3.0与Direct3D的三维地形可视化研究与实现 基于LOD实时图形绘制和加速技术 基于VRML的虚拟现实系统的研究 基于VRML和VRMLScript的虚拟现实仿真研究 基于显微镜图像的三维场景重建技术研究 三维GIS和3DMAX相...
13.1.1 地形与地理信息 354 13.1.2 特效实现 356 13.1.3 扩展节点组件 358 13.1.4 数据和场景管理 358 13.1.5 其他语言封装 360 13.2 开发者资源 360 13.2.1 实用网址 360 13.2.2 用户群体简介 361 13.3 ...
LOD(Level Of Detail,层次细节)技术是解决大规模地形实时渲染的关键技术之一,通过这种技术可以较好地简化场景的复杂度,减少图形显示的失真度,满足一定的实时性要求。传统的算法将四叉树和LOD技术相结合将大...
降落伞应用日益广泛....并以VS2010为开发平台,利用ChinaStar GIS组件,设计与开发了基于三维大地形模型的飞机空投降落伞一体化仿真系统.通过对系统的试用和检验表明,系统对降落伞投放环境、飞机(队列)飞行及
采用动态分页调度算法结合LOD技术实现了海量三维地形数据的加载与显示,研究三维军标绘制技术,提出了一种基于可视范围动态计算投影区域的方法,解决了三维线、面标号纹理模糊不清问题。采用MVC设计模式搭建二三维...
文中在对基于该技术实现的天津港三维港区与航道信息管理系统进行简单介绍的基础上,重点研究了基于空间网格索引技术、Delaunay三角网技术与LOD技术的港口地面景观与地形模型的动态组织与管理,以及基于多线程技术和...
1. 动态GPU地形(Dynamic GPU Terrain) 2. 在GPU上通过镶嵌的带宽高效程序化网格(Bandwidth-Efficient Procedural Meshes in the GPU via Tessellation) 3. 物体碰撞时细分表面的实时形变(Real-Time ...
专为快速工作流程而设计,具有许多随时可用的功能,正等着您。 要了解更多信息,请访问网站( )。 该存储库包含一个开源的公共C#API以及亚麻编辑器的完整源代码。 欢迎任何人在基于Flax的游戏中贡献或使用修改后...