准备
IDE:Visual Studio
开源库:GitHub.SharpDx
为什么选择 SharpDx?
SharpDx 库与 UWP 兼容,其他如 SharpGL 不兼容
如果你是 C# 开发者,Unity3D 会是更好的选择
Direct3D 是底层的 3D 图形库,通过接触它你可以学习到很多底层图形编程知识
了解底层知识会使你在接触并使用 Unity3D 等引擎时更加得心应手
第一节 世界
世界坐标系是一个特殊的坐标系,它建立了描述其他坐标系所需要的参考框架。
世界坐标系
从另一方面说,不能用更大的、外部的坐标系来描述世界坐标系
关于世界坐标系的典型问题都是关于初始位置和环境的:
- 每个物体的位置和方向
- 摄像机的位置和方向
- 世界中每一点的地形是什么(如山丘、建筑、湖泊等)
- 一个物体从哪里来,到哪里去(NPC 的运动策略)
左、右手坐标系
所有的 2D 坐标系是等价的,但 3D 坐标系有“手性”之分
左、右手坐标系可以互相转换,最简单的方法是只翻转一个轴的符号
传统的计算机图形学使用左手坐标系,而线性代数则倾向于使用右手坐标系
SharpDx 采用左手坐标系,即 X 轴由右向左,Y 轴由下至上,Z 轴由里至外
SharpDx 的世界有多大
首先,这个世界是有限且离散的
描述三维坐标需要使用 SharpDx 或 System.Numerics 命名空间下的 Vector3 类型
Vector3 表示一个三维向量,它的 x,y,z 分量都是float类型(单精度浮点数),我们知道 float 范围是 -3.40E+38 ~ +3.40E+38
而原子的直径是 0.1nm 级别,若以它作为基本单位,那么这个世界大约是一个边长 6.80E+25 公里的方盒(约 71877 亿光年)
这个世界足够大吗
目前认为银河系直径是 10~12 万光年,宇宙可视直径是 920 亿光年
单精度浮点数可精确到小数点后 6 位,即当前世界最小分辨率是 10-6 倍原子大小
离散的 float 类型足以描述现实世界吗?
向你介绍计算机图形学第一准则:
近似原则,如果它看上去是对的它就是对的。
Imports SharpDX ''' <summary> ''' 表示一个三维世界 ''' </summary> Public Interface IWorld ''' <summary> ''' 模型顶点变换矩阵的数组 ''' </summary> ''' <returns></returns> Property ModelMatrix As Matrix() ''' <summary> ''' 更新模型顶点变换矩阵 ''' </summary> Sub Update() End Interface