C++Directx11开发笔记五:3D空间坐标系认识

简介:

在前一篇文章中我们知道了顶点着色器和像素着色器的用途,在例子中也知道了如何在3D的坐标系中画一个2D的图像,即画一个三角形,这次我们需要知道如何在3D坐标系中呈现一个3D的图像,并且了解一下在3D空间中几个坐标系的认识。这些在游戏编程中都会使用到,因为每个3D物件都有自己的坐标系,至于如何转换这些坐标系我想可能我们需要在下一节中进行另一番讨论。学习是无止境的,贵在坚持,希望我也能够坚持我童年时的梦想,在不久的将来实现我的游戏梦。

 

3D空间认识:

在前面章节中,在屏幕上绘制的2D图像三角形是以屏幕对齐的,就像一个三角形直接贴在屏幕上面,但是那不是每一个都适用的。这样我们就需要一个3D空间坐标系来进行描述和进行显示,在真实的世界里,每一个物品都存在于3D空间中。这也就意味着,要想放置一个物品在一个特殊的位置,我们必须要使用一个坐标系并且定义3个描述特定位置的坐标。在计算机绘图中,三维坐标系一般使用的是笛卡儿坐标系,这个在数学中有见过吧。同时还分为左手坐标系或右手坐标系,左手坐标系就是Y轴指向上方,X轴指向右方,而Z轴指向前方;和左右坐标系相同的是右手坐标系Y和X轴指向相同,Z轴的方向正好相反,如下图所示。

下面我们来讨论一下在3D坐标系中,一个点在不同维数空间中不同的坐标。比如在一维中,如下图所示,P点在尺子5厘米的地方,当我们移动尺子时,P点的位置也就发生了变化,说不定在4厘米或3厘米的地方。虽然P点其实都没有移动过,但是它却有了新的坐标,也就是参照物不同罢了。

下面我们来看一下在三维下的情况,一个空间就需要定义一个原点和三条从原点出发的轴线:X,Y,Z。在计算机绘图中,他们包含了好几个空间下的定义:基元坐标系(Object Space)【模型几何坐标系】,世界坐标系(World Space),观察坐标系(View Space),投影坐标系(Projection Space),以及屏幕坐标系(Screen Space)。

 

基元坐标系:

这个坐标系也叫做几何模型坐标系,主要用于在使用3D建模时,所使用的坐标系。通常在创建模型时,建模人员都会将模型围绕原点进行建模,那样将有助于坐标变换,比如让模型旋转起来,在我们将坐标变换时将会进行描述。如下图,一个正方形正是定义在这样一个坐标系中,它的八个顶点将有如下坐标:(-1, 1, -1),(1,1,-1),(-1,-1,-1),(1,-1,-1),(-1,1,1),(1,1,1),(-1,-1,1),(1,-1,1) 。

因此模型几何坐标系是建模人员在设计和创建模型时定义的坐标系,在保持在磁盘里的模型当然也是存在于一个模型几何坐坐标系中。应用程序可以通过这样一个模型来建立一个顶点缓存对象,并且通过模型数据进行初始化这个缓存对象。因此一个顶点缓存对象通常都会在模型中建立,这也就说明顶点着色器将从几何坐标系中获得顶点数据信息。

 

世界坐标系:

世界坐标系是将每一个模型(基元物品)共享在一个场景中的坐标系,它通常用来描述我们期望呈现的各个模型之间的联系关系。为了虚拟一个世界空间坐标系,我们可以想象我们是站在西南的角落,并且面对着北方的一个房间里。我们把我们脚站在这个角落的地方定义为原点(0,0,0),X轴指向我们的右边,Y轴指向上方,Z轴指向前方【左手坐标系,这个也是Direct3D中使用的坐标系,听说OpenGL使用右手坐标系,不过我不懂的OpenGL】,面对的方向不变。这样确定下来后,房间里的所有东西物品都可以通过不同的坐标XYZ进行唯一定性。由此可见,之所以要使用世界坐标系,就是为了能够描述不同物品直接的联系。

 

观察坐标系:

观察坐标系,有时候我们也叫做摄影坐标系,这个有点像世界坐标系那样,只不过世界坐标系是用来描述整个场景,而观察坐标系的原点是在观察者的眼睛或摄像机。观察坐标系的Z轴就是眼睛看到的前方,Y轴就是相对于眼睛的上方,X轴位于右方,在下图就可以看到世界坐标系和观察坐标系。

在左边的场景中,在世界坐标系中有一个人,就像一个物件一样,并且有一个摄像机在观察他,红色原点和轴线表示世界坐标系。在右边的图片中,表示了观察坐标系和世界坐标系的关系,蓝色轴线表示观察坐标系。为了更清楚的理解他们,可以看出观察坐标系的方向和世界坐标系的方向是不同的,在世界坐标系中观察的方向是红色Z轴,而观察坐标系中方向是蓝色Z轴。

 

投影坐标系:

 投影坐标系是通过观察坐标系转换而来,其实可以想象一下,就和我们拿着摄像机去拍照一样。在投影坐标系中,可见物件的X和Y坐标被描述在-1和1之间,而Z坐标被描述在0和1之间,在坐标转换时会详细讲解这里就不再多说了。

 

屏幕坐标系:

屏幕坐标系一般用来引用一个框架缓存(Frame Buffer)定位坐标列表,因为框架缓存通常是一个2D的纹理,因此屏幕坐标是一个2D坐标系。其实就是我们的显示器,左上角顶点定义为原点(0,0),X轴为横向,Y轴为纵向。在缓存中倍描述为w像素的宽度和h像素的高度,最小也就是最右下角的像素的坐标为(w-1, h-1)。

 

 这样我们也就认识了Direct3D中几个重要的空间坐标系,也许我的描述不是特别的符合通常说法,不过我也只是在学习阶段,写博客也是为了能够更好的理解和学习Direct3D,有很多都是直接从例子文档中直接翻译过来的。如果有错误欢迎指正,这一节理论性比较重,其实大家有个大概的了解就可以了我想。

本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2011/08/01/direct3d11_3dspaces.html,如需转载请自行联系原作者

相关文章
|
3月前
|
机器学习/深度学习 算法 算法框架/工具
为什么使用C++进行机器学习开发
C++作为一种高性能语言,在某些性能要求极高或资源受限的场景下也具有非常重要的地位。C++的高效性和对底层硬件的控制能力,使其在大规模机器学习系统中发挥重要作用,尤其是当需要处理大数据或实时响应的系统时。
61 3
WK
|
1月前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
87 1
|
2月前
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
93 7
WK
|
1月前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
63 0
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
109 0
|
2月前
|
NoSQL API Redis
如何使用 C++ 开发 Redis 模块
如何使用 C++ 开发 Redis 模块
|
3月前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
3月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
169 1
|
4月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
211 2
|
3月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
322 0