`
hereson3
  • 浏览: 162922 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

LOD地形设计(三)

阅读更多
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); }
分享到:
评论

相关推荐

    静态LOD地形网格索引计算 V1 0 修复了前一版的Bug

    "GenLODGridIndex"工具正是为了实现这种静态LOD地形而设计的,它负责计算地形网格的索引,生成不同LOD级别的Chunk。索引计算是关键步骤,因为它决定了哪些多边形在特定LOD级别下应该被显示或忽略。GenLODGridIndex v...

    基于四叉树算法的LOD地形漫游程序

    "基于四叉树算法的LOD地形漫游程序"是一个利用四叉树数据结构实现的Level of Detail (LOD)技术,用于优化大规模地形的显示效果。这个程序是用C++编译器VC(Visual C++)实现的。 四叉树是一种扩展自二叉树的数据...

    地形场景漫游说明文档(LOD地形 )

    场景漫游说明文档 包括场景切割地形LOD无限地形等等

    地形渲染的动态LOD四叉树算法

    地形渲染的动态LOD四叉树算法,读者应该熟悉递归程序设计,以及基本的VC OpenGL编程.

    地形lod模型与飞行模拟

    地形LOD(Level of Detail)模型与飞行模拟是构建大规模三维环境中的关键技术,尤其是在游戏开发、虚拟现实和航空航天领域。LOD技术旨在优化图形渲染性能,通过动态调整模型的细节程度,确保在远距离和近距离观察时...

    基于四叉树的动态多分辨率 L O D地形快速简化

    ### 基于四叉树的动态多分辨率 LOD 地形快速简化 #### 摘要与背景 本文探讨了一种改进的基于四叉树的动态多分辨率 LOD(Level Of Detail)地形简化方法。该方法旨在提高地形模型的简化效率,并优化实时渲染速度。...

    23.湖州市火车站地区城市设计—TOD,LOD.zip

    湖州市火车站地区的城市设计是一个结合了现代交通导向发展(TOD)理念和地形景观级别(LOD)的综合规划项目。本设计旨在优化区域内的交通布局,提升城市功能,并充分考虑环境可持续性,以实现高效、宜居的城市空间。...

    OSG三维地形建模

    OSG,全称为OpenSceneGraph,是一个开源的三维图形库,专为实时渲染高质量的3D场景而设计。在“OSG三维地形建模”这一主题中,我们将深入探讨如何利用OpenSceneGraph来创建和管理复杂的三维地形模型。 首先,三维...

    Automatic LOD 1.07

    在Unity3D中,LOD系统可以通过手动设置或使用插件自动实现,而"Automatic LOD 1.07"就是专为此设计的自动化工具。 该资产的1.07版本代表了经过多次迭代和优化后的成熟产品,开发者可以期待它带来的稳定性和性能提升...

    lod-terrain:平滑体素地形细节水平的原型

    在IT行业中,体素地形(Voxel Terrain)是一种利用三维像素构建虚拟世界的技术,它可以提供比传统多边形网格更高效、更具表现力的地形渲染。"LOD"(Level of Detail)是优化3D图形的一种策略,通过动态调整模型的...

    面向GPU的多LOD因子的大规模场景策略及其原型系统

    面向GPU的多LOD因子的大规模场景策略及其原型系统,是一项深入探讨了如何利用现代图形处理器(GPU)的强大计算能力和并行处理特性,来优化和加速大规模三维场景渲染的技术研究。这一策略尤其针对高分辨率卫星图像、...

    三维地形渲染DEMO

    5. **地形优化**:由于地形往往包含大量多边形,为提高性能,DEMO可能采用了LOD(Level of Detail)技术,根据物体与观察者的距离动态调整地形的细节程度,近处的地形更精细,远处则简化。 6. **着色器**:现代图形...

    基于三维GIS技术的动态LOD渲染方法的实验及验证.docx

    在三维GIS技术中,动态LOD(Level of Detail)渲染是一种关键的技术,它能根据观察者视角和距离自动调整地图的细节程度,从而提高渲染效率和用户体验。针对透视投影下的现有矢量地图动态LOD渲染方法存在的问题,该文...

    三维随机分型地形显示

    在IT领域,三维随机分型地形显示是一...总的来说,"三维随机分型地形显示"是一项结合了计算机图形学、随机算法、地理信息系统和游戏开发技术的综合应用,通过精心设计和编程,可以为用户提供极为生动和真实的虚拟环境。

    海量地形三维仿真系统的设计与实现

    ### 海量地形三维仿真系统的设计与实现 #### 一、引言 随着信息技术的不断发展,三维仿真技术在地理信息系统(GIS)领域的应用越来越广泛。本文介绍了一种基于Creator Terrain Studio (CTS) 和 VegaPrime软件的...

    creator地形制作文件

    计划阶段需深入理解模拟需求,包括飞行高度、视野范围等,这些因素直接影响地形的LOD设计。硬件要求亦不可忽视,必须确保多边形、纹理与光源的数量在硬件承载范围内。多边形预算是平衡真实感与效率的关键,通常建议...

    精通Direct3D图形与动画程序设计 28_第二十八章 三维地形模拟.rar

    在本章“精通Direct3D图形与动画程序设计 28_第二十八章 三维地形模拟”中,我们将深入探讨如何使用Direct3D技术来创建和渲染逼真的三维地形。Direct3D是Microsoft开发的一个图形应用程序接口(API),广泛应用于...

    TerrainLOD

    总的来说,地形LOD是一个综合了算法优化、数据结构设计和渲染技术的复杂领域,它在现代3D图形应用中扮演着至关重要的角色。通过持续的研究和改进,开发者们能够更有效地呈现广阔而细致的虚拟世界,提供更加沉浸式的...

    三维地形生成程序

    三维地形生成程序是一种用于模拟和可视化地理环境的软件工具,它能够通过算法生成逼真的地形模型,广泛应用于游戏开发、地理信息系统(GIS)、城市规划、景观设计等领域。在这个压缩包中,包含的“三维地形生成程序...

Global site tag (gtag.js) - Google Analytics