2.6.12 模型动画
模型动画
模型动画是指在三维场景中添加动画效果的功能。目前模型动画支持模型的平移、旋转、缩放三种动画效果,也可以设置四元素变换和矩阵变换效果。
在创建模型动画时,需要指定动画图层的动画行为效果、动画的播放模式、模型初始位置以及模型路径等参数。
动画行为是指定模型动画的具体变换效果的对象。动画行为对象可以配置模型动画的行为类型、动画的插值方式、动画行为的关键帧等参数。
关键帧是指定模型动画运行的到某一时刻所在位置的对象。关键帧对象可以配置运行时刻和坐标位置。
注意:模型动画需要使用原点建模的模型文件。
模型动画主要包括添加(创建)、更新和删除3种操作。
下图是模型动画效果:
参数说明1
模型动画可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
LayerOptionsName | 图层配置项名称 | string | AnimationLayerOptions代表模型动画配置 |
Action | 动画行为配置项 | string | 动画行为配置项。配置添加顺序为缩放,旋转,平移,可以是其中一个或者多个的组合 |
PlayMode | 播放模式 | int | 播放模式。1-播放一次;2-暂停;3-重复播放;4-来回播放 |
GeoPosition | 模型初始位置 | x,y,z | 模型初始位置。需传入经度、纬度、高程坐标 |
Path | 模型路径 | string | 模型文件路径 |
参数说明2
动画行为可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
ActionType | 动画差值计算方式 | int | 动画差值计算方式 |
BindElementType | 动画行为类型 | int | 动画行为类型。1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换 |
ElementValue | 动画元素初始值 | x,y,z | 动画元素初始值 |
Param | 动画帧配置 | string | 动画帧配置 |
参数说明3
动画帧可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
Time | 时间 | float | 动画帧时间,单位为秒 |
Param | 动画帧位置 | x,y,z | 动画帧位置。需传入经度、纬度、高程坐标 |
代码调用示例
Javascript调用
//创建模型动画图层(组合)
var animationModeLayer = null;
function CreateAnimationLayer() {
//以下为动画图层的创建过程,动画帧至少设置两帧
//缩放
var scaleFrame0 = map.CreateAnimationFrame();//创建动画帧
if ( null != scaleFrame0 ) {
scaleFrame0.AddConfig("Time", "0.0");//时间,单位为秒
scaleFrame0.AddConfig("Param", "2,2,2");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
var scaleFrame1 = map.CreateAnimationFrame();//创建动画帧
if ( null != scaleFrame1 ){
scaleFrame1.AddConfig("Time", "38.0");//时间,单位为秒
scaleFrame1.AddConfig("Param", "4,4,4");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
var scaleAction = map.CreateAnimationAction();//创建动画行为
if ( null != scaleAction ) {
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
scaleAction.AddConfig("ActionType", "12");
scaleAction.AddConfig("BindElementType", "2");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
scaleAction.AddConfig("ElementValue","1.0,1.0,1.0");//动画元素初始值,三个参数为缩放在x,y,z轴的生效与否,1.0-生效,0-不生效
scaleAction.AddConfig("Param", scaleFrame0.GetConfig() + scaleFrame1.GetConfig());//添加动画帧
}
//旋转
var rotateFrame0 = map.CreateAnimationFrame();//创建动画帧
if ( null != rotateFrame0 ) {
rotateFrame0.AddConfig("Time", "0.0");//时间,单位为秒
rotateFrame0.AddConfig("Param", "400");//旋转角度
}
var rotateFrame1 = map.CreateAnimationFrame();//创建动画帧
if ( null != scaleFrame1 ) {
rotateFrame1.AddConfig("Time", "6.0");//时间,单位为秒
rotateFrame1.AddConfig("Param", "400");//旋转角度
}
var rotateFrame2 = map.CreateAnimationFrame();//创建动画帧
if ( null != scaleFrame1 ) {
rotateFrame2.AddConfig("Time", "12.0");//时间,单位为秒
rotateFrame2.AddConfig("Param", "400");//旋转角度
}
var rotateFrame3 = map.CreateAnimationFrame();//创建动画帧
if ( null != scaleFrame1 ) {
rotateFrame3.AddConfig("Time", "18.0");//时间,单位为秒
rotateFrame3.AddConfig("Param", "310");//旋转角度
}
var rotateFrame4 = map.CreateAnimationFrame();//创建动画帧
if ( null != scaleFrame1 ) {
rotateFrame4.AddConfig("Time", "28.0");//时间,单位为秒
rotateFrame4.AddConfig("Param", "190");//旋转角度
}
var rotateFrame5 = map.CreateAnimationFrame();//创建动画帧
if ( null != scaleFrame1 ) {
rotateFrame5.AddConfig("Time", "38.0");//时间,单位为秒
rotateFrame5.AddConfig("Param", "190");//旋转角度
}
var rotateAction = map.CreateAnimationAction();//创建动画行为
if ( null != rotateAction ) {
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
rotateAction.AddConfig("ActionType", "6");
rotateAction.AddConfig("BindElementType", "3");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
rotateAction.AddConfig("ElementValue", "0.0,1.0,0.0,0.0");//动画元素初始值,三个参数为模型在x,y,z轴上的缩放值,第四个参数为模型的旋转值,x轴指向正北;y轴指向上方向;z轴指向正东
rotateAction.AddConfig("Param", rotateFrame0.GetConfig() + rotateFrame1.GetConfig() + rotateFrame2.GetConfig() + rotateFrame3.GetConfig() +rotateFrame4.GetConfig() + rotateFrame5.GetConfig());//添加动画帧
}
//平移
var translateFrame0 = map.CreateAnimationFrame();//创建动画帧
if ( null != translateFrame0 ) {
translateFrame0.AddConfig("Time", "0.0");//时间,单位为秒
translateFrame0.AddConfig("Param", "120.219365777544,30.211591598271,94.107668481767");//经纬度位置
}
var translateFrame1 = map.CreateAnimationFrame();//创建动画帧
if ( null != translateFrame1 ) {
translateFrame1.AddConfig("Time", "6.0");//时间,单位为秒
translateFrame1.AddConfig("Param", "120.217207599772,30.210580791105,112.754693945870");//经纬度位置
}
var translateFrame2 = map.CreateAnimationFrame();//创建动画帧
if ( null != translateFrame2 ) {
translateFrame2.AddConfig("Time", "12.0");//时间,单位为秒
translateFrame2.AddConfig("Param", "120.216415738,30.2107330417,30");//经纬度位置
}
var translateFrame3 = map.CreateAnimationFrame();//创建动画帧
if ( null != translateFrame3 ) {
translateFrame3.AddConfig("Time", "18.0");//时间,单位为秒
translateFrame3.AddConfig("Param", "120.217250576,30.2111986699,30");//经纬度位置
}
var translateFrame4 = map.CreateAnimationFrame();//创建动画帧
if ( null != translateFrame4 ) {
translateFrame4.AddConfig("Time", "28.0");//时间,单位为秒
translateFrame4.AddConfig("Param", "120.216312318,30.2126769668,40");//经纬度位置
}
var translateFrame5 = map.CreateAnimationFrame();//创建动画帧
if ( null != translateFrame5 ) {
translateFrame5.AddConfig("Time", "38.0");//时间,单位为秒
translateFrame5.AddConfig("Param", "120.214077108,30.2116774671,50");//经纬度位置
}
var translateAction = map.CreateAnimationAction();//创建动画行为
if ( null != translateAction ) {
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
translateAction.AddConfig("ActionType", "12");
translateAction.AddConfig("BindElementType", "1");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
translateAction.AddConfig("ElementValue","0,0,0");//动画元素初始值,平移可不设置,使用默认值
translateAction.AddConfig("Param", translateFrame0.GetConfig() + translateFrame1.GetConfig()+translateFrame2.GetConfig() + translateFrame3.GetConfig()+translateFrame4.GetConfig() + translateFrame5.GetConfig());//添加动画帧
}
var tlo = map.CreateLayerOptions("LayerOptions");//创建图层配置项,参数任意
tlo.AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称
tlo.AddConfig("Action", scaleAction.GetConfig() + rotateAction.GetConfig() + translateAction.GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo.AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo.AddConfig("GeoPosition", "120.219365777544,30.211591598271,94.107668481767");//模型初始位置经纬度坐标
tlo.AddConfig("Path", gModelDeviceFolderPath+"\\cessna.osgb");//动画模型路径
animationModeLayer = map.CreateLayer("AnimationLayer", tlo);//创建动画图层
}
//平移
function CreateAnimationLayerTrans(){
var translateFrame0 = map.CreateAnimationFrame();//创建动画帧
if ( null != translateFrame0 ) {
translateFrame0.AddConfig("Time", "0.0");//时间,单位为秒
translateFrame0.AddConfig("Param", "120.219365777544,30.211591598271,94.107668481767");//经纬度位置
}
var translateFrame1 = map.CreateAnimationFrame();//创建动画帧
if ( null != translateFrame1 ) {
translateFrame1.AddConfig("Time", "15.0");//时间,单位为秒
translateFrame1.AddConfig("Param", "120.217207599772,30.210580791105,112.754693945870");//经纬度位置
}
var translateAction = map.CreateAnimationAction();//创建动画行为
if ( null != translateAction ) {
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
translateAction.AddConfig("ActionType", "12");
translateAction.AddConfig("BindElementType", "1");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
translateAction.AddConfig("ElementValue","0,0,0");//动画元素初始值,平移可不设置,使用默认值
translateAction.AddConfig("Param", translateFrame0.GetConfig() + translateFrame1.GetConfig());//添加动画帧
}
var tlo = map.CreateLayerOptions("LayerOptions");//创建图层配置项
tlo.AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称
tlo.AddConfig("Action", translateAction.GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo.AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo.AddConfig("GeoPosition", "120.219365777544,30.211591598271,94.107668481767");//模型初始位置经纬度坐标
tlo.AddConfig("Path", gModelDeviceFolderPath+"\\cessna.osgb");//动画模型路径
animationModeLayer = map.CreateLayer("AnimationLayer", tlo);//根据配置创建动画图层
}
//旋转
function CreateAnimationLayerRotate(){
var rotateFrame0 = map.CreateAnimationFrame();//创建动画帧
if ( null != rotateFrame0 ) {
rotateFrame0.AddConfig("Time", "0.0");//时间,单位为秒
rotateFrame0.AddConfig("Param", "0");//旋转角度
}
var rotateFrame1 = map.CreateAnimationFrame();//创建动画帧
if ( null != rotateFrame1 ) {
rotateFrame1.AddConfig("Time", "60.0");//时间,单位为秒
rotateFrame1.AddConfig("Param", "360");//旋转角度
}
var rotateAction = map.CreateAnimationAction();//创建动画行为
if ( null != rotateAction ) {
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
rotateAction.AddConfig("ActionType", "6");
rotateAction.AddConfig("BindElementType", "3");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
rotateAction.AddConfig("ElementValue", "0.0,1.0,0.0,0.0");//动画元素初始值,三个参数为模型在x,y,z轴上的缩放值,第四个参数为模型的旋转值,x轴指向正北;y轴指向上方向;z轴指向正东
rotateAction.AddConfig("Param", rotateFrame0.GetConfig() + rotateFrame1.GetConfig());//添加动画帧
}
var tlo = map.CreateLayerOptions("LayerOptions");//创建图层配置项
tlo.AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称
tlo.AddConfig("Action", rotateAction.GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo.AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo.AddConfig("GeoPosition", "120.219018160963,30.211418317027,94.107668481767");//模型初始位置经纬度坐标
tlo.AddConfig("Path", gModelDeviceFolderPath+"\\cessna.osgb");//动画模型路径
animationModeLayer = map.CreateLayer("AnimationLayer", tlo);//创建动画图层
}
//缩放
function CreateAnimationLayerScale(){
var scaleFrame0 = map.CreateAnimationFrame();//创建动画帧
if ( null != scaleFrame0 ) {
scaleFrame0.AddConfig("Time", "0.0");//时间,单位为秒
scaleFrame0.AddConfig("Param", "1,1,1");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
var scaleFrame1 = map.CreateAnimationFrame();//创建动画帧
if ( null != scaleFrame1 ){
scaleFrame1.AddConfig("Time", "10.0");//时间,单位为秒
scaleFrame1.AddConfig("Param", "1,5,1");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
var scaleAction = map.CreateAnimationAction();//创建动画行为
if ( null != scaleAction ) {
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
scaleAction.AddConfig("ActionType", "12");
scaleAction.AddConfig("BindElementType", "2");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
scaleAction.AddConfig("ElementValue","1.0,1.0,1.0");//动画元素初始值,三个参数为缩放在x,y,z轴的生效与否,1.0-生效,0-不生效
scaleAction.AddConfig("Param", scaleFrame0.GetConfig() + scaleFrame1.GetConfig());//添加动画帧
}
var tlo = map.CreateLayerOptions("LayerOptions");//创建图层配置项,参数任意
tlo.AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称,此值不可任意修改
tlo.AddConfig("Action", scaleAction.GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo.AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo.AddConfig("GeoPosition", "120.219018160963,30.211418317027,94.107668481767");//模型初始位置经纬度坐标
tlo.AddConfig("Path", gModelDeviceFolderPath+"\\cessna.osgb");//动画模型路径
animationModeLayer = map.CreateLayer("AnimationLayer", tlo);//根据配置创建动画图层
}
//添加动画图层
function AddAnimationLayer()
{
if( null != map && null != animationModeLayer ){
map.AddLayer(animationModeLayer);//添加动画图层
//animationModeLayer.AddObserver();//添加观察者,用于监听图层消息
}
}
//更新模型动画图层
var playMode = "1";
function UpdateAnimationModelLayer()
{
if( null != map && null != animationModeLayer ){
var tlo = map.CreateLayerOptions("AnimationLayerOptions");//创建动画图层配置,给配置起个名称,任意名称
tlo.AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层对应的配置项
tlo.AddConfig("PlayMode", playMode);//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
animationModeLayer.UpdateLayerOptions(tlo);//更新图层配置项
playMode = (playMode == "1")? "3":"1";
}
}
//移除模型动画图层
function RemoveAnimationLayer()
{
if( null != animationModeLayer && null != map ){
map.RemoveLayer( animationModeLayer );//移除动画图层
animationModeLayer = null;
}
}
C++调用
BaseObjectCOMLib::ILayerObjectPtr animationModeLayer;//图层对象
void CAnimationDlg::OnBnClickedCreateanimationlayer()
{
//以下为动画图层的创建过程,动画帧至少设置两帧
//缩放
ConfigOptionsCOMLib::IAnimatonFramePtr scaleFrame0 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != scaleFrame0 )
{
scaleFrame0->AddConfig("Time", "0.0");//时间,单位为秒
scaleFrame0->AddConfig("Param", "2,2,2");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
ConfigOptionsCOMLib::IAnimatonFramePtr scaleFrame1 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != scaleFrame1 )
{
scaleFrame1->AddConfig("Time", "38.0");//时间,单位为秒
scaleFrame1->AddConfig("Param", "4,4,4");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
ConfigOptionsCOMLib::IAnimationActionPtr scaleAction = map->CreateAnimationAction();//创建动画行为
if ( NULL != scaleAction )
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
scaleAction->AddConfig("ActionType", "12");
scaleAction->AddConfig("BindElementType", "2");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
scaleAction->AddConfig("ElementValue","1.0,1.0,1.0");//动画元素初始值,三个参数为缩放在x,y,z轴的生效与否,1.0-生效,0-不生效
scaleAction->AddConfig("Param", scaleFrame0->GetConfig() + scaleFrame1->GetConfig());//添加动画帧
}
//旋转
ConfigOptionsCOMLib::IAnimatonFramePtr rotateFrame0 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != rotateFrame0 )
{
rotateFrame0->AddConfig("Time", "0.0");//时间,单位为秒
rotateFrame0->AddConfig("Param", "400");//旋转角度
}
ConfigOptionsCOMLib::IAnimatonFramePtr rotateFrame1 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != scaleFrame1 )
{
rotateFrame1->AddConfig("Time", "6.0");//时间,单位为秒
rotateFrame1->AddConfig("Param", "400");//旋转角度
}
ConfigOptionsCOMLib::IAnimatonFramePtr rotateFrame2 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != scaleFrame1 )
{
rotateFrame2->AddConfig("Time", "12.0");//时间,单位为秒
rotateFrame2->AddConfig("Param", "400");//旋转角度
}
ConfigOptionsCOMLib::IAnimatonFramePtr rotateFrame3 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != scaleFrame1 )
{
rotateFrame3->AddConfig("Time", "18.0");//时间,单位为秒
rotateFrame3->AddConfig("Param", "310");//旋转角度
}
ConfigOptionsCOMLib::IAnimatonFramePtr rotateFrame4 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != scaleFrame1 )
{
rotateFrame4->AddConfig("Time", "28.0");//时间,单位为秒
rotateFrame4->AddConfig("Param", "190");//旋转角度
}
ConfigOptionsCOMLib::IAnimatonFramePtr rotateFrame5 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != scaleFrame1 )
{
rotateFrame5->AddConfig("Time", "38.0");//时间,单位为秒
rotateFrame5->AddConfig("Param", "190");//旋转角度
}
ConfigOptionsCOMLib::IAnimationActionPtr rotateAction = map->CreateAnimationAction();//创建动画行为
if ( NULL != rotateAction )
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
rotateAction->AddConfig("ActionType", "6");
rotateAction->AddConfig("BindElementType", "3");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
rotateAction->AddConfig("ElementValue", "0.0,1.0,0.0,0.0");//动画元素初始值,三个参数为模型在x,y,z轴上的缩放值,第四个参数为模型的旋转值,x轴指向正北;y轴指向上方向;z轴指向正东
rotateAction->AddConfig("Param", rotateFrame0->GetConfig() + rotateFrame1->GetConfig() + rotateFrame2->GetConfig() + rotateFrame3->GetConfig() +rotateFrame4->GetConfig() + rotateFrame5->GetConfig());//添加动画帧
}
//平移
ConfigOptionsCOMLib::IAnimatonFramePtr translateFrame0 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != translateFrame0 )
{
translateFrame0->AddConfig("Time", "0.0");//时间,单位为秒
translateFrame0->AddConfig("Param", "120.219365777544,30.211591598271,94.107668481767");//经纬度位置
}
ConfigOptionsCOMLib::IAnimatonFramePtr translateFrame1 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != translateFrame1 )
{
translateFrame1->AddConfig("Time", "6.0");//时间,单位为秒
translateFrame1->AddConfig("Param", "120.217207599772,30.210580791105,112.754693945870");//经纬度位置
}
ConfigOptionsCOMLib::IAnimatonFramePtr translateFrame2 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != translateFrame2 )
{
translateFrame2->AddConfig("Time", "12.0");//时间,单位为秒
translateFrame2->AddConfig("Param", "120.216415738,30.2107330417,30");//经纬度位置
}
ConfigOptionsCOMLib::IAnimatonFramePtr translateFrame3 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != translateFrame3 )
{
translateFrame3->AddConfig("Time", "18.0");//时间,单位为秒
translateFrame3->AddConfig("Param", "120.217250576,30.2111986699,30");//经纬度位置
}
ConfigOptionsCOMLib::IAnimatonFramePtr translateFrame4 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != translateFrame4 )
{
translateFrame4->AddConfig("Time", "28.0");//时间,单位为秒
translateFrame4->AddConfig("Param", "120.216312318,30.2126769668,40");//经纬度位置
}
ConfigOptionsCOMLib::IAnimatonFramePtr translateFrame5 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != translateFrame5 )
{
translateFrame5->AddConfig("Time", "38.0");//时间,单位为秒
translateFrame5->AddConfig("Param", "120.214077108,30.2116774671,50");//经纬度位置
}
ConfigOptionsCOMLib::IAnimationActionPtr translateAction = map->CreateAnimationAction();//创建动画行为
if ( NULL != translateAction )
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
translateAction->AddConfig("ActionType", "12");
translateAction->AddConfig("BindElementType", "1");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
translateAction->AddConfig("ElementValue","0,0,0");//动画元素初始值,平移可不设置,使用默认值
translateAction->AddConfig("Param", translateFrame0->GetConfig() + translateFrame1->GetConfig()+translateFrame2->GetConfig() + translateFrame3->GetConfig()+translateFrame4->GetConfig() + translateFrame5->GetConfig());//添加动画帧
}
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("LayerOptions");//创建图层配置项,参数任意
tlo->AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称
tlo->AddConfig("Action", scaleAction->GetConfig() + rotateAction->GetConfig() + translateAction->GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo->AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo->AddConfig("GeoPosition", "120.219365777544,30.211591598271,94.107668481767");//模型初始位置经纬度坐标
tlo->AddConfig("Path", (gModelDeviceFolderPath+"\\cessna.osgb").c_str());//动画模型路径
animationModeLayer = map->CreateLayer("AnimationLayer", tlo);//根据配置创建动画图层
}
void CAnimationDlg::OnBnClickedCreateanimationlayertrans()
{
ConfigOptionsCOMLib::IAnimatonFramePtr translateFrame0 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != translateFrame0 )
{
translateFrame0->AddConfig("Time", "0.0");//时间,单位为秒
translateFrame0->AddConfig("Param", "120.219365777544,30.211591598271,94.107668481767");//经纬度位置
}
ConfigOptionsCOMLib::IAnimatonFramePtr translateFrame1 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != translateFrame1 )
{
translateFrame1->AddConfig("Time", "15.0");//时间,单位为秒
translateFrame1->AddConfig("Param", "120.217207599772,30.210580791105,112.754693945870");//经纬度位置
}
ConfigOptionsCOMLib::IAnimationActionPtr translateAction = map->CreateAnimationAction();//创建动画行为
if ( NULL != translateAction )
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
translateAction->AddConfig("ActionType", "12");
translateAction->AddConfig("BindElementType", "1");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
translateAction->AddConfig("ElementValue","0,0,0");//动画元素初始值,平移可不设置,使用默认值
translateAction->AddConfig("Param", translateFrame0->GetConfig() + translateFrame1->GetConfig());//添加动画帧
}
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("LayerOptions");//创建图层配置项
tlo->AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称
tlo->AddConfig("Action", translateAction->GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo->AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo->AddConfig("GeoPosition", "120.219365777544,30.211591598271,94.107668481767");//模型初始位置经纬度坐标
tlo->AddConfig("Path",(gModelDeviceFolderPath+"\\cessna.osgb").c_str());//动画模型路径
animationModeLayer = map->CreateLayer("AnimationLayer", tlo);//根据配置创建动画图层
}
void CAnimationDlg::OnBnClickedCreateanimationlayerrotate()
{
ConfigOptionsCOMLib::IAnimatonFramePtr rotateFrame0 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != rotateFrame0 )
{
rotateFrame0->AddConfig("Time", "0.0");//时间,单位为秒
rotateFrame0->AddConfig("Param", "0");//旋转角度
}
ConfigOptionsCOMLib::IAnimatonFramePtr rotateFrame1 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != rotateFrame1 )
{
rotateFrame1->AddConfig("Time", "60.0");//时间,单位为秒
rotateFrame1->AddConfig("Param", "360");//旋转角度
}
ConfigOptionsCOMLib::IAnimationActionPtr rotateAction = map->CreateAnimationAction();//创建动画行为
if ( NULL != rotateAction )
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
rotateAction->AddConfig("ActionType", "6");
rotateAction->AddConfig("BindElementType", "3");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
rotateAction->AddConfig("ElementValue", "0.0,1.0,0.0,0.0");//动画元素初始值,三个参数为模型在x,y,z轴上的缩放值,第四个参数为模型的旋转值,x轴指向正北;y轴指向上方向;z轴指向正东
rotateAction->AddConfig("Param", rotateFrame0->GetConfig() + rotateFrame1->GetConfig());//添加动画帧
}
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("LayerOptions");//创建图层配置项
tlo->AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称
tlo->AddConfig("Action", rotateAction->GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo->AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo->AddConfig("GeoPosition", "120.219018160963,30.211418317027,94.107668481767");//模型初始位置经纬度坐标
tlo->AddConfig("Path", (gModelDeviceFolderPath+"\\cessna.osgb").c_str());//动画模型路径
animationModeLayer = map->CreateLayer("AnimationLayer", tlo);//根据配置创建动画图层
}
void CAnimationDlg::OnBnClickedCreateanimationlayerscale()
{
ConfigOptionsCOMLib::IAnimatonFramePtr scaleFrame0 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != scaleFrame0 )
{
scaleFrame0->AddConfig("Time", "0.0");//时间,单位为秒
scaleFrame0->AddConfig("Param", "1,1,1");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
ConfigOptionsCOMLib::IAnimatonFramePtr scaleFrame1 = map->CreateAnimationFrame();//创建动画帧
if ( NULL != scaleFrame1 )
{
scaleFrame1->AddConfig("Time", "10.0");//时间,单位为秒
scaleFrame1->AddConfig("Param", "1,5,1");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
ConfigOptionsCOMLib::IAnimationActionPtr scaleAction = map->CreateAnimationAction();//创建动画行为
if ( NULL != scaleAction )
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
scaleAction->AddConfig("ActionType", "12");
scaleAction->AddConfig("BindElementType", "2");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
scaleAction->AddConfig("ElementValue","1.0,1.0,1.0");//动画元素初始值,三个参数为缩放在x,y,z轴的生效与否,1.0-生效,0-不生效
scaleAction->AddConfig("Param", scaleFrame0->GetConfig() + scaleFrame1->GetConfig());//添加动画帧
}
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("LayerOptions");//创建图层配置项,参数任意
tlo->AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称,此值不可任意修改
tlo->AddConfig("Action", scaleAction->GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo->AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo->AddConfig("GeoPosition", "120.219018160963,30.211418317027,94.107668481767");//模型初始位置经纬度坐标
tlo->AddConfig("Path", (gModelDeviceFolderPath+"\\cessna.osgb").c_str());//动画模型路径
animationModeLayer = map->CreateLayer("AnimationLayer", tlo);//根据配置创建动画图层
}
void CAnimationDlg::OnBnClickedAddanimationlayer()
{
if( NULL != map && NULL != animationModeLayer )
{
map->AddLayer(animationModeLayer);//添加动画图层
//animationModeLayer->AddObserver();//添加观察者,用于监听图层消息
}
}
void CAnimationDlg::OnBnClickedUpdateanimationmodellayer()
{
if( NULL != map && NULL != animationModeLayer )
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("AnimationLayerOptions");//创建动画图层配置
tlo->AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层对应的配置项
tlo->AddConfig("PlayMode", "1");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
animationModeLayer->UpdateLayerOptions(tlo);//更新图层配置项
}
}
void CAnimationDlg::OnBnClickedRemoveanimationlayer()
{
if( NULL != animationModeLayer && NULL != map )
{
map->RemoveLayer( animationModeLayer ); //移除动画图层
animationModeLayer = NULL;
}
}
BEGIN_EVENTSINK_MAP(CAnimationDlg, CDialogEx)
ON_EVENT(CAnimationDlg, IDC_VPSDKCTRL1, 14, CAnimationDlg::FireOnLayerNotifyVpsdkctrl1, VTS_BSTR VTS_I4)
END_EVENTSINK_MAP()
void CAnimationDlg::FireOnLayerNotifyVpsdkctrl1(LPCTSTR idInfo, long layerType)
{
if( NULL != animationModeLayer )
{
ConfigOptionsCOMLib::ILayerOptionsPtr animationLayerResult = animationModeLayer->GetLayerResult();
//判断当前图层数据源类型
std::string DataSourceTypeName = animationLayerResult->GetConfigValueByKey("DataSourceTypeName");//获得数据源类型
if( DataSourceTypeName == "AnimationLayer" )
{
CString playMode = animationLayerResult->GetConfigValueByKey("PlayMode");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
CString worldPos = animationLayerResult->GetConfigValueByKey("RealTimePosition");//模型动画实时位置(世界坐标)
CString geoPos = animationLayerResult->GetConfigValueByKey("RealTimePositionGeo");//模型动画实时位置(经纬度坐标)
}
}
}
C#调用
//创建动画图层(组合)
ILayerObject animationModeLayer = null;
private void CreateAnimationLayer_Click(object sender, EventArgs e)
{
//以下为动画图层的创建过程,动画帧至少设置两帧
//缩放
IAnimatonFrame scaleFrame0 = map.CreateAnimationFrame();//创建动画帧
if (null != scaleFrame0)
{
scaleFrame0.AddConfig("Time", "0.0");//时间,单位为秒
scaleFrame0.AddConfig("Param", "2,2,2");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
IAnimatonFrame scaleFrame1 = map.CreateAnimationFrame();//创建动画帧
if (null != scaleFrame1)
{
scaleFrame1.AddConfig("Time", "38.0");//时间,单位为秒
scaleFrame1.AddConfig("Param", "4,4,4");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
IAnimationAction scaleAction = map.CreateAnimationAction();//创建动画行为
if (null != scaleAction)
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
scaleAction.AddConfig("ActionType", "12");
scaleAction.AddConfig("BindElementType", "2");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
scaleAction.AddConfig("ElementValue", "1.0,1.0,1.0");//动画元素初始值,三个参数为缩放在x,y,z轴的生效与否,1.0-生效,0-不生效
scaleAction.AddConfig("Param", scaleFrame0.GetConfig() + scaleFrame1.GetConfig());//添加动画帧
}
//旋转
IAnimatonFrame rotateFrame0 = map.CreateAnimationFrame();//创建动画帧
if (null != rotateFrame0)
{
rotateFrame0.AddConfig("Time", "0.0");//时间,单位为秒
rotateFrame0.AddConfig("Param", "400");//旋转角度
}
IAnimatonFrame rotateFrame1 = map.CreateAnimationFrame();//创建动画帧
if (null != scaleFrame1)
{
rotateFrame1.AddConfig("Time", "6.0");//时间,单位为秒
rotateFrame1.AddConfig("Param", "400");//旋转角度
}
IAnimatonFrame rotateFrame2 = map.CreateAnimationFrame();//创建动画帧
if (null != scaleFrame1)
{
rotateFrame2.AddConfig("Time", "12.0");//时间,单位为秒
rotateFrame2.AddConfig("Param", "400");//旋转角度
}
IAnimatonFrame rotateFrame3 = map.CreateAnimationFrame();//创建动画帧
if (null != scaleFrame1)
{
rotateFrame3.AddConfig("Time", "18.0");//时间,单位为秒
rotateFrame3.AddConfig("Param", "310");//旋转角度
}
IAnimatonFrame rotateFrame4 = map.CreateAnimationFrame();//创建动画帧
if (null != scaleFrame1)
{
rotateFrame4.AddConfig("Time", "28.0");//时间,单位为秒
rotateFrame4.AddConfig("Param", "190");//旋转角度
}
IAnimatonFrame rotateFrame5 = map.CreateAnimationFrame();//创建动画帧
if (null != scaleFrame1)
{
rotateFrame5.AddConfig("Time", "38.0");//时间,单位为秒
rotateFrame5.AddConfig("Param", "190");//旋转角度
}
IAnimationAction rotateAction = map.CreateAnimationAction();//创建动画行为
if (null != rotateAction)
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
rotateAction.AddConfig("ActionType", "6");
rotateAction.AddConfig("BindElementType", "3");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
rotateAction.AddConfig("ElementValue", "0.0,1.0,0.0,0.0");//动画元素初始值,三个参数为模型在x,y,z轴上的缩放值,第四个参数为模型的旋转值,x轴指向正北;y轴指向上方向;z轴指向正东
rotateAction.AddConfig("Param", rotateFrame0.GetConfig() + rotateFrame1.GetConfig() + rotateFrame2.GetConfig() + rotateFrame3.GetConfig() + rotateFrame4.GetConfig() + rotateFrame5.GetConfig());//添加动画帧
}
//平移
IAnimatonFrame translateFrame0 = map.CreateAnimationFrame();//创建动画帧
if (null != translateFrame0)
{
translateFrame0.AddConfig("Time", "0.0");//时间,单位为秒
translateFrame0.AddConfig("Param", "120.219365777544,30.211591598271,94.107668481767");//经纬度位置
}
IAnimatonFrame translateFrame1 = map.CreateAnimationFrame();//创建动画帧
if (null != translateFrame1)
{
translateFrame1.AddConfig("Time", "6.0");//时间,单位为秒
translateFrame1.AddConfig("Param", "120.217207599772,30.210580791105,112.754693945870");//经纬度位置
}
IAnimatonFrame translateFrame2 = map.CreateAnimationFrame();//创建动画帧
if (null != translateFrame2)
{
translateFrame2.AddConfig("Time", "12.0");//时间,单位为秒
translateFrame2.AddConfig("Param", "120.216415738,30.2107330417,30");//经纬度位置
}
IAnimatonFrame translateFrame3 = map.CreateAnimationFrame();//创建动画帧
if (null != translateFrame3)
{
translateFrame3.AddConfig("Time", "18.0");//时间,单位为秒
translateFrame3.AddConfig("Param", "120.217250576,30.2111986699,30");//经纬度位置
}
IAnimatonFrame translateFrame4 = map.CreateAnimationFrame();//创建动画帧
if (null != translateFrame4)
{
translateFrame4.AddConfig("Time", "28.0");//时间,单位为秒
translateFrame4.AddConfig("Param", "120.216312318,30.2126769668,40");//经纬度位置
}
IAnimatonFrame translateFrame5 = map.CreateAnimationFrame();//创建动画帧
if (null != translateFrame5)
{
translateFrame5.AddConfig("Time", "38.0");//时间,单位为秒
translateFrame5.AddConfig("Param", "120.214077108,30.2116774671,50");//经纬度位置
}
IAnimationAction translateAction = map.CreateAnimationAction();//创建动画行为
if (null != translateAction)
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
translateAction.AddConfig("ActionType", "12");
translateAction.AddConfig("BindElementType", "1");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
translateAction.AddConfig("ElementValue", "0,0,0");//动画元素初始值,平移可不设置,使用默认值
translateAction.AddConfig("Param", translateFrame0.GetConfig() + translateFrame1.GetConfig() + translateFrame2.GetConfig() + translateFrame3.GetConfig() + translateFrame4.GetConfig() + translateFrame5.GetConfig());//添加动画帧
}
ILayerOptions tlo = map.CreateLayerOptions("LayerOptions");//创建图层配置项,参数任意
tlo.AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称
tlo.AddConfig("Action", scaleAction.GetConfig() + rotateAction.GetConfig() + translateAction.GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo.AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo.AddConfig("GeoPosition", "120.219365777544,30.211591598271,94.107668481767");//模型初始位置经纬度坐标
tlo.AddConfig("Path", gModelDeviceFolderPath + "\\cessna.osgb");//动画模型路径
animationModeLayer = map.CreateLayer("AnimationLayer", tlo);//根据配置创建动画图层
}
private void CreateAnimationLayerTrans_Click(object sender, EventArgs e)
{
IAnimatonFrame translateFrame0 = map.CreateAnimationFrame();//创建动画帧
if (null != translateFrame0)
{
translateFrame0.AddConfig("Time", "0.0");//时间,单位为秒
translateFrame0.AddConfig("Param", "120.219365777544,30.211591598271,94.107668481767");//经纬度位置
}
IAnimatonFrame translateFrame1 = map.CreateAnimationFrame();//创建动画帧
if (null != translateFrame1)
{
translateFrame1.AddConfig("Time", "15.0");//时间,单位为秒
translateFrame1.AddConfig("Param", "120.217207599772,30.210580791105,112.754693945870");//经纬度位置
}
IAnimationAction translateAction = map.CreateAnimationAction();//创建动画行为
if (null != translateAction)
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
translateAction.AddConfig("ActionType", "12");
translateAction.AddConfig("BindElementType", "1");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
translateAction.AddConfig("ElementValue", "0,0,0");//动画元素初始值,平移可不设置,使用默认值
translateAction.AddConfig("Param", translateFrame0.GetConfig() + translateFrame1.GetConfig());//添加动画帧
}
ILayerOptions tlo = map.CreateLayerOptions("LayerOptions");//创建图层配置项
tlo.AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称
tlo.AddConfig("Action", translateAction.GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo.AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo.AddConfig("GeoPosition", "120.219365777544,30.211591598271,94.107668481767");//模型初始位置经纬度坐标
tlo.AddConfig("Path", gModelDeviceFolderPath + "\\cessna.osgb");//动画模型路径
animationModeLayer = map.CreateLayer("AnimationLayer", tlo);//根据配置创建动画图层
}
private void CreateAnimationLayerRotate_Click(object sender, EventArgs e)
{
IAnimatonFrame rotateFrame0 = map.CreateAnimationFrame();//创建动画帧
if (null != rotateFrame0)
{
rotateFrame0.AddConfig("Time", "0.0");//时间,单位为秒
rotateFrame0.AddConfig("Param", "0");//旋转角度
}
IAnimatonFrame rotateFrame1 = map.CreateAnimationFrame();//创建动画帧
if (null != rotateFrame1)
{
rotateFrame1.AddConfig("Time", "60.0");//时间,单位为秒
rotateFrame1.AddConfig("Param", "360");//旋转角度
}
IAnimationAction rotateAction = map.CreateAnimationAction();//创建动画行为
if (null != rotateAction)
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
rotateAction.AddConfig("ActionType", "6");
rotateAction.AddConfig("BindElementType", "3");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
rotateAction.AddConfig("ElementValue", "0.0,1.0,0.0,0.0");//动画元素初始值,三个参数为模型在x,y,z轴上的缩放值,第四个参数为模型的旋转值,x轴指向正北;y轴指向上方向;z轴指向正东
rotateAction.AddConfig("Param", rotateFrame0.GetConfig() + rotateFrame1.GetConfig());//添加动画帧
}
ILayerOptions tlo = map.CreateLayerOptions("LayerOptions");//创建图层配置项
tlo.AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称
tlo.AddConfig("Action", rotateAction.GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo.AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo.AddConfig("GeoPosition", "120.219018160963,30.211418317027,94.107668481767");//模型初始位置经纬度坐标
tlo.AddConfig("Path", gModelDeviceFolderPath + "\\cessna.osgb");//动画模型路径
animationModeLayer = map.CreateLayer("AnimationLayer", tlo);//根据配置创建动画图层
}
private void CreateAnimationLayerScale1_Click(object sender, EventArgs e)
{
IAnimatonFrame scaleFrame0 = map.CreateAnimationFrame();//创建动画帧
if (null != scaleFrame0)
{
scaleFrame0.AddConfig("Time", "0.0");//时间,单位为秒
scaleFrame0.AddConfig("Param", "1,1,1");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
IAnimatonFrame scaleFrame1 = map.CreateAnimationFrame();//创建动画帧
if (null != scaleFrame1)
{
scaleFrame1.AddConfig("Time", "10.0");//时间,单位为秒
scaleFrame1.AddConfig("Param", "1,5,1");//缩放值,为x,y,z轴的缩放大小,x轴指向正北;y轴指向上方向;z轴指向正东
}
IAnimationAction scaleAction = map.CreateAnimationAction();//创建动画行为
if (null != scaleAction)
{
//动画差值计算方式
//1-单精度逐帧采样方式
//2-单精度贝塞尔曲线插值方式
//3-单精度线性插值方式
//4-双精度逐帧采样方式
//5-双精度贝塞尔曲线插值方式
//6-双精度线性插值方式
//7-二维数逐帧采样方式
//8-二维数贝塞尔曲线插值方式
//9-二维数线性插值方式
//10-三维数逐帧采样方式
//11-三维数贝塞尔曲线插值方式
//12-三维数线性插值方式
//13-四维数逐帧采样方式
//14-四维数贝塞尔曲线插值方式
//15-四维数线性插值方式
//16-四元数逐帧采样方式
//17-四元数线性插值方式
//18-四元数逐帧采样方式
//19-四元数线性插值方式
scaleAction.AddConfig("ActionType", "12");
scaleAction.AddConfig("BindElementType", "2");//动画行为类型,1-平移,2-缩放,3-旋转,4-四元数,5-矩阵变换
scaleAction.AddConfig("ElementValue", "1.0,1.0,1.0");//动画元素初始值,三个参数为缩放在x,y,z轴的生效与否,1.0-生效,0-不生效
scaleAction.AddConfig("Param", scaleFrame0.GetConfig() + scaleFrame1.GetConfig());//添加动画帧
}
ILayerOptions tlo = map.CreateLayerOptions("LayerOptions");//创建图层配置项,参数任意
tlo.AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层配置项名称,此值不可任意修改
tlo.AddConfig("Action", scaleAction.GetConfig());//动画行为配置项,顺序为缩放,旋转,平移
tlo.AddConfig("PlayMode", "3");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
tlo.AddConfig("GeoPosition", "120.219018160963,30.211418317027,94.107668481767");//模型初始位置经纬度坐标
tlo.AddConfig("Path", gModelDeviceFolderPath + "\\cessna.osgb");//动画模型路径
animationModeLayer = map.CreateLayer("AnimationLayer", tlo);//根据配置创建动画图层
}
private void AddAnimationLayer_Click(object sender, EventArgs e)
{
if (null != map && null != animationModeLayer)
{
map.AddLayer(animationModeLayer);//添加动画图层
//animationModeLayer.AddObserver();//添加观察者,用于监听图层消息
}
}
string playMode = "1";
private void UpdateAnimationModelLayer_Click(object sender, EventArgs e)
{
if (null != map && null != animationModeLayer)
{
var tlo = map.CreateLayerOptions("AnimationLayerOptions");//创建动画图层配置,给配置起个名称,任意名称
tlo.AddConfig("LayerOptionsName", "AnimationLayerOptions");//图层对应的配置项
tlo.AddConfig("PlayMode", playMode);//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
animationModeLayer.UpdateLayerOptions(tlo);//更新图层配置项
playMode = (playMode == "1") ? "3" : "1";
}
}
private void RemoveAnimationLayer_Click(object sender, EventArgs e)
{
if (null != animationModeLayer && null != map)
{
map.RemoveLayer(animationModeLayer); //移除动画图层
animationModeLayer = null;
}
}
private void axVPSDKCtrl1_FireOnLayerNotify(object sender, AxSDKCtrlLib._IVPSDKCtrlEvents_FireOnLayerNotifyEvent e)
{
if (null != animationModeLayer)
{
var animationLayerResult = animationModeLayer.GetLayerResult();
if (animationLayerResult.GetConfigValueByKey("DataSourceTypeName") == "AnimationLayer")
{
string playMode = animationLayerResult.GetConfigValueByKey("PlayMode");//播放模式,1-播放一次,2-暂停,3-重复播放,4-来回播放
string worldPos = animationLayerResult.GetConfigValueByKey("RealTimePosition");//模型动画实时位置(世界坐标)
string geoPos = animationLayerResult.GetConfigValueByKey("RealTimePositionGeo");//模型动画实时位置(经纬度坐标)
}
}
}