**
创建运动物体
**
一:技术原理:
为了实现更真实的人机交互,为了提供更好的可视效果,本平台提供了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();//根据路径播放动画
}
重点解析
- IMotionable的bind方法是创建运动物体的最主要函数,它实现了将静态模型绑定到动态路径上的工作。
- 一条运动路径MotionPath支持同时绑定多个物体,这样就可以实现多个物体同步运动。
3.MotionPath提供了对waypoint的增加、修改、删除等方法,并通过暂停、播放、停止灵活控制动画的状态。
枚举列表
三:注意事项
1.本节示例代码中使用了本地车辆模型TCJ006.osg,用户可通过SDK安装路径下的Samples\Media\osg\Vehicles\Car文件夹中找到该文件。
2.IMotionPath的addWaypoint2函数中有scale参数,可以用来调节模型大小比例。
3.更多示例请参考SDK初级篇 CameraTour一节。