您的位置:首页 > Web前端

SpecialEffect里的粒子编辑器[读代码]

2006-04-16 22:00 302 查看
运行流程

1.入口WinMain

2.CMyD3DApplication d3dApp - 使用了DirectX演示框架。

3.CMyD3DApplication继承自CD3DApplication

4.CMyD3DApplication构造函数

5.CD3DApplication构造函数

6.CGroundPlane() - 地面构造函数

7.CUserControlledCamera()摄影机

8.由于使用了CMyD3DApplication所以将精力放在此类上。

CMyD3DApplciation构造函数

ConfirmDevice - 检测硬件能力支持

OneTimeSceneInit和FinalCleanup成对

InitDeviceObjects()和DeleteDeviceObjects成对

再看FrameMove RestoreDeviceObjects Render间的顺序

RestoreDeviceObjects() -->> FrameMove() -->> Render() -->>

就是这样的顺序。

再看InvalidateDeviceObjects() FinalCleanup() DeleteDeviceObjects()顺序

InvalidateDeviceObjects() -->> DeleteDeviceObjects() -->> FinalCleanup()

知道了这些基本的CMyD3DApplication有个模糊的认识了。

下面进入到粒子编辑器的对象和实现细节上。

CMyD3DApplication类中的对象:除CD3DFont*一般都是新加的可见作者对Dx框架进行了简化处理,减少了多余的东西。

由于是读代码,自然是对代码根据命名推测,而推测不出的乱命名则根据上下文来推测,或设断点和动态变量数据值推测,这里可见好的命名方式更容易阅读,但是不好的命名方式也不是我们难以阅读的借口。关键看它实现了什么。

///--------------------------------------------------------

CGroundPlane m_Ground -一看就知道是管理地面的,怎么管理的不知道

CUserControlledCamera m_Camera; - 用于摄影机的,就是镜头

CInputManaguer m_InputManager; - 管理输入

CParticleEmitter m_PartSys; - 粒子发射器

HWND m_hWndPropDlg; - 调整粒子属性的非模态对话框句柄

bool m_bShowGround - 通过bool值控制地面是否显示

除了CMyD3DApplication中的对象,还有一定的全局对象

g_pD3DApp是Dx框架中默认的

CParticleEmitter *g_theSystem = NULL; - 通过一个全局的指针似乎要中转调用什么,具体用法不得而知。

既然是粒子编辑器再看下粒子的顶点设置, typdef struct{ D3DXVECTOR3 position; float pointsize; D3DCOLOR color; }VERTEX_PARTICLE;

使用了点精灵和灵活顶点中的D3DFVF_PSIZE

一点经验:我在使用PSIZE开始时容易忘记结构的格式顺序和忘记在Render中填充size的值,这是容易造成得不到正确结果的原因,正确的灵活顶点使用PSIZE的话应该是 pos -> size -> color, 如果颠倒则得不到想要的。另外就是由于忘记关闭光照LIGHTING导致看到屏幕黑黑的,或者别的颜色。好了这是顶点结构。

这里还有控制混色模式的结构BLENDINGMODE

typedef struct{ char name[25]; //名字 int mode; //值 }BLENDINGMODE;

很容易理解

还有个带纹理坐标的粒子结构。就不使用点精灵了。

typedef struct{ D3DXVECTOR3 position; D3DCOLOR color; FLOAT tu,tv; }VERTEX_XYZ_DIFFUSE_TEX1;

曾经看过说使用PSIZE,点精灵的大小是有限制的,如果使用纹理坐标后可能就无限制了呢?这还是推测。

好了结构也看完了,让我们继续断点跟踪。

由于全部实现都在CMyD3DApplication里实现,所以主要放在这里,这里的对象一个都跑不了,我在CMyD3DApplicaiton里的每个方法都设置一个断点以跟踪。

CMyD3DAppliation的构造函数,m_strWindowTitle 窗口标题,m_bUseDepthBuffer深度缓冲,m_pFont m_pFontSmall 创建字体对象

InitDeviceObjects()里简单的初始化了字体,没做什么。

ResotreDeviceObjects()有东西,原来都在这里。 SetWindowLong - 改变窗口为新的风格

m_InputManager.CreateDevices,初始化DirectInput设备

m_Camera.SetPosition设置摄影机的位置

m_Ground.RestoreDeviceObjects() - 创建地面,得到d3d设备

接着初始化粒子发射器包括 - SetSpawnDir1 根据命名我不知道SpawnDir什么意思,所以只好改变下值,我改第二参数Y从原来-2.0f 改为 -1000.0f,为了让结果明显,我尽量选择了较大值这样差别明显,但是对于镜头,位置类的属性如果较大反而容易什么都看不到,好在控制位置的一般都是position,而根据改变感觉SpawnDir是控制粒子运动速度的,看别的书都是velocity,英文差啊。由于是粒子编辑器支持动态改变再改SpawnDir值知道不但控制粒子的速读还控制方向。当值较大时速度就快,而SpawnDir1和SpawnDir2组成了一个区间,每个都是XYZ的向量,所以XYZ每个都有正负之分就是3x3x2有18中不同的结果,再配合区间就有似乎千变万化了。

好了还有StartColor1和StartColor2构成了颜色变化的区间,总共两个颜色区间,似乎是一个是始终保持的颜色,你个是根据运动变化的渐变色,我看过的用FadeColor表示这里简单的用了StartColor1 StartEndColor1

SetPos设置位置,什么位置是发射器位置还是粒子位置,猜想,由于 SetPos(D3DXVECTOR3(0.0f,2.0f,0.0f)所以是发射器位置,一般粒子都会根据一个范围随机的生成,然后在某个XYZ范围内运动,运动到移动点后重置

SetLifetime设置粒子生存期,SetTexture设置纹理。

结果pos正是发射器的位置。

接着调用发射器的RestoreDeviceObjects方法,一般是初始化发射器的全部粒子,创建顶点缓冲区等,然后又将发射器的地址给了全局的指针一份。

在接着创建了对话框,将句柄给了m_hWndProDlg,然后显示。

再接着像一般的D3D程序必须经过世界矩阵,视图,投影的变换过程,将最初的原始D3D图像信息光栅化为2D的平面。

还通过原始的固定渲染管线来控制材质

这样RestoreDeviceObject就完成了。接着进入FrameMove函数,这里要进行更新粒子超过规定的运动范围就要被更新,实际上粒子都是根据最初设置的数目得来,不会增加也不会减少,但是会改变状态,如可见与不可见,不可见是因为改变了位置。

在FrameMove中不断的传入m_fTime,m_fElapsedTime两个参数,根据这两个参数不断的变化粒子的运动。

这个粒子默认就是不停的让粒子在一定方向做直线的运动超过就改变位置,状态。没有经过复杂的路径运动,如Dx SDK中的PointSprint还使用了cos sin做了弯曲的运动。好了,下面将中心放在粒子编辑的主要部分。我们跟踪。

在创建非模态对话框时,回调函数ProDlgProc是实现编辑的关键,而对话框的GUI则根据需要自由设计实现,而和发射器的交互,是通过全局的发射器指针来控制。由于全局发射器指针得到的就是发射器的地址,通过它就可以改变发射器的状态信息。

让我们看下PropDlgProc的代码

CMyD3DApplicaiton *app = (CMyD3DApplication*)g_pD3DApp; static bool bTurnOffUpdates = false; switch(uMsg) { case WM_INITDIALOG: break; }

在对话框中主要有两类消息,初始化对话框和命令执行消息。

分别是WM_INITDIALOG:和WM_COMMAND:

让我们在WM_COMMAND里设断点:

通过拦截,switch(wID),通过修改编辑框数据就被拦截, DestroyWindow(m_hWndPropDlg);删除对话框。

关于对话框的设置则细细看来。在处理对话框是一系列的获取文本与设置文本,还涉及到字符,数字的转化等。关于何时再次调用PropDlgProc问题, 可能对话框是伴随主窗口启动的窗口吧,所以不关闭它,它不会自动关闭。所以PropDlgProc是不断接收消息的,关于Dialog就告以段落,准备动手将编辑功能加入其他需要的地方吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: