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,有很多都是直接从例子文档中直接翻译过来的。如果有错误欢迎指正,这一节理论性比较重,其实大家有个大概的了解就可以了我想。

[转]Directx11 3D空间坐标系认识相关推荐

  1. 图形学介绍-3D转换

    学习图形学过程中看到来自Hobart and William Smith Colleges的David J. Eck教授编写的图形学介绍V1.3.0,读起来确实有不少的感悟. 第7.1节 3D 转换 ...

  2. Flash与3D编程探秘(一)- Flash与3D空间

    Flash 和 3D空间 第一件事情我想你知道的是,在Flash里,并不存在真正的3D,或者我应该说,Flash CS3并不支持3D绘制.我们所做的是运用Flash里的2D绘制方法去模拟3D绘制,Fl ...

  3. 网页HTML5制作flex布局骰子,css3 flex布局结合transform生成一个3D骰子

    1 Flex 布局 首先聊聊Flex 布局,Flex 布局又称"弹性布局",任何容器都可以指定为Flex布局,设置Flex布局会使得子元素的float.clear.vertical ...

  4. Unity 中的 3D 数学学习笔记——认识坐标系及坐标系之间的转换

    一 :3d空间坐标系  x,y,z 轴 z轴方向确定有两种方式 左手坐标系和右手坐标系 左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向. 右手坐标系:伸开右 ...

  5. DirectX 12 3D游戏开发实战(第一章向量)

    目录 第1章 向量代数 1.1 向量 1.2 长度和单位向量 1.3 点积 1.4 叉积 1.5 点 1.6 利用DirectXMath库进行向量运算 1.7 小结 1.8 练习 第1章 向量代数 向 ...

  6. 从零开始的2.5D游戏开发

    游戏按照镜头视角来分,可以分为2D游戏.3D游戏,除此之外还有一类游戏被称为2.5D游戏.这是一个比较有争议的分类,这个分类有着不同的解释.有的人认为这只是厂商的噱头,它本身就是2D游戏(我曾经也这么 ...

  7. ✠OpenGL-5-纹理贴图

    目录 加载纹理图像文件 纹理坐标 创建纹理对象 & 构建纹理坐标 将纹理坐标载入缓冲区 在着色器中使用纹理:采样器变量和纹理单元 直观演示[纹理贴图]流程 示例:金字塔模型纹理贴图 多级渐远纹 ...

  8. 《基于 DirectX11 的 3D 图形程序设计案例教程》学习四 D3DTriangle

    源程序:   此次例子的大部分代码均拷贝自上一章 InitD3D 例子程序.   d3dUtility.h /********************************************* ...

  9. Introdution to 3D Game Programming With DirectX11 第11章 习题解答

    11.1 这道题要注意使用了line strip,由于曾经一直用triangle list,所以在几何渲染的时候easy算错定点描绘的顺序. 贴一些代码,大概就能把这个问题解释清楚了,由于框架还不是特 ...

  10. DirectX11 With Windows SDK--22 立方体映射:静态天空盒的读取与实现

    前言 这一章我们主要学习由6个纹理所构成的立方体映射,以及用它来实现一个静态天空盒. 但是在此之前先要消除两个误区: 认为这一章的天空盒就是简单的在一个超大立方体的六个面内部贴上天空盒纹理: 认为天空 ...

最新文章

  1. [Python_7] Python Socket 编程
  2. 怎么样拒绝服务器重新启动?
  3. 如何优雅处理 async await 错误——解读小而美的 await-to-js 库
  4. inner join 和 exists 效率_一个in、exists、join的简单测试
  5. isnull mysql_mysql isnull用法讲解
  6. 图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题
  7. Matlab--colorbar的各项细节操作
  8. 当你用浏览器打开一个链接的时候,计算机做了哪些工作
  9. 一篇文章彻底搞懂Android事件分发机制
  10. Linux 系统下对目录扩容的方法
  11. hdu6110:路径交
  12. JSON转EXCEL代码( java)
  13. Your local changes to the following files would be overwritten by merge
  14. Python策略模式实例
  15. word插入图片之后只显示一部分的解决方法
  16. Linux基本的键盘输入快捷键和一些常用命令
  17. SAN存储的局限性相关介绍
  18. 【新手入门必看】MaixPy 图像基础知识
  19. char和varchar的区别是什么?
  20. Python数据分析与挖掘实战期末考复习(抱佛脚啦)

热门文章

  1. 程序员必备算法——算法相关链接总结
  2. Pytorch——3.1. 热身:Pytorch基础
  3. 第三章——空间域处理方法
  4. 计算机丢失msvcrtdll怎么修复,雨林木风修复msvcrtdll 【操作方案】 的详细_
  5. java继承的性质,浅谈Java三大特性之继承
  6. java 类的继承 例题_Java_接口与类之间继承例题
  7. Linux 常用命令大全(非常全!!!)
  8. 据说程序员是这样写代码的
  9. 史上最全Android Studio快捷键 -2016-02-28
  10. 求连续子数组的最大和C语言,求助:最长连续子数组问题