CityMaker学习教程08 一个示例,创建漫游路径

本文是CityMaker学习教程的一部分,介绍如何通过编程创建一条由线生成的动态漫游路径。首先,理解CS代码后可自行编写程序。接着,配置场景并加载FDB。文中提供了一段关键代码,包括创建按钮的代码、拾取函数和右键结束的代码。还涉及了所需的变量,最终实现了路径绘制完成后自动跟随巡航的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值