【二次开发】CityMaker动态效果——运动物体

**

创建运动物体

**

一:技术原理:

为了实现更真实的人机交互,为了提供更好的可视效果,本平台提供了IDynamicObject接口,用于创建运动的物体。
我们首先需要创建一个点,用于表示模型的初始位置,然后通过插入点的方式,构建出物体运动的轨迹MotionPath,并确定每段路径移动的时间。
在这里插入图片描述

二:创建运动物体:

1. .Net代码

//创建一个运动物体
private void LoadDynamicObject()
{
    AxRenderControl rendercontrol = getRenderControl();//获取控件

    //创建IDynamicObject
    IDynamicObject dynamicObject = rendercontrol.ObjectManager.CreateDynamicObject(rootId);//创建运动物体

    //加载模型
    IGeometryFactory geoFac=new GeometryFactory();//创建几何工厂
    IModelPoint modelpoint = geoFac.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint;// 构造ModelPoint
    string modelName = "D:\\CityMakerBook\\citymakerbookdata\\TCJ006.osg";//模型路径
    modelpoint.ModelName = modelName;//将模型绑定到ModelPoint上

    //创建运动路径
    IMotionPath motionPath = rendercontrol.ObjectManager.CreateMotionPath(rootId);//创建运动路径
    IVector3 scale = new Vector3();//创建向量
    scale.Set(1, 1, 1);//设置模型比例尺

    //创建点、标识运动轨迹
    IPoint point1 = new GeometryFactory().CreatePoint(gviVertexAttribute.gviVertexAttributeZ);//创建起点
    IPoint point2 = new GeometryFactory().CreatePoint(gviVertexAttribute.gviVertexAttributeZ);//创建终点

    //定义位置信息
    IVector3 pos1 = new Vector3();//向量1
    IVector3 pos2 = new Vector3();向量2
    pos1.Set(0,0,0);//起点坐标
    pos2.Set(10000, 0, 0);//终点坐标

    //获取模型移动角度信息
    IEulerAngle angle = rendercontrol.Camera.GetAimingAngles(pos1, pos2);//获取起点与终点夹角

    //添加运动路径节点信息
    modelpoint.Position = pos1;//模型起始位置
    point1.Position = pos1;//定义起点位置
    motionPath.AddWaypoint2(point1, angle, scale, 0);//添加运动路径节点
    point2.Position = pos2;//定义终点位置
    motionPath.AddWaypoint2(point2, angle, scale, 10);//添加运动路径节点


    //将创建的模型捆绑到运动路径上   
    IRenderModelPoint renderModelPoint =rendercontrol.ObjectManager.CreateRenderModelPoint(modelpoint, null, rootId);//显示模型
    IMotionable m = renderModelPoint as IMotionable;//使模型可移动
    IVector3 position = new Vector3();//创建向量
    position.Set(0, 0, 0);//模型位置
    m.Bind(motionPath, position, 90, 0, 0);//将模型绑定到路径上

    //创建符号,绘制运动路线
    IPolyline line = new GeometryFactory().CreateGeometry(gviGeometryType.gviGeometryPolyline, gviVertexAttribute.gviVertexAttributeZ) as IPolyline;//创建线,辅助显示运动路径
    line.AppendPoint(point1);//添加辅助线节点
    line.AppendPoint(point2);//添加辅助线节点
    ICurveSymbol cur = new CurveSymbol();//创建线符号
    cur.Color = 0xFFFF0000;//线颜色
    cur.Width = 20;//线宽
    rendercontrol.ObjectManager.CreateRenderPolyline(line, cur, rootId);//显示辅助线

    //动画播放方法
    motionPath.Play();//根据路径播放动画         
}

2. JS代码

//创建一个运动物体
function LoadDynamicObject()
{
    var _g=document.getElementById("_g");
    var rootId="11111111-1111-1111-1111-111111111111";//声明ID

    //创建IDynamicObject
    var dynamicObject = _g.objectManager.createDynamicObject(rootId);//创建运动物体

    //加载模型
    var geoFac=_g.geometryFactory;//创建几何工厂
    var modelpoint = geoFac.createGeometry(2, 1);// 构造ModelPoint
    var modelName = "D:\\CityMakerBook\\citymakerbookdata\\TCJ006.osg";//模型路径
    modelpoint.modelName = modelName;//将模型绑定到ModelPoint上

    //创建运动路径
    var motionPath = _g.objectManager.createMotionPath(rootId);//创建运动路径
    var scale = _g.new_Vector3;//创建向量
    scale.set(1, 1, 1);//设置模型比例尺

    //创建点、线,标识运动路径
    var point1 = geoFac.createPoint(1);//创建点
    var point2 = geoFac.createPoint(1);//创建点

    //定义位置信息
    var pos1 = _g.new_Vector3;//向量1
    var pos2 = _g.new_Vector3;//向量2
    pos1.set(0,0,0);//起点坐标
    pos2.set(10000, 0, 0);//终点坐标

    //获取模型移动角度信息
    var angle = _g.camera.getAimingAngles(pos1, pos2);//获取起点与终点夹角

    //添加运动路径节点信息
    modelpoint.position = pos1;//模型起始位置
    point1.position = pos1;//定义起点位置
    motionPath.addWaypoint2(point, angle, scale, 0);//添加运动路径节点
    point2.position = pos2;//定义终点位置
    motionPath.addWaypoint2(point, angle, scale, 10);//添加运动路径节点

    //将创建的模型捆绑到运动路径上   
    var renderModelPoint =_g.objectManager.createRenderModelPoint(modelpoint, null, rootId);//显示模型
    var position = _g.new_Vector3;//创建向量
    position.set(0, 0, 0);//模型位置
    renderModelPoint.bind(motionPath, position, 90, 0, 0);//将模型绑定到路径上

    //创建符号,绘制运动路线
    var line = _g.geometryFactory.createGeometry(7, 1);//创建线,辅助显示运动路径
    line.appendPoint(point1);//添加辅助线节点
    line.appendPoint(point2);//添加辅助线节点
    var cur = _g.new_CurveSymbol;//创建线符号
    cur.color = 0xFFFF0000;//线颜色
    cur.width = 20;//线宽
    _g.objectManager.createRenderPolyline(line, cur, rootId);//显示辅助线

    //动画播放方法
    motionPath.play();//根据路径播放动画
}

重点解析

  1. IMotionable的bind方法是创建运动物体的最主要函数,它实现了将静态模型绑定到动态路径上的工作。
  2. 一条运动路径MotionPath支持同时绑定多个物体,这样就可以实现多个物体同步运动。
    3.MotionPath提供了对waypoint的增加、修改、删除等方法,并通过暂停、播放、停止灵活控制动画的状态。
    枚举列表
    在这里插入图片描述

三:注意事项

1.本节示例代码中使用了本地车辆模型TCJ006.osg,用户可通过SDK安装路径下的Samples\Media\osg\Vehicles\Car文件夹中找到该文件。
2.IMotionPath的addWaypoint2函数中有scale参数,可以用来调节模型大小比例。
3.更多示例请参考SDK初级篇 CameraTour一节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值