- 浏览: 162985 次
- 性别:
- 来自: 广州
最新评论
-
雷蕾_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 990本文列举Jeff Johnson:《GUI设计禁忌》一书中 ... -
LOD地形设计(二)
2010-01-05 05:02 1212自从LOD地形第一节推出以来,受到不少朋友的关注,本人真是受宠 ... -
LOD地形设计(一)
2010-01-05 05:01 1121在大规模的三维场 ... -
Windows SDK笔记
2009-04-16 16:45 1407应程序需求需要重写窗体内子控件某一特定消息,可怜我苦苦找了 ... -
关于的glut 的配置
2009-02-09 17:46 1704OpenGL 是一套 用于三维作图的API。与Direct3 ... -
OpenGL的消隐与双缓冲(2)
2009-02-09 17:46 1639#include "stdafx.h" ... -
C语言读取bmp位图文件(含bmp格式定义)
2009-02-09 17:45 3905loadbmp.h #ifndef _LOADBMP_H_ ... -
openGL贴图(借助glx),并测试性能(FPS)2
2009-02-09 17:45 1194client.c #include <sys/type ... -
alpha混合技术
2009-02-09 17:44 1501alpha混合技术 alpha混合技术对熟悉游戏的人来说不会 ... -
C语言将raw data(rgb/rgba)写成bmp文件(bmp24或32)
2009-02-09 17:44 3734int bmp_write(unsigned char *im ... -
OpenGL坐标变换专题
2009-02-09 17:43 2531OpenGL通过相机模拟、可 ... -
对话框中OpenGL的设置
2009-02-09 17:43 2206from:http://huhuiowen.blog.16 ... -
OpenGL曲线绘制:线段
2009-02-09 17:42 1896以线段方式绘制曲线。例如:正弦曲线。 glBegin(GL_ ... -
用VC++做OpenGL程序框架时出现非法错误
2009-02-09 17:40 10171.OpenGL.cpp 文件包含的头文件有没有{}不配对的情 ... -
opengl编写游戏的可移植性 具体表现
2009-02-09 17:39 1090OpenGL是个与硬件无关的软件接口,可以在不同的平台如Win ... -
什么是显卡的OpenGL模式
2009-02-09 17:39 1670OpenGL是近几年发展起来的一个性能卓越的三维图形标准。 ... -
关于-opengl在魔兽中的应用
2009-02-09 17:38 2009OpenGL在画质上是优于Direct的,这个“画质”不是指感 ... -
如何让显卡支持OpenGL模式????????
2009-02-09 17:38 3338OPENGL 不支持问题 这也 ... -
opengl3D台球源代码
2009-01-20 09:59 24383D台球,可以平面也可以从不同角度击球,使用OPENGL渲染, ... -
Jeff Molofee(NeHe)的OpenGL教程 - 碰撞检测与模型运动
2009-01-20 09:30 1651原 文 : Lesson 31: Collis ...
相关推荐
"GenLODGridIndex"工具正是为了实现这种静态LOD地形而设计的,它负责计算地形网格的索引,生成不同LOD级别的Chunk。索引计算是关键步骤,因为它决定了哪些多边形在特定LOD级别下应该被显示或忽略。GenLODGridIndex v...
"基于四叉树算法的LOD地形漫游程序"是一个利用四叉树数据结构实现的Level of Detail (LOD)技术,用于优化大规模地形的显示效果。这个程序是用C++编译器VC(Visual C++)实现的。 四叉树是一种扩展自二叉树的数据...
场景漫游说明文档 包括场景切割地形LOD无限地形等等
地形渲染的动态LOD四叉树算法,读者应该熟悉递归程序设计,以及基本的VC OpenGL编程.
地形LOD(Level of Detail)模型与飞行模拟是构建大规模三维环境中的关键技术,尤其是在游戏开发、虚拟现实和航空航天领域。LOD技术旨在优化图形渲染性能,通过动态调整模型的细节程度,确保在远距离和近距离观察时...
### 基于四叉树的动态多分辨率 LOD 地形快速简化 #### 摘要与背景 本文探讨了一种改进的基于四叉树的动态多分辨率 LOD(Level Of Detail)地形简化方法。该方法旨在提高地形模型的简化效率,并优化实时渲染速度。...
湖州市火车站地区的城市设计是一个结合了现代交通导向发展(TOD)理念和地形景观级别(LOD)的综合规划项目。本设计旨在优化区域内的交通布局,提升城市功能,并充分考虑环境可持续性,以实现高效、宜居的城市空间。...
OSG,全称为OpenSceneGraph,是一个开源的三维图形库,专为实时渲染高质量的3D场景而设计。在“OSG三维地形建模”这一主题中,我们将深入探讨如何利用OpenSceneGraph来创建和管理复杂的三维地形模型。 首先,三维...
在Unity3D中,LOD系统可以通过手动设置或使用插件自动实现,而"Automatic LOD 1.07"就是专为此设计的自动化工具。 该资产的1.07版本代表了经过多次迭代和优化后的成熟产品,开发者可以期待它带来的稳定性和性能提升...
在IT行业中,体素地形(Voxel Terrain)是一种利用三维像素构建虚拟世界的技术,它可以提供比传统多边形网格更高效、更具表现力的地形渲染。"LOD"(Level of Detail)是优化3D图形的一种策略,通过动态调整模型的...
面向GPU的多LOD因子的大规模场景策略及其原型系统,是一项深入探讨了如何利用现代图形处理器(GPU)的强大计算能力和并行处理特性,来优化和加速大规模三维场景渲染的技术研究。这一策略尤其针对高分辨率卫星图像、...
5. **地形优化**:由于地形往往包含大量多边形,为提高性能,DEMO可能采用了LOD(Level of Detail)技术,根据物体与观察者的距离动态调整地形的细节程度,近处的地形更精细,远处则简化。 6. **着色器**:现代图形...
在三维GIS技术中,动态LOD(Level of Detail)渲染是一种关键的技术,它能根据观察者视角和距离自动调整地图的细节程度,从而提高渲染效率和用户体验。针对透视投影下的现有矢量地图动态LOD渲染方法存在的问题,该文...
在IT领域,三维随机分型地形显示是一...总的来说,"三维随机分型地形显示"是一项结合了计算机图形学、随机算法、地理信息系统和游戏开发技术的综合应用,通过精心设计和编程,可以为用户提供极为生动和真实的虚拟环境。
### 海量地形三维仿真系统的设计与实现 #### 一、引言 随着信息技术的不断发展,三维仿真技术在地理信息系统(GIS)领域的应用越来越广泛。本文介绍了一种基于Creator Terrain Studio (CTS) 和 VegaPrime软件的...
计划阶段需深入理解模拟需求,包括飞行高度、视野范围等,这些因素直接影响地形的LOD设计。硬件要求亦不可忽视,必须确保多边形、纹理与光源的数量在硬件承载范围内。多边形预算是平衡真实感与效率的关键,通常建议...
在本章“精通Direct3D图形与动画程序设计 28_第二十八章 三维地形模拟”中,我们将深入探讨如何使用Direct3D技术来创建和渲染逼真的三维地形。Direct3D是Microsoft开发的一个图形应用程序接口(API),广泛应用于...
总的来说,地形LOD是一个综合了算法优化、数据结构设计和渲染技术的复杂领域,它在现代3D图形应用中扮演着至关重要的角色。通过持续的研究和改进,开发者们能够更有效地呈现广阔而细致的虚拟世界,提供更加沉浸式的...
三维地形生成程序是一种用于模拟和可视化地理环境的软件工具,它能够通过算法生成逼真的地形模型,广泛应用于游戏开发、地理信息系统(GIS)、城市规划、景观设计等领域。在这个压缩包中,包含的“三维地形生成程序...