Skyline开发:沿线的onframe行走(js)

本文介绍了一种使用JS代码实现模型沿预设路径动态行走的方法,通过onframe事件更新模型位置,确保拐弯处的平滑过渡,提供具体代码示例。

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

在之前的文章中,提到过使用onframe模拟动态行走的过程,和使用动态路径的效果不同,使用onframe的行走在拐弯中,效果比较平滑,行走的过程比较流畅。

下边列举一个在实际中的应用,如何沿着一条做好的线,在线上动态的移动一个模型文件。

以下是具体的js代码:

//一个通用函数,如何把te中geometry的点类型,转换成position位置

function pointToPostion(point,altitudeType)

{        

    var postionl=SGWorld.Creator.CreatePosition(point.X,point.Y,point.Z,altitudeType,0,0,0,0);

    return postionl;

}

//定义行走的模型,时间等参数

    var model = null;

    var time;  

    var linePointCount=0;   

    var i;   

    var altitudeType; 

    var linePoint;

    function Init()

    {

       i=0;

      //找到事先画好的线对象

       var item = SGWorld.ProjectTree.FindItem("线\\路径");

       var poly = SGWorld.ProjectTree.GetObject(item);

       //获得线对象的geometry和高度类型,线中包含的点

       var polygonGeometry = poly.Geometry;  

       altitudeType=poly.Position.AltitudeType;

       linePoint= polygonGeometry.Points;

       linePointCount=polygonGeometry.Points.Count;

       var fpos=pointToPostion(linePoint.Item(i),altitudeType);

       //初始化时间和onframe事件

        time = new Date();

        SGWorld.AttachEvent("onFrame", onFrame);                                                     //新建一个行走的模型

        model = SGWorld.Creator.CreateModel(fpos, "D:\\skylinedata\\小人.xpl", 3); 

    }

 //onframe时间实现,这是代码的关键

  function onFrame()

    {

     //按照线中的点进行行走,从第一个点到最后一个,当大于点数,路径走            完

        if(i<linePointCount-1)

        {

        //取当前点和后一个点,计算距离,起点指向终点的角度

          var fpos=pointToPostion(linePoint.Item(i),altitudeType);

          var spos=pointToPostion(linePoint.Item(i+1),altitudeType);

          var distance=fpos.DistanceTo(spos);

          var aimTo=fpos.AimTo(spos);       

         //计算onframe执行一次的时间,对象行走的距离         

          var distToMove = (30 * 1000 / 3600) * (new Date().getTime() - time.getTime()) / 1000;              

          //计算当前距离是否超高当前线段距离,如超过则切换线中下一个点

          var nowDis=fpos.DistanceTo(model.Position);

          if(nowDis<distance)

          {

         //设置模型的位置

           model.Position = model.Position.Move(distToMove, aimTo.Yaw, aimTo.Pitch);

           model.Position.Pitch=0;

          }

          else

          {

       //切换下一个点

              model.Position = spos;

              i++;

          }

           time = new Date();

        }

        else

        {                

           SGWorld.DetachEvent("onFrame", onFrame);  

        }

    }

行走效果图:
在这里插入图片描述
关注公众号,多多支持!
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值