(一)世界坐标系向观察坐标系的转换
假如任何形体都放在世界坐标系中,那么计算是相当复杂的,为了简化计算,我们需要把形体从世界坐标系转到观察坐标系中。观察坐标系的原点在是世界坐标系的位置为Eye,Z轴与观察方向一致(从Eye出发到At点的向量)如图4-1所示:
图4-1
假设观察坐标系的坐标轴分别以单位向量xaxis,yaxis,zaxis,则:
xaxis= normal (At-Eye);
yaxis= normal (cross(Up,zaxis));
zaxis= normal (zaxis,xaxis);
假设世界坐标系中任意一点P的坐标(x,y,z),在观察坐标系中的坐标(x',y',z')。
x' = (P-Eye)* xaxis = x*xaxis.x + y* xaxis.y + z * xaxis.z - xaxis*Eye
y' = (P- Eye)*yaxis = x*yaxis.x + y* yaxis.y + z * yaxis.z - yaxis*Eye
z'= (P- Eye)*zaxis = x*zaxis.x + y* zaxis.y + z * zaxis.z - zaxis*Eye
(x',y',z',1) = (x,y,z,1)*
所以从世界坐标系向观察坐标系变换的矩阵为
(二)齐次裁剪透视投影变换
真实的物体是三维的,但是计算机屏幕是二维的,必须把三维物体投影到屏幕平面上,而且还要保存深度信息,这个变换过程称为投影变换,如图4-2所示
图4-2
假设视截体Y方向的张角fov,近平面Zn,远平面的Zf,近平面的宽高比aspect,现在可以直到近平面的方程z=Zn,远平面 z=Zf。
图4-3
由图4-3可以看出,视截体的顶面方程为y=z*tan(fov/2);底面方程=-z*tan(fov/2);视截体的右侧面x=cot(fov/2)*aspect*z.
左侧面方程x=-cot(fov/2)*aspect*z.
首先寻求把顶面y = z*tan(fov/2) 转换为y'=1,y'=k*y ,k=cot(fov/2)*y/z就是满足条件的变换,底面变换也是这个表达式。
右侧面x = cot(fov/2)*aspect*z,转换为x'=1, x'=p*x, 从而p=(tan(fov/2)/aspect)/z(左侧面表达式相同).
最后寻求把近平面Zn转换为z'=0;Zf转换为z'=1. z'= r*z + s.于是r* Zn + s =0,r*Zf + s =1,由此求出 r= /(Zf-Zn), s= -Zn/(Af-Zn).
透视投影变换矩阵=
(三)视截体平面的计算
根据模型变换矩阵和投影变换矩阵,可以计算出视截体的6个平面。世界坐标系中的视截体在模型变换和透视投影变换后,成为观察坐标系中的[-1,1]*[-1,1]*[0,1]。设模型变换A,投影变换B,M=A*B,视截体的方程:ax+by+cz+d=0。该平面在观察坐标系中的形式为a'x'+b'y'+c'z'+d'=0.
(x',y',z',1) = (x,y,z,1)M
(x,y,z,1)(a,b,c,d)(转置)=0
(x',y',z',1)(a',b',c',d')(转置) = 0
可得:(x,y,z,1)M(a',b',c',d')(转置) = 0
(a,b,c,d)(转置)= M (a',b',c',d')(转置)
a=M11a'+M12b'+M13c'+M14d'
b=M21a'+M22b'+M23c'+M24d'
c=M31a'+M32b'+M33c'+M34d'
d=M41a'+M42b'+M43c'+M44d'
视截体的6个平面的法向量均指向视截体内部,视截体的左侧面leftplane 观察坐标系中的左侧面x+1=0 ,代入上式可得视截体左侧面的系数
a=M11+M14
b=M21+M24
c=M31+M34
d=M41+M44
右侧面的方程1-x=0;系数
a=M14-M11
b=M24-M21
c=M34-M31
d=M44-M41
同理:顶面系数
a=M14-M12
b=M24-M22
c=M24-M32
d=M44-M42
底面系数
a=M12+M14
b=M22+M24
c=M32+M34
d=M42+M44
近平面系数:
a=M13
b=M23
c=M33
d=M43
远平面系数:
a=M14-M13
b=M24-M23
c=M34-M33
d=M44-M43
上述内容是涉及视截体计算的数学基础,下一节实战视截体编程!
分享到:
相关推荐
"基于四叉树算法的LOD地形漫游程序"是一个利用四叉树数据结构实现的Level of Detail (LOD)技术,用于优化大规模地形的显示效果。这个程序是用C++编译器VC(Visual C++)实现的。 四叉树是一种扩展自二叉树的数据...
"GenLODGridIndex"工具正是为了实现这种静态LOD地形而设计的,它负责计算地形网格的索引,生成不同LOD级别的Chunk。索引计算是关键步骤,因为它决定了哪些多边形在特定LOD级别下应该被显示或忽略。GenLODGridIndex v...
地形渲染的动态LOD四叉树算法,读者应该熟悉递归程序设计,以及基本的VC OpenGL编程.
场景漫游说明文档 包括场景切割地形LOD无限地形等等
### 基于四叉树的动态多分辨率 LOD 地形快速简化 #### 摘要与背景 本文探讨了一种改进的基于四叉树的动态多分辨率 LOD(Level Of Detail)地形简化方法。该方法旨在提高地形模型的简化效率,并优化实时渲染速度。...
地形LOD(Level of Detail)模型与飞行模拟是构建大规模三维环境中的关键技术,尤其是在游戏开发、虚拟现实和航空航天领域。LOD技术旨在优化图形渲染性能,通过动态调整模型的细节程度,确保在远距离和近距离观察时...
湖州市火车站地区的城市设计是一个结合了现代交通导向发展(TOD)理念和地形景观级别(LOD)的综合规划项目。本设计旨在优化区域内的交通布局,提升城市功能,并充分考虑环境可持续性,以实现高效、宜居的城市空间。...
在Unity3D中,LOD系统可以通过手动设置或使用插件自动实现,而"Automatic LOD 1.07"就是专为此设计的自动化工具。 该资产的1.07版本代表了经过多次迭代和优化后的成熟产品,开发者可以期待它带来的稳定性和性能提升...
"lod-terrain"项目就是将LOD技术应用到体素地形的一个原型实现,旨在提高游戏或虚拟环境中的地形渲染效率。 这个项目基于Rust编程语言进行开发,Rust是一门系统级语言,以其内存安全和高性能而著名,特别适合于开发...
在这个项目中,“opengl与四叉树模拟地形源码”是利用OpenGL和四叉树数据结构来实现地形的高效渲染和管理。 四叉树是一种扩展自二叉树的数据结构,特别适用于处理二维空间的分割问题。在3D图形学中,特别是在地形...
- **LOD动态调整**: 根据观察者的位置和视角,动态调整地形的LOD等级,使得远处的地形使用较低的细节级别,而近处的地形则使用较高的细节级别,从而在不影响用户体验的前提下节省计算资源。 - **GPU与CPU通信**: ...
总的来说,地形LOD是一个综合了算法优化、数据结构设计和渲染技术的复杂领域,它在现代3D图形应用中扮演着至关重要的角色。通过持续的研究和改进,开发者们能够更有效地呈现广阔而细致的虚拟世界,提供更加沉浸式的...
计划阶段需深入理解模拟需求,包括飞行高度、视野范围等,这些因素直接影响地形的LOD设计。硬件要求亦不可忽视,必须确保多边形、纹理与光源的数量在硬件承载范围内。多边形预算是平衡真实感与效率的关键,通常建议...
对于非地球类的地形设计,例如太空游戏中的外星地貌,这种调整可以更加自由和创意化。 #### 一.地形生成算法 地形生成算法是创建逼真地形的核心技术之一。本节将重点介绍两种常用的算法:Fault Formation 和 ...
这种设计使得大型地形的渲染变得高效,但同时也限制了对地形的某些高级操作。 转换地形为Mesh,我们可以利用Unity的内置API,如`Terrain.activeTerrain.mesh`,来获取地形的Mesh数据。然而,这个过程需要注意的是,...
5. **地形LOD(细节层次)**: 根据观察距离动态调整地形细节,优化性能。 6. **渲染**: 设置管线状态,调用DrawIndexedPrimitive绘制地形。 在"Chapter 13"中,可能详细讲解了如何使用Direct3D实现这些步骤,以及...
- LOD:在大规模地形渲染时,为了平衡性能和细节,常常采用LOD技术,根据观察者与地形的距离动态调整细节级别,近处的地形更精细,远处的则简化。 4. **光照模型与视点变换** - 光照模型:模拟自然光或人造光源对...
此外,还可以添加LOD(Level of Detail)技术,根据观察距离动态调整地形的细节程度,以提高渲染效率。 在实际绘制过程中,地形的边缘可能会出现明显的锯齿现象。为解决这一问题,我们可以采用抗锯齿技术,如MSAA...
这些特性允许开发者在运行时生成或修改地形,极大地扩展了地形设计的可能性。 为了优化性能,Unity地形系统支持LOD,这意味着离玩家较远的地形会显示较低的细节水平,而近处的地形则会显示更丰富的细节。这使得大...