ECModel&GFX 原理与应用

Содержание

Слайд 2

客户端

Angelica …

Angelica3D

GfxCommon (动画模型,特效)

客户端、引擎、GfxCommon关系简图

客户端 Angelica … Angelica3D GfxCommon (动画模型,特效) 客户端、引擎、GfxCommon关系简图

Слайд 3

目录

A3DSkinModel 简介及动画相关
3DMAX导出
文件、类说明
动作通道简介
从 A3DSkinModel 到 CECModel
CECModel 使用
由.smd生成
子模型,组合动作
动作事件
物理相关
注意事项
GFX 使用
GFX各类元素的设计及GFX Container的概念
GFX的注册渲染机制

目录 A3DSkinModel 简介及动画相关 3DMAX导出 文件、类说明 动作通道简介 从 A3DSkinModel 到 CECModel CECModel 使用

Слайд 4

美术制作流程

3dmax导出(骨骼,动画,皮肤)
.smd, .bon, [.stck], .ski
动作合并(.bon->.stck)——将动作信息存入.smd (在A3DSkinModel中添加基础动作: A3DSkinModelActionCore)
根据.smd创建.ecm文件,创建游戏当中实际需要的组合动作,配上特效,音效等

注:美术导出动作的时候,是以.bon的形式导出来的,其中包含了骨架以及动画信息,需要经过SkeletonEditor处理之后才实际生成.stck文件

参考实际导出的文件

美术制作流程 3dmax导出(骨骼,动画,皮肤) .smd, .bon, [.stck], .ski 动作合并(.bon->.stck)——将动作信息存入.smd (在A3DSkinModel中添加基础动作: A3DSkinModelActionCore) 根据.smd创建.ecm文件,创建游戏当中实际需要的组合动作,配上特效,音效等 注:美术导出动作的时候,是以.bon的形式导出来的,其中包含了骨架以及动画信息,需要经过SkeletonEditor处理之后才实际生成.stck文件 参考实际导出的文件

Слайд 5


A3DSkinModel 从max导出

注:.phy文件已经不再使用了,曾经是用来做物理信息的,后采用基于PhysX的Aphys库提供物理功能

3dMax

SkeletonExporter

.max

.smd

.bon

.ski

.stck

.stck

.stck

.stck

SkeletonEditor

.phy

.Max可以分别导出.smd, .bon, .ski,一个动作导出一个.bon(经过SkeletonEditor转换为.stck)

A3DSkinModel 从max导出 注:.phy文件已经不再使用了,曾经是用来做物理信息的,后采用基于PhysX的Aphys库提供物理功能 3dMax SkeletonExporter .max .smd .bon .ski .stck .stck .stck

Слайд 6

A3DSkinModel 文件说明

.smd -> A3DSkinModel
综合了SkinModel所需的各类信息(骨架,动作,皮肤等)
.bon -> A3DSkeleton
骨架,骨骼,挂点,骨骼的父子关系等
.stck -> A3DSklTrackSet
动画数据,骨架上每个骨骼的位置朝向随时间变化的关键帧数据
.ski -> A3DSkin
蒙皮,Mesh数据(顶点,索引,贴图等)

每个A3DSkinModelActionCore包含一个A3DSklTrackSet

A3DSkinModel 文件说明 .smd -> A3DSkinModel 综合了SkinModel所需的各类信息(骨架,动作,皮肤等) .bon -> A3DSkeleton 骨架,骨骼,挂点,骨骼的父子关系等 .stck ->

Слайд 7

对应.smd文件

对应.bon文件

基础动作

对应.stck文件

A3DSkinModel类结构简图

对应.smd文件 对应.bon文件 基础动作 对应.stck文件 A3DSkinModel类结构简图

Слайд 8

A3DSkinModel 动作通道

动作通道是用来解决什么问题的?
多个动作同时播放,按照权重混合
例子:(身体的动作 与面部表情动作)

A3DSMActionChannel

1

2

3

4

5

6

A3DSMActionChannel

Skeleton
Bones

A3DSkinModel 动作通道 动作通道是用来解决什么问题的? 多个动作同时播放,按照权重混合 例子:(身体的动作 与面部表情动作) A3DSMActionChannel 1 2 3 4 5 6 A3DSMActionChannel Skeleton Bones

Слайд 9

Physics

从A3DSkinModel到CECModel

SkeletonExporter

.smd

ModEditor

.ecm

.mphy

SkeletonEditor

.ski

.sphy

CECModelStaticData

Physics 从A3DSkinModel到CECModel SkeletonExporter .smd ModEditor .ecm .mphy SkeletonEditor .ski .sphy CECModelStaticData

Слайд 10

ECModel

为什么需要CECModel?
子模型管理
多个简单动作组合成一个复杂动作(技能等)
播放动作到特定时刻播放音效(需要由美术控制)
播放动作到特定时刻播放特效(同上)
播放动作到特定时刻触发脚本
etc.
游戏里需要预设一些不同骨骼缩放系数的模型(缩放)
游戏需要对动画模型进行碰撞检测(凸包)
动画模型与物理引擎关联(物理)
其他与客户端逻辑相关的(脚本)接口(逻辑)

ECModel 为什么需要CECModel? 子模型管理 多个简单动作组合成一个复杂动作(技能等) 播放动作到特定时刻播放音效(需要由美术控制) 播放动作到特定时刻播放特效(同上) 播放动作到特定时刻触发脚本 etc. 游戏里需要预设一些不同骨骼缩放系数的模型(缩放) 游戏需要对动画模型进行碰撞检测(凸包) 动画模型与物理引擎关联(物理) 其他与客户端逻辑相关的(脚本)接口(逻辑)

Слайд 11

ECModel

与A3DSkinModel的关系
类结构简介
子模型
组合动作
动作事件
脚本
物理
其他注意事项

类: CECModel
文件: .ecm

ECModel 与A3DSkinModel的关系 类结构简介 子模型 组合动作 动作事件 脚本 物理 其他注意事项 类: CECModel 文件: .ecm

Слайд 12

基础动作

ECModel与A3DSkinModel的关系

美术制作流程

基础动作 ECModel与A3DSkinModel的关系 美术制作流程

Слайд 13

ECModel 结构简图

与.ecm文件一一对应

容易引起误解的地方

ECModel 结构简图 与.ecm文件一一对应 容易引起误解的地方

Слайд 14

ECModel 子模型

子模型用在什么场合?
武器
骑乘
父子模型间通过挂点连接 HH_ <-> CC_(注释1)
Hanger: 用来索引子模型的字符串,由客户端与美术约定
美术可指定一个效果在父模型动作的时间,以及子模型的挂点上播放(通过Hanger)<例子:父模型播放一个火枪开枪的动作,枪口冒烟的特效>

注释1:挂点区分为HH_Hook 和CC_Hook两种,分别用在挂/被挂两种场合

ECModel 子模型 子模型用在什么场合? 武器 骑乘 父子模型间通过挂点连接 HH_ CC_(注释1) Hanger: 用来索引子模型的字符串,由客户端与美术约定 美术可指定一个效果在父模型动作的时间,以及子模型的挂点上播放(通过Hanger) 注释1:挂点区分为HH_Hook 和CC_Hook两种,分别用在挂/被挂两种场合

Слайд 15

ECModel 组合动作

什么是组合动作?(编辑器-动作)
组合动作解决了什么问题?
节约数据:一个动作在多个技能中用到,那么只需要一份实际的动作数据,在多个组合动作中调用即可
程序,策划,美术,音效的结合
程序: 播放动作;
策划:技能动作名称;美术:动作,特效,色彩,子模型动作;

返回:为什么要有ECModel

ECModel 组合动作 什么是组合动作?(编辑器-动作) 组合动作解决了什么问题? 节约数据:一个动作在多个技能中用到,那么只需要一份实际的动作数据,在多个组合动作中调用即可 程序,策划,美术,音效的结合 程序: 播放动作; 策划:技能动作名称;美术:动作,特效,色彩,子模型动作; 返回:为什么要有ECModel

Слайд 16

ECModel 组合动作 数据

A3DCombinedAction & A3DComActDynData
A3DCombinedAction 静态数据:
由编辑器创建
包含需要存/读的信息,各个基本动作名称,各事件信息等
A3DComActDynData 动态数据:
由PlayActionByName / QueueAction /PlayAttackAction创建
包含运行时数据
参与Tick,负责运行过程中的状态更新
判断动作是否播完

QueueAction 不会自动保证加入的动作不重复,因此无限制的调用QueueAction会导致无限的往动作列表中添加动作

ECModel 组合动作 数据 A3DCombinedAction & A3DComActDynData A3DCombinedAction 静态数据: 由编辑器创建 包含需要存/读的信息,各个基本动作名称,各事件信息等 A3DComActDynData 动态数据:

Слайд 17

ECModel 组合动作 播放

PlayActionByName & PlayAttackAction
PlayActionByName 播放组合动作(可设置Channel)
PlayAttackAction 播放技能动作(需传入自身ID及目标ID,组合动作上挂载的Attack事件会播放飞行GFX及击中目标GFX,过程中回调客户端提供的函数,由客户端根据ID及其他附属信息计算位置)

参考攻击事件ATT

ECModel 组合动作 播放 PlayActionByName & PlayAttackAction PlayActionByName 播放组合动作(可设置Channel) PlayAttackAction 播放技能动作(需传入自身ID及目标ID,组合动作上挂载的Attack事件会播放飞行GFX及击中目标GFX,过程中回调客户端提供的函数,由客户端根据ID及其他附属信息计算位置) 参考攻击事件ATT

Слайд 18

ECModel 组合动作 各种参数1

*FixedPoint用于没有目标玩家或怪,但是有一个特定位置的情况,该状况下nCastTarget可为0

bool PlayActionByName( int nChannel,
const char* szActName,
float fWeight,
bool

ECModel 组合动作 各种参数1 *FixedPoint用于没有目标玩家或怪,但是有一个特定位置的情况,该状况下nCastTarget可为0 bool PlayActionByName( int nChannel, const char* szActName, float
bRestart=true,
int nTransTime=200,
bool bForceStop=true,
DWORD dwUserData=0,
bool bNoFx=false);

bool PlayAttackAction( int nChannel,
const char* szActName,
unsigned char SerialId,
clientid_t nCasterId,
clientid_t nCastTarget,
const A3DVECTOR3* pFixedPoint,
DWORD dwUserData = 0,
bool bNoFx = false);

动作通道
动作名称
动作通道权重 SetWeight
重新开始(当前如果已经是该动作)
过渡时间(从上一个动作的国度)
强制停止
用户数据
不播放任何附加事件

动作通道
动作名称
回调客户端的参数
发起者Id
目标Id
击中效果定点播放
用户数据
不播放任何附加事件

Слайд 19

ECModel 组合动作 各种参数2

CECModel::AddOneAttackDamageData(
int nChannel,
clientid_t nCaster,
clientid_t nTarget,
unsigned char SerialId,
DWORD dwModifier,
int nDamage,
bool bIsAttDelay,
int nAttDelayTimeIdx)

动作通道
发起者id
目标id
序列Id

ECModel 组合动作 各种参数2 CECModel::AddOneAttackDamageData( int nChannel, clientid_t nCaster, clientid_t nTarget, unsigned char
(回调客户端参数)
回调客户端参数
回调客户端参数
攻击事件是否有延迟效果
延迟时间

客户端实现的函数:
AfxSkillGfxAddDamageData(nCaster, nTarget, SerialId, dwModifier, nDamage);
通过传入参数,取出A3DSkillGfxEvent,加入新的TARGET_DATA
如果返回真,则不再调用下面两个函数
AfxSkillGfxShowDamage(nCaster, nTarget, nDamage, 1, dwModifier);
AfxSkillGfxShowCaster(nCaster, dwModifier);

Слайд 20

ECModel 动作事件

什么是动作事件?(编辑器-事件)
动作事件解决了什么问题:
在动作的特定时间点做某件事的自由性(GFX, SFX, ATT, CHILDACT, etc.)(注1)
举例:技能效果的播放,音效的播放,子模型动作,脚本事件

注1: 需要在动作时间轴上的某个时间点,触发特效、音效、攻击事件、子模型动作、模型色彩改变、脚本、摄像机镜头等

ECModel 动作事件 什么是动作事件?(编辑器-事件) 动作事件解决了什么问题: 在动作的特定时间点做某件事的自由性(GFX, SFX, ATT, CHILDACT, etc.)(注1) 举例:技能效果的播放,音效的播放,子模型动作,脚本事件 注1: 需要在动作时间轴上的某个时间点,触发特效、音效、攻击事件、子模型动作、模型色彩改变、脚本、摄像机镜头等

Слайд 21

ECModel 动作事件 ATT

攻击事件 ATT
飞行、击中等GFX效果
飞行效果播放过程中回调客户端

返回ECModel播放攻击动作

GfxCommon::A3DSkillGfxMan

ElementClient::SkillGfxMan

攻击事件的流程的说明

ECModel 动作事件 ATT 攻击事件 ATT 飞行、击中等GFX效果 飞行效果播放过程中回调客户端 返回ECModel播放攻击动作 GfxCommon::A3DSkillGfxMan ElementClient::SkillGfxMan 攻击事件的流程的说明

Слайд 22

ECModel

回调

回调

伤害信息

ECModel 动作事件 ATT - 2

客户端

服务端

PlayAttackSkill

伤害计算

技能攻击

收到伤害信息

AddOneAttackDamageData

ATT

触发

飞行GFX

击中GFX

GetPositionByID
GetDirAndUpByID

A3DSkillGfxEvent

显示伤害信息
SetDamageShowFunc
SetCasterShowFunc

AfxPlaySkillGfx

ECModel 回调 回调 伤害信息 ECModel 动作事件 ATT - 2 客户端 服务端 PlayAttackSkill

Слайд 23

ECModel 脚本(lua)

模型发生某些事件时触发 (编辑器-脚本)
加载(初始化)
播放动作(根据动作切换武器挂点)
更换装备(根据装备ID播放特效)
物理破碎
动作脚本事件
播放动作到特定时刻触发

返回:为什么要有ECModel

ECModel 脚本(lua) 模型发生某些事件时触发 (编辑器-脚本) 加载(初始化) 播放动作(根据动作切换武器挂点) 更换装备(根据装备ID播放特效) 物理破碎 动作脚本事件 播放动作到特定时刻触发 返回:为什么要有ECModel

Слайд 24

ECModel 物理

APhysX与A3DSkinModel的粘合
APhysXActor -> A3DBone
APhysXCloth -> A3DSkin

返回:为什么要有ECModel

物理参看编辑器

物理说明

ECModel 物理 APhysX与A3DSkinModel的粘合 APhysXActor -> A3DBone APhysXCloth -> A3DSkin 返回:为什么要有ECModel 物理参看编辑器 物理说明

Слайд 25

关于物理的简介

Actor – 刚体
Shape 实际参与物理运算的形体
由美术根据实际形体编辑
Joint – 约束(针对刚体)

Joint

1.绕轴旋转角度限制
2.移动距离限制

碰撞

返回ECModel物理

关于物理的简介 Actor – 刚体 Shape 实际参与物理运算的形体 由美术根据实际形体编辑 Joint – 约束(针对刚体) Joint 1.绕轴旋转角度限制 2.移动距离限制 碰撞 返回ECModel物理

Слайд 26

ECModel 其他 – 位置

模型的逻辑位置与实际位置
CECModel 继承自A3DCoordinate(注1)
CECModel包含A3DSkinModel
A3DSkinModel也继承自A3DCoordinate(参考图)

注1: A3DCoordinate代表包含了位置和朝向的坐标系,此处的问题在于CECModel自身和其包含的A3DSkinModel各有一份数据

CECModel::GetAbsoluteTM() // 逻辑的位置与朝向
!=
CECModel::GetA3DSkinModel()->GetAbsoluteTM() // 动画的位置与朝向

部分特效<标明相对ecm原点的>会依赖于CECModel的A3DCoordinate,而非A3DSkinModel的A3DCoordinate,需要注意两者的区分

ECModel 其他 – 位置 模型的逻辑位置与实际位置 CECModel 继承自A3DCoordinate(注1) CECModel包含A3DSkinModel A3DSkinModel也继承自A3DCoordinate(参考图) 注1: A3DCoordinate代表包含了位置和朝向的坐标系,此处的问题在于CECModel自身和其包含的A3DSkinModel各有一份数据 CECModel::GetAbsoluteTM()

Слайд 27

ECModel 其他 – 各种设置

SetId
在脚本中使用,于回调客户端时提供;
与Gfx中的ECModel元素配合使用
SetGfxUseLod
模型上挂 的GFX里的粒子喷射器受其影响
SetDisableCamShake
禁止模型上挂GFX中的相机振动起作用

ECModel 其他 – 各种设置 SetId 在脚本中使用,于回调客户端时提供; 与Gfx中的ECModel元素配合使用 SetGfxUseLod 模型上挂 的GFX里的粒子喷射器受其影响 SetDisableCamShake 禁止模型上挂GFX中的相机振动起作用

Слайд 28

ECModel 其他 – 附加皮肤

关于ECModel附加皮肤
只用于ModEditor编辑器显示
客户端中使用的A3DSkin的两个来源:
SkeletonEditor中附加到A3DSkinModel上
客户端中自行加载的
(与ECModel中编辑的附加皮肤无关)

ECModel 其他 – 附加皮肤 关于ECModel附加皮肤 只用于ModEditor编辑器显示 客户端中使用的A3DSkin的两个来源: SkeletonEditor中附加到A3DSkinModel上 客户端中自行加载的 (与ECModel中编辑的附加皮肤无关)

Слайд 29

ECModel – 其他 透明度

SetTransparent/GetTransparent
设入的透明度和取出的透明度不等同的问题
模型色彩改变[动作事件]的影响

ECModel – 其他 透明度 SetTransparent/GetTransparent 设入的透明度和取出的透明度不等同的问题 模型色彩改变[动作事件]的影响

Слайд 30

GFX

特效元素简介
特效关键帧简介
特效渲染机制简介
关于2D特效的说明

类: A3DGfxEx
文件: .gfx

GFX 特效元素简介 特效关键帧简介 特效渲染机制简介 关于2D特效的说明 类: A3DGfxEx 文件: .gfx

Слайд 31

GFX 元素简介

3D面片
2D面片
圆环 (面片圈)
电弧 (面片节,于径向使用PerlinNoise)
轨迹 (面片节,于前端生成新的面片,每节面片有TTL,通过运动形成连续的效果)
粒子 (各种形状的发射器&面片,可绑定其他元素)
模型 (.smd,文件A3DSkinModel)
子效果 (把一个完整的GFX文件看成一个元素)
其他

注:CECModel上可以再挂载gfx,gfx中如果可以再挂载CECModel的话,很容易造成混乱,生命期难以管理

为什么是A3DSkinModel而非CECModel,注

GFX 元素简介 3D面片 2D面片 圆环 (面片圈) 电弧 (面片节,于径向使用PerlinNoise) 轨迹 (面片节,于前端生成新的面片,每节面片有TTL,通过运动形成连续的效果) 粒子 (各种形状的发射器&面片,可绑定其他元素)

Слайд 32

GFX 结构简图

子效果

粒子系统

面片

圆环

电弧

轨迹

模型

GFX 结构简图 子效果 粒子系统 面片 圆环 电弧 轨迹 模型

Слайд 33

GFX 元素的例子-1

电弧

轨迹

3D面片

2D面片

粒子

类结构

GFX 元素的例子-1 电弧 轨迹 3D面片 2D面片 粒子 类结构

Слайд 34

子效果

添加一个效果为gfx的元素。可用于会多次使用的某一组效果或者元素。

子效果

GFX 元素的例子-2

类结构

子效果 添加一个效果为gfx的元素。可用于会多次使用的某一组效果或者元素。 子效果 GFX 元素的例子-2 类结构

Слайд 35

GFX 关键帧

关键帧作用于A3DGFXElement
关键帧可以影响的属性
移动
旋转
颜色(透明度)改变
比例改变
Etc.
<参考编辑器>

GFX 关键帧 关键帧作用于A3DGFXElement 关键帧可以影响的属性 移动 旋转 颜色(透明度)改变 比例改变 Etc.

Слайд 36

GFX的注册渲染机制

A3DGFXExMan::RegisterGfx (A3DGfxEx*)
渲染GFX,首先放到一个容器(GfxRenderContainer)中,RenderAllGfx后该容器被清空
(注册机制1,针对A3DGFXEx)
容器可以替换(可以用在一些特殊场合)
A3DGFXExMan::RenderAllGfx
GFX的元素被按照渲染状态注册到渲染容器中
(注册机制2,针对A3DGFXElement)
按照渲染状态的类别分别DrawPrimitive

GFX的注册渲染机制 A3DGFXExMan::RegisterGfx (A3DGfxEx*) 渲染GFX,首先放到一个容器(GfxRenderContainer)中,RenderAllGfx后该容器被清空 (注册机制1,针对A3DGFXEx) 容器可以替换(可以用在一些特殊场合) A3DGFXExMan::RenderAllGfx GFX的元素被按照渲染状态注册到渲染容器中 (注册机制2,针对A3DGFXElement) 按照渲染状态的类别分别DrawPrimitive

Слайд 37

2D GFX的使用

程序联入的2DGFX,可以通过A3DGFXExMan提供的2DGFX接口进行加载,渲染等操作(用于登录界面等场合)
非程序联入的2DGFX,可以以3DGFX同样的方式渲染(RegisterGfx)。Flush采用Render2DGfx,而非RenderAllGfx(注1)
关于Render2DGfx的参数(backLayer)——是为了配合界面,分为前景和后景

注:2DGFX需要调用一个不同的Flush函数的原因是2DGFX被置于一个不同的渲染容器(GfxRenderContainter)中

参考编辑器2DGFX(诛仙登录界面)

2D GFX的使用 程序联入的2DGFX,可以通过A3DGFXExMan提供的2DGFX接口进行加载,渲染等操作(用于登录界面等场合) 非程序联入的2DGFX,可以以3DGFX同样的方式渲染(RegisterGfx)。Flush采用Render2DGfx,而非RenderAllGfx(注1) 关于Render2DGfx的参数(backLayer)——是为了配合界面,分为前景和后景 注:2DGFX需要调用一个不同的Flush函数的原因是2DGFX被置于一个不同的渲染容器(GfxRenderContainter)中 参考编辑器2DGFX(诛仙登录界面)

Слайд 38

2DGFX 界面应用

2DGFX 界面应用
Имя файла: ECModel&amp;GFX-原理与应用.pptx
Количество просмотров: 35
Количество скачиваний: 0