关于路径跟随设置点形成路径控制物体运动.docx
- 文档编号:5247299
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:13
- 大小:20.78KB
关于路径跟随设置点形成路径控制物体运动.docx
《关于路径跟随设置点形成路径控制物体运动.docx》由会员分享,可在线阅读,更多相关《关于路径跟随设置点形成路径控制物体运动.docx(13页珍藏版)》请在冰豆网上搜索。
关于路径跟随设置点形成路径控制物体运动
用过Torque3D的人都知道,在这个引擎中可以在编辑模式下设定路径然后AI就会按照这个路径运动,现在unity3D也可以啦分享给大家希望能有点帮助~总共3个文件
把第一个个文件放在新建的gameobject上例如cube,然后creatempty创建空object作为splineparent,再创建4个或者多个sphere1,2,3,4作为它的子物体,然后将splineparent拖到这个代码varSplineParent:
GameObject中,最后会看到cube按照sphere1到4的顺序运动~
JavaScript-SplineController.js
enumeOrientationMode{NODE=0,TANGENT}
varSplineParent:
GameObject;
varDuration:
float=10.0;
varOrientationMode:
eOrientationMode=eOrientationMode.NODE;
varWrapMode:
eWrapMode=eWrapMode.ONCE;
varAutoStart:
boolean=true;
varAutoClose:
boolean=true;
varHideOnExecute:
boolean=true;
privatevarmSplineInterp:
SplineInterpolator=null;
privatevarmTransforms:
Array=null;
@scriptAddComponentMenu("Splines/SplineController")
functionOnDrawGizmos()
{
vartrans:
Array=GetTransforms();
if(trans.length<2)
return;
varinterp=newSplineInterpolator();
SetupSplineInterpolator(interp,trans);
interp.StartInterpolation(null,false,WrapMode);
varprevPos:
Vector3=trans[0].position;
for(c=1;c<=100;c++)
{
varcurrTime:
float=c*Duration/100.0;
varcurrPos=interp.GetHermiteAtTime(currTime);
varmag:
float=(currPos-prevPos).magnitude*2.0;
Gizmos.color=Color(mag,0.0,0.0,1.0);
Gizmos.DrawLine(prevPos,currPos);
prevPos=currPos;
}
}
functionStart()
{
mSplineInterp=gameObject.AddComponent(SplineInterpolator);
mTransforms=GetTransforms();
if(HideOnExecute)
DisableTransforms();
if(AutoStart)
FollowSpline();
}
functionSetupSplineInterpolator(interp:
SplineInterpolator,trans:
Array):
void
{
interp.Reset();
if(AutoClose)
varstep:
float=Duration/trans.length;
else
step=Duration/(trans.length-1);
for(varc:
int=0;c { if(OrientationMode==OrientationMode.NODE) { interp.AddPoint(trans[c].position,trans[c].rotation,step*c,Vector2(0.0,1.0)); } elseif(OrientationMode==OrientationMode.TANGENT) { if(c! =trans.length-1) varrot: Quaternion=Quaternion.LookRotation(trans[c+1].position-trans[c].position,trans[c].up); elseif(AutoClose) rot=Quaternion.LookRotation(trans[0].position-trans[c].position,trans[c].up); else rot=trans[c].rotation; interp.AddPoint(trans[c].position,rot,step*c,Vector2(0.0,1.0)); } } if(AutoClose) interp.SetAutoCloseMode(step*c); } //WeneedthistosortGameObjectsbyname classNameComparerextendsIComparer { functionCompare(trA: Object,trB: Object): int{ returntrA.gameObject.name.CompareTo(trB.gameObject.name); } } // //Returnschildrentransformsalreadysortedbyname // functionGetTransforms(): Array { varret: Array=newArray(); if(SplineParent! =null) { //WeneedtouseanArrayListbecausethere´snotSortmethodinArray... vartempTransformsArray=newArrayList(); vartempTransforms=SplineParent.GetComponentsInChildren(Transform); //Weneedtogetridoftheparent,whichisalsoreturnedbyGetComponentsInChildren... for(vartr: TransformintempTransforms) { if(tr! =SplineParent.transform) tempTransformsArray.Add(tr); } tempTransformsArray.Sort(newNameComparer()); ret=Array(tempTransformsArray); } returnret; } // //Disablesthesplineobjects,wegenerallydon'tneedthembecausetheyarejustauxiliary // functionDisableTransforms(): void { if(SplineParent! =null) { SplineParent.SetActiveRecursively(false); } } // //Startstheinterpolation // functionFollowSpline() { if(mTransforms.length>0) { SetupSplineInterpolator(mSplineInterp,mTransforms); mSplineInterp.StartInterpolation(null,true,WrapMode); } } JavaScript-SplineInterpolator.js enumeEndPointsMode{AUTO=0,AUTOCLOSED,EXPLICIT} enumeWrapMode{ONCE=0,LOOP} privatevarmEndPointsMode=eEndPointsMode.AUTO; classSplineNode { varPoint : Vector3; varRot : Quaternion; varTime : float; varEaseIO : Vector2; functionSplineNode(p: Vector3,quaternion,t: float,io: Vector2){Point=p;Rot=q;Time=t;EaseIO=io;} functionSplineNode(o: SplineNode){Point=o.Point;Rot=o.Rot;Time=o.Time;EaseIO=o.EaseIO;} } privatevarmNodes: Array=null; privatevarmState: String=""; privatevarmRotations: boolean=false; privatevarmOnEndCallback: Object; functionAwake() { Reset(); } functionStartInterpolation(endCallback: Object,bRotations: boolean,mode: eWrapMode) { if(mState! ="Reset") throw"Firstreset,addpointsandthencallhere"; mState=mode==eWrapMode.ONCE? "Once": "Loop"; mRotations=bRotations; mOnEndCallback=endCallback; SetInput(); } functionReset() { mNodes=newArray(); mState="Reset"; mCurrentIdx=1; mCurrentTime=0.0; mRotations=false; mEndPointsMode=eEndPointsMode.AUTO; } functionAddPoint(pos: Vector3,quat: Quaternion,timeInSeconds: float,easeInOut: Vector2) { if(mState! ="Reset") throw"Cannotaddpointsafterstart"; mNodes.push(SplineNode(pos,quat,timeInSeconds,easeInOut)); } functionSetInput() { if(mNodes.length<2) throw"Invalidnumberofpoints"; if(mRotations) { for(varc: int=1;c { //Alwaysinterpolateusingtheshortestpath->Selectivenegation if(Quaternion.Dot(mNodes[c].Rot,mNodes[c-1].Rot)<0) { mNodes[c].Rot.x=-mNodes[c].Rot.x; mNodes[c].Rot.y=-mNodes[c].Rot.y; mNodes[c].Rot.z=-mNodes[c].Rot.z; mNodes[c].Rot.w=-mNodes[c].Rot.w; } } } if(mEndPointsMode==eEndPointsMode.AUTO) { mNodes.Unshift(mNodes[0]); mNodes.push(mNodes[mNodes.length-1]); } elseif(mEndPointsMode==eEndPointsMode.EXPLICIT&&(mNodes.length<4)) throw"Invalidnumberofpoints"; } functionSetExplicitMode(): void { if(mState! ="Reset") throw"Cannotchangemodeafterstart"; mEndPointsMode=eEndPointsMode.EXPLICIT; } functionSetAutoCloseMode(joiningPointTime: float): void { if(mState! ="Reset") throw"Cannotchangemodeafterstart"; mEndPointsMode=eEndPointsMode.AUTOCLOSED; mNodes.push(newSplineNode(mNodes[0]asSplineNode)); mNodes[mNodes.length-1].Time=joiningPointTime; varvInitDir: Vector3 =(mNodes[1].Point-mNodes[0].Point).normalized; varvEndDir : Vector3 =(mNodes[mNodes.length-2].Point-mNodes[mNodes.length-1].Point).normalized; varfirstLength: float=(mNodes[1].Point-mNodes[0].Point).magnitude; varlastLength : float=(mNodes[mNodes.length-2].Point-mNodes[mNodes.length-1].Point).magnitude; varfirstNode: SplineNode=newSplineNode(mNodes[0]asSplineNode); firstNode.Point=mNodes[0].Point+vEndDir*firstLength; varlastNode: SplineNode=newSplineNode(mNodes[mNodes.length-1]asSplineNode); lastNode.Point=mNodes[0].Point+vInitDir*lastLength; mNodes.Unshift(firstNode); mNodes.push(lastNode); } privatevarmCurrentTime=0.0; privatevarmCurrentIdx=1; functionUpdate() { if(mState=="Reset"||mState=="Stopped"||mNodes.length<4) return; mCurrentTime+=Time.deltaTime; //Weadvancetonextpointinthepath if(mCurrentTime>=mNodes[mCurrentIdx+1].Time) { if(mCurrentIdx { mCurrentIdx++; } else { if(mState! ="Loop") { mState="Stopped"; //Westoprightintheendpoint transform.position=mNodes[mNodes.length-2].Point; if(mRotations) transform.rotation=mNodes[mNodes.length-2].Rot; //Wecallbacktoinformthatweareended if(mOnEndCallback! =null) mOnEndCallback(); } else { mCurrentIdx=1; mCurrentTime=0.0; } } } if(mState! ="Stopped") { //Calculatesthetparambetween0and1 varparam: float=(mCurrentTime-mNodes[mCurrentIdx].Time)/(mNodes[mCurrentIdx+1].Time-mNodes[mCurrentIdx].Time); //Smooththeparam param=MathUtils.Ease(param,mNodes[mCurrentIdx].EaseIO.x,mNodes[mCurrentIdx].EaseIO.y); transform.position=GetHermiteInternal(mCurrentIdx,param); if(mRotations) { transform.rotation=GetSquad(mCurrentIdx,param); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 路径 跟随 设置 形成 控制 物体 运动