教程地址
学习记录
这篇文章中,我们将更新我们框架代码中的 CModel
和 CCamera
。前者用来描绘我们世界坐标系空间中的某个物体,而后者则描述我们的摄像机,则我们的观察者。
之后我们的框架将会变为这样(是很丑,但我懒得再去画了!):
先来看看 CModel
类,这个类描述了我们的一个实体模型,并提供了渲染接口,他的声明如下:
1 | class CModel { |
这些都是比较简单能理解的,在初始化和销毁的函数里,我们对几个成员变量进行初始化和销毁操作。而公开接口里都是直接调用私有函数,如下:
1 | CModel::CModel() : mVertexBuffer_(nullptr), mIndexBuffer_(nullptr), mVertexCount(0), mIndexCount(0) { |
之后,在 InitializeModel
函数里,我们对我们的模型进行初始化,在我们之前的三角形那一篇里我们进行过这些操作(【directx】3-d3d三角形),这里也基本一样(不同的是这里我们将使用索引缓冲):
1 | bool CModel::InitializeModel(ID3D11Device* device) { |
最后在 Render
方法里,我们对设备上下文对象进行配置。
1 | void CModel::RenderModel(ID3D11DeviceContext* deviceContext) const { |
这样,我们就实现了 CModel
类,接下来看 CCamera
。
首先来看声明:
1 | class CCamera { |
在这个类里我们保存着摄像机的坐标和朝向以及一个观察矩阵。那几个 Set
Get
函数都比较简单,只是赋值性操作而已。如下:
1 | CCamera::CCamera() { |
最后是 Render
函数,在这个函数里我们将使用 mPosition
变量和 mRotation
变量来更新观察矩阵,即用坐标和朝向来更新观察矩阵:
1 | void CCamera::Render() { |
这样,我们的摄像机类也结束了。现在可以往上一层的 CGraphics
类来添加内容了。首先在声明里增加这两个变量:
1 | CModel *mModel_; |
初始化什么的和其他一样:
1 | bool CGraphics::Initialize(const int screenWidth, const int screenHeight, const HWND hwnd) { |
最后,是增加内容后的 RenderGraphics
函数。
1 | bool CGraphics::RenderGraphics(const float r , const float g , const float b , const float a) { |
需要注意的是,我们更新了数学库,使用 DirectXMath
中的 XMFloat
和 XMMatrix
等,所以之前的代码也需要去修改。