1、在看完CS代码后可以自己写程序了,我刚写了一个由线创建动态路径的代码,给大家参考。
2、配置完场景,加载完FDB。
3、代码片段
_axcontrol.axRenderControl1.InteractMode = gviInteractMode.gviInteractEdit;
crs = (new CRSFactory()).CreateFromWKT(_axcontrol.axRenderControl1.GetCurrentCrsWKT()) as ISpatialCRS;
if (crs.CrsType == gviCoordinateReferenceSystemType.gviCrsGeographic)
TYPE = gviObjectType.gviObjectTerrain;
else if (crs.CrsType == gviCoordinateReferenceSystemType.gviCrsProject
|| crs.CrsType == gviCoordinateReferenceSystemType.gviCrsUnknown)
TYPE = gviObjectType.gviObjectReferencePlane;
IGeometryFactory _geoFactory = new GeometryFactory();
point = _geoFactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ);
myline = _geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolyline, gviVertexAttribute.gviVertexAttributeZ) as IPolyline;
myline.SpatialCRS = crs;
rootId = _axcontrol.axRenderControl1.ObjectManager.GetProjectTree().RootID;
_axcontrol.axRenderControl1.RcMouseClickSelect += AxRenderControl1_RcMouseClickSelect;
_axcontrol.axRenderControl1.RcRButtonUp += AxRenderControl1_RcRButtonUp;
4、上面是创建按钮里的代码,还有2个函数,一个是拾取函数代码,一个是右键结束代码
//这个是鼠标点击拾取事件
point.SetCoords(e.intersectPoint.X, e.intersectPoint.Y, e.intersectPoint.Z, 0, 0);
myline.AppendPoint(point);
ICurveSymbol cs = new CurveSymbol();
cs.Color = 0xffff0000;
cs.Width = 1;
_axcontrol.axRenderControl1.ObjectManager.CreateRenderPolyline(myline, cs, rootId);
//这里是右键结束
_axcontrol.axRenderControl1.RcMouseClickSelect -= AxRenderControl1_RcMouseClickSelect;
_axcontrol.axRenderControl1.InteractMode = gviInteractMode.gviInteractNormal;
//从线创建动态对象
ICameraTour tour = null;
tour = _axcontrol.axRenderControl1.ObjectManager.CreateCameraTour(rootId);
dynamicObject = _axcontrol.axRenderControl1.ObjectManager.CreateDynamicObject(rootId);
dynamicObject.CrsWKT = tour.CrsWKT;
for (int i = 0; i <myline.PointCount-1; i++)
{
IVector3 vector0 = new Vector3(),vector1=new Vector3();
vector0.Set(myline.GetPoint(i).X, myline.GetPoint(i).Y, myline.GetPoint(i).Z);
vector1.Set(myline.GetPoint(i+1).X, myline.GetPoint(i+1).Y, myline.GetPoint(i+1).Z);
tour.AddWaypoint(vector0, _axcontrol.axRenderControl1.Camera.GetAimingAngles(vector0, vector1), 0, gviCameraTourMode.gviCameraTourLinear);
dynamicObject.AddWaypoint(vector0, 10);
}
IGeometryFactory gf = new GeometryFactory();
IModelPoint mp = gf.CreateGeometry(gviGeometryType.gviGeometryModelPoint, gviVertexAttribute.gviVertexAttributeZ) as IModelPoint;
mp.ModelName = AppDomain.CurrentDomain.BaseDirectory + "Character\\QiYeYuanGong.X";
IMatrix matrix = new Matrix();
matrix.MakeIdentity();
matrix.SetTranslate(myline.GetPoint(0).Position);
mp.FromMatrix(matrix);
skinMesh = _axcontrol.axRenderControl1.ObjectManager.CreateSkinnedMesh(mp, rootId);
if (skinMesh == null)
{
MessageBox.Show("骨骼动画创建失败!");
return false;
}
skinMesh.Loop = true;
skinMesh.Play();
skinMesh.MaxVisibleDistance = 1000;
skinMesh.ViewingDistance = 10;
IMotionable m = skinMesh as IMotionable;
position.Set(0, 0, 0);
m.Bind2(dynamicObject, position, 0, 0, 0);
dynamicObject.Play();
_axcontrol.axRenderControl1.Camera.FlyToObject(skinMesh.Guid, gviActionCode.gviActionFollowBehind);
_axcontrol.axRenderControl1.RcRButtonUp -= AxRenderControl1_RcRButtonUp;
return false;
5、用到的变量
private System.Guid rootId = new System.Guid();
private ISpatialCRS crs = null;
private gviObjectType TYPE = gviObjectType.gviObjectNone;
IPolyline myline = null;
private IVector3 position = new Vector3();
private IEulerAngle angle = new EulerAngle();
IPoint point = null;
private IDynamicObject dynamicObject = null;
private ISkinnedMesh skinMesh = null;
6、实现效果,绘制完自动跟随执行巡航
如需支持,请联系MrSun
sunhaihong@gvitech.com