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");//模型动画实时位置(经纬度坐标)
        }
    }
}

results matching ""

    No results matching ""