使用DirectX实际开发中,模型的形状不可能都是一成不变,只依靠移动摄像机去实现动画。这里用实时更新顶点缓冲的方式生成一个水波模型,最终效果类似向水面扔石子时出现的水波纹。有了上一篇建立好的模型,实现这个效果仅需要更改WaterModel类和Renderer类里m_water的相关调用。
首先更改WaterModel的头文件,添加模拟变量成员和临时缓冲区指针,并增加两个方法Disturb和Update,整个类代码如下:
class WaterModel
{
public:
WaterModel(void);
~WaterModel(void);
void Initialize(ID3D11Device* d3dDevice, int m, int n, float dx, float dt, float speed, float damping);
void Render(ID3D11DeviceContext* d3dContext);
void Disturb(int i, int j, float magnitude);
void Update(ID3D11DeviceContext* d3dContext, float dt);
private:
Microsoft::WRL::ComPtr<ID3D11Buffer> m_vertexBuffer;
Microsoft::WRL::ComPtr<ID3D11Buffer> m_indexBuffer;
uint32 m_vertexCount,m_indexCount;
//二维网格的行数、列数
int xRange;
int zRange;
// 欲计算的模拟常量.
float mK1;
float mK2;
float mK3;
float mTimeStep;
float mSpatialStep;
//顶点临时缓冲
XMFLOAT3* mPrevSolution;
XMFLOAT3* mCurrSolution;
};
完成后就开始更改WaterModel的构造方法,使用初始化列表初始化成员:
WaterModel::WaterModel(void):
m_indexCount(0),m_vertexCount(0),
mK1(0.0f),mK2(0.0f), mK3(0.0f),
mTimeStep(0.0f),mSpatialStep(0.0f),
mPrevSolution(0),mCurrSolution(0),
xRange(128),zRange(128)
{
}
然后是更改Initialize方法。其中模拟常量等与算法有关的部分按照DirectX 10的例子进行计算,代码如下:
xRange = m;
zRange = n;
m_vertexCount