Skip to content

xubingyue/3DEngine

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 

Repository files navigation

3DMathLib

(2015.07.07 新增) :开始创建3D引擎的每个步骤--从数据表示到最后的光栅化,不教怎么使用OpenGL图形API,只是检验自己是否真正的理解了3D图形学,必须知道如何手动编写类似OpenGL,这是我追求的目标:在任何计算机上编写出基于软件的3D图形引擎,在具备这种能力后,学习3D API将是小菜一碟.

教授3D图形学,而不是介绍如何使用3D图形API(opengl),理解渲染到底是怎样一个流程;理解渲染背后的数学原理

/3D图形学简介*****************************************/

/3D引擎简介************************************************************************************/

3D引擎本身就是一种软件,负责处理3D世界的数据结构(包括所有的光源,行动和常规状态信息)以及从玩家或者相机所在的视点渲染3D世界。

以模块化方式设计时,引擎将相对简单些,因为在这种情况下,3D引擎和其他游戏子系统之间的交互较少.

编写3D引擎可能犯的最大错误就是,除了3D渲染外,还让它负责完成其他的工作;eg:除了处理3D图形外,还在3D引擎代码中完成物理造型(mod

eing)工作.另外一种错误是在3D引擎中完成一些联网工作以简化网络.

waring:3D引擎只负责一项工作--根据数据进行3D渲染,仅此而已.

/************3D引擎结构篇/

1:3D图形引擎

2: game engine

3:输入系统和网络 (数据同步)

4:动画系统 (帧动画 / 骨骼动画 )

5:碰撞检测和导航系统

6:物理系统 (计算摩擦力和加速度 / 弹性碰撞检测和响应 /线性动量传递)

7:AI人工智能系统

8:3D模型和图像数据库 (3D游戏涉及的数据非常多: Entry 3D mesh / 2D纹理texture 和 光照图light map / 3D世界 /运动

与动画数据 /游戏地图数据 ) 占内存的数据,大多情况下是纹理图和光照图

waring: 来计算下 一个多边形模型的数据量(需要多少存储空间) 内存

typedef VECTOR3Dptl_TYP { float x , y ,z ;//位置 float u,v; //纹理坐标 float l; //光照值(light value) } VECTOR3Dptl , *VECTOR3Dptl_PTR;

每个顶点大约需要 24 (6 * sizeof(float)) 个字节(32bit 操作系统),entry 有200个顶点,因此 24 bit /顶点 * 200个顶点 = 480 bit

然而未考虑诸如多边形mesh 颜色等高级的数据.假设 在动画中,每种运动需要32 帧,且需要下述几种动作:

1:行走 2:奔跑 3:跳跃 4:躲闪 5:死亡 6:射击

因此总共需要 192 (6 * 32) 个运动帧; 而每个帧需要480 bit,因此总共需要 92160 (192 * 480) byte

这可是不少的内存,假设游戏中有32种动物,顶点将 占据 大约3MB (32 * 92160) 内存, 所以必须定义高效的数据结构和数据库,并根据需要 加载和卸载数据.

/************3D引擎设计篇/

3D游戏中,游戏引擎包含的内容很多,有时又几乎不涉及任何内容;然而,在大多数情况下,游戏引擎是一个处理所有事务的系统,它是一个控制
模块,向所有的子系统发出命令.

在设计初始,就应该设计一个负责游戏中一切事务的模块,将其称为"Game Engine" , 游戏引擎是一个容器,它容纳了其他所有组件,熟悉整个

系统的各个部分.

/***************************************************************************************************************************/

/3D图形学简介***********************************************************************************/

1: 3D引擎原理

2: 3D坐标引擎的结构

3: 3D坐标系统

4: 基本的3D数据结构

5: 变换和基本动画

6: 观察流水线简介

7: 3D引擎类型

8: 加载外部数据

/****************************************************************************************************************************/

/3D数据基础***************************************************************************************/

当你编写3d引擎的代码时,需要的一些函数和宏很可能我已经编写好了。

在编写软件图形引擎的时候,唯一的问题就是表示方法,即应应用3D点还是齐次4D点?我们拭目以待,但至少知道如何处理这两者.

实际上,我将使用4x3和4x4矩阵,所以从技术上来说,我将使用4D齐次点,并假设w=1或将w作为第4个分量

3DMathLib C/C++ 因为我要实现一套 3d软件渲染APi 所以重写自己的3d数学库

主要处理点,向量,直线,矩阵,四元数,参数化直线,3D平面,极坐标,柱面坐标,球面坐标和定点数

命名规则对于每个人来说都是问题,因为您希望函数有个合理的名称,但又不想输入太多的字符。

在大部分情况下,我使用类/结构名作为函数名称的一部分,加上函数功能的英文描述,并使用下划线来连接。

eg: void Mat_Mul_VECTOR3D_3X3(VECTOR3D_PTR va, MATRIX3X3_PTR mb, VECTOR3D_PTR vprod);

上述函数声明非常明确的说明了函数的功能,OpenGL采用了类似的命名规则

建立数学库

1:数学常量

2:数据结构

3:宏和内联函数

4:函数原型

5:全局变量

6:坐标系支持

7:向量支持

8:向量支持

9:矩阵支持

10:2d和3d参数化直线支持

11:3d平面支持

12:四元数支持

13:定点数支持(纯学习)

14:浮点数支持

/***************************************************************************************************************************/

About

3DMathLib C/C++

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published