




免费预览已结束,剩余11页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档实验二 聚集与避障实验报告一、实验目的掌握游戏中聚集与避障的人工智能算法,理解宽视野和有限视野的区别二、实验仪器Windows 7系统 Microsoft Visual Studio2015三、实验原理及过程/描述聚集与避障的算法原理/描述程序实现时的思路包括对每个调用的API进行详细说明智能体只考虑哪些在检测盒内的障碍物。初始的时候,要将游戏世界中所有的障碍物都迭代到内存中,并标记哪些在检测盒内的障碍物以作进一步分析,然后把所有已经标记的障碍物都转换到智能体的局部空间。转换坐标后,那些x坐标为负值的物体将不被考虑,所以问题就变得简单多了,接下来必须要检测障碍物是否和检测盒重叠。使障碍物的包围半径扩大检测盒宽度的一半。然后测试该障碍物的y值是否小于这个值(即障碍物的包围半径加上检测盒宽度的一半)。此时,只剩下那些与检测盒相交的障碍物了。接下来我们找出离智能体最近的相交点。再一次在局部空间中计算,第三步中扩大了障碍物的包围半径。用简单的线圆周相交测试方法可以得到被扩大的圈和x轴的相交点。4、 实验结果五、实验心得(需包括有何不足如何改进)/你认为目前的聚集与避障有什么不足之处,如何改进目前的聚集与避障的不足之处在于:可能会因为错误的方案设计而搞错导致路线的躲闪。还有就是从实验2开始,我的电脑本身出现了COMCTL32.LIB文件LINK的错误,后来在同学的帮助下我解决了这个问题。如何改进:实验前必须要经过精确的计算并且代码不能出现任何错误。把COMCTL32.LIB文件载入文件以让程序正确运行。6、 主要代码#include main.h#include time.h/-/*Book: AI for Game DevelopersAuthors: David M. Bourg & Glenn SeemannExample: Flocking, Chapter 4*/-#define_TIMESTEP0.0025#define_TOL1e-10#define_FWDTIME10#define_THRUSTFACTOR1.0#define _CHASESETUPtrue#define_SPAWN_AREA_R100#define_MAX_NUM_UNITS20#define_UNIT_LENGTH4#define_OBSTACLE_RADIUS_FACTOR8#define_OBSTACLE_RADIUS_OBSTACLE_RADIUS_FACTOR * _UNIT_LENGTH#define_COLLISION_VISIBILITY_FACTOR25#define_WIDEVIEW_RADIUS_FACTOR200#define_NARROWVIEW_RADIUS_FACTOR50#define_LIMITEDVIEW_RADIUS_FACTOR30#define_SEPARATION_FACTOR5#define_BACK_VIEW_ANGLE_FACTOR1#define_FRONT_VIEW_ANGLE_FACTOR1#define_NUM_OBSTACLES8/ Global Variables:intFrameCounter = 0;RigidBody2DUnits_MAX_NUM_UNITS;VectorTarget;VectorObstacles_NUM_OBSTACLES;boolInitialize(void)int i;GetRandomNumber(0, _WINWIDTH, true);for(i=0; i_MAX_NUM_UNITS/2)Unitsi.Interceptor = true;Unitsi.ThrustForce = _THRUSTFORCE*1.5f; else Unitsi.Interceptor = false;Unitsi.ThrustForce = _THRUSTFORCE;for(i=0; i_NUM_OBSTACLES; i+)Obstaclesi.x = GetRandomNumber(_OBSTACLE_RADIUS*4, _WINWIDTH-_OBSTACLE_RADIUS*4, false);Obstaclesi.y = /*_WINHEIGHT/2;*/GetRandomNumber(_OBSTACLE_RADIUS*4, _WINHEIGHT-_OBSTACLE_RADIUS*4, false);return true;voidDoUnitAI(int i)intj;intN;VectorPave;VectorVave;VectorFs;VectorPfs;Vectord, u, v, w;doublem;intNf;boolInView;boolDoFlock = WideView | LimitedView | NarrowView;intRadiusFactor;/ begin Flock AIFs.x = Fs.y = Fs.z = 0;Pave.x = Pave.y = Pave.z = 0;Vave.x = Vave.y = Vave.z = 0;N = 0;Pfs.x = 0;Pfs.y = Unitsi.fLength / 2.0f;Nf = 0;for(j=1; j 0) & (fabs(w.x) fabs(w.y)*_FRONT_VIEW_ANGLE_FACTOR) if(d.Magnitude() 0) | (w.y fabs(w.y)*_BACK_VIEW_ANGLE_FACTOR);RadiusFactor = _WIDEVIEW_RADIUS_FACTOR;if(LimitedView)InView = (w.y 0);RadiusFactor = _LIMITEDVIEW_RADIUS_FACTOR;if(NarrowView)InView = (w.y 0) & (fabs(w.x) fabs(w.y)*_FRONT_VIEW_ANGLE_FACTOR);RadiusFactor = _NARROWVIEW_RADIUS_FACTOR;if(InView & (Unitsi.Interceptor = Unitsj.Interceptor)if(d.Magnitude() 0) | (w.y fabs(w.y)*_BACK_VIEW_ANGLE_FACTOR)if(d.Magnitude() = (Unitsi.fLength * _SEPARATION_FACTOR)if(w.x 0) m = -1;Fs.x += m*_STEERINGFORCE * (Unitsi.fLength * _SEPARATION_FACTOR) / d.Magnitude();/ Cohesion Rule: if(DoFlock & (N 0)Pave = Pave / N;v = Unitsi.vVelocity;v.Normalize();u = Pave - Unitsi.vPosition;u.Normalize();w = VRotate2D(-Unitsi.fOrientation, u);if(w.x 0) m = 1;if(fabs(v*u) 0)Vave = Vave / N;u = Vave;u.Normalize();v = Unitsi.vVelocity;v.Normalize();w = VRotate2D(-Unitsi.fOrientation, u);if(w.x 0) m = 1;if(fabs(v*u) 1)Fs.x += m * _STEERINGFORCE * acos(v * u) / pi;/ Chase the target if the unit is a leaderif(Chase)if(Nf = 0) Unitsi.Leader = true;elseUnitsi.Leader = false;if(Unitsi.Leader | !DoFlock)if(!Unitsi.Interceptor)/ Chaseu = Units0.vPosition;d = u - Unitsi.vPosition;w = VRotate2D(-Unitsi.fOrientation, d);if(w.x 0) m = 1;Fs.x += m*_STEERINGFORCE; else / InterceptVectors1, s2, s12;doubletClose;VectorVr12;Vr12 = Units0.vVelocity-Unitsi.vVelocity; / closing velocitys12 = Units0.vPosition - Unitsi.vPosition; / range to closetClose = s12.Magnitude() / Vr12.Magnitude(); / time to closes1 = Units0.vPosition + (Units0.vVelocity * tClose);Target = s1;s2 = s1 - Unitsi.vPosition;w = VRotate2D(-Unitsi.fOrientation, s2);if(w.x 0) m = 1;Fs.x += m*_STEERINGFORCE;/ Collision avoidance (with static obstacles)Vectora, p, b;for(j=0; j_NUM_OBSTACLES; j+)u = Unitsi.vVelocity;u.Normalize();v = u * _COLLISION_VISIBILITY_FACTOR * Unitsi.fLength;a = Obstaclesj - Unitsi.vPosition;p = (a * u) * u;b = p - a;if(b.Magnitude() _OBSTACLE_RADIUS) & (p.Magnitude() v.Magnitude()/ impending collision.steer awayw = VRotate2D(-Unitsi.fOrientation, a);w.Normalize();if(w.x 0) m = -1;Fs.x += m * _STEERINGFORCE * (_COLLISION_VISIBILITY_FACTOR * Unitsi.fLength)/a.Magnitude();/ apply accumulated steering forceUnitsi.Fa = Fs;Unitsi.Pa = Pfs;/ end Flock AIvoidUpdateSimulation(void)doubledt = _TIMESTEP;inti;/ initialize the back bufferif(FrameCounter = _RENDER_FRAME_COUNT)ClearBackBuffer();DrawObstacles();/ Update player controlled unit:Units0.SetThrusters(false, false, 1);Units0.SetThrusters(false, false, 1);if (IsKeyDown(VK_RIGHT)Units0.SetThrusters(true, false, 0.5);if (IsKeyDown(VK_LEFT)Units0.SetThrusters(false, true, 0.5);Units0.UpdateBodyEuler(dt);if(FrameCounter = _RENDER_FRAME_COUNT)DrawCraft(Units0, RGB(0, 255, 0);if(Units0.vPosition.x _WINWIDTH) Units0.vPosition.x = 0;if(Units0.vPosition.x _WINHEIGHT) Units0.vPosition.y = 0;if(Units0.vPosition.y 0) Units0.vPosition.y = _WINHEIGHT;/ update computer controlled units:for(i=1; i= _RENDER_FRAME_COUNT)if(Unitsi.Leader)DrawCraft(Unitsi, RGB(255,0,0);else if(Unitsi.Interceptor)DrawCraft(Unitsi, RGB(255,0,255);elseDrawCraft(Unitsi, RGB(0,0,255);if(Unitsi.vPosition.x _WINWIDTH) Unitsi.vPosition.x = 0;if(Unitsi.vPosition.x _WINHEIGHT) Unitsi.vPosition.y = 0;if(Unitsi.vPosition.y = _RENDER_FRAME_COUNT) CopyBackBufferToWindow();FrameCounter = 0; elseFrameCounter+;voidDrawCraft(RigidBody2Dcraft, COLORREF clr)VectorvList5;doublewd, lg;inti;Vectorv1;wd = craft.fWidth;lg = craft.fLength;vList0.y = lg/2;vList0.x = wd/2;vList1.y = -lg/2;vList1.x = wd/2;vList2.y = -lg/2;vList2.x = -wd/2;vList3.y = lg/2;vList3.x = -wd/2;vList4.y = lg/2*1.5; vList4.x = 0;for(i=0; i5; i+)v1 = VRotate2D(craft.fOrientation, vListi);vListi = v1 + craft.vPosition;DrawLine(vList0.x, vList0.y, vList1.x, vList1.y, 2, clr);DrawLine(vList1.x, vList1.y, vList2.x, vList2.y, 2, clr);DrawLine(vList2.x, vList2.y, vList3.x, vList3.y, 2, clr);DrawLine(vList3.x, vList3.y, vList4.x, vList4.y, 2, clr);DrawLine(vList4.x, vList4.y, vList0.x, vList0.y, 2, clr);if(ShowVectors)Vectorv, u;doublef = 0.025;/ Show velocity vectors in greenDrawLine(craft.vPosition.x, craft.vPosition.y, craft.vPosition.x+craft.vVelocity.x, craft.vPosition.y+craft.vVelocity.y, 3, RGB(0,255,0);/ Show force vectors in black/ thrust vectorv.x = 0;v.y = craft.ThrustForce*f;v = VRotate2D(craft.fOrientation, v);u.x = craft.CT.x;u.y = craft.CT.y;u = VRotate2D(craft.fOrientation, u);DrawLine(craft.vPosition.x+u.x, craft.vPosition.y+u.y, craft.vPosition.x + u.x + v.x, craft.vPosition.y + u.y + v.y, 1, RGB(0,0,0);/ port steering forcev.x = craft.PThrust.x*f;v.y = craft.PThrust.y*f;v = VRotate2D(craft.fOrientation, v);u.x = craft.CPT.x;u.y = craft.CPT.y;u = VRotate2D(craft.fOrientation, u);DrawLine(craft.vPosition.x+u.x, craft.vPosition.y+u.y, craft.vPosition.x + u.x + v.x, craft.vPosition.y + u.y + v.y, 1, RGB(0,0,0);/ stbd st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国棉涤牛仔布行业投资前景及策略咨询研究报告
- 2025年中国数字显示功率因数表行业投资前景及策略咨询研究报告
- 公司摩托车使用管理制度
- 公司绿化员岗位管理制度
- 智慧动检使用管理制度
- 暴力防疫人员管理制度
- 中药购销实训室管理制度
- 施工企业廉政管理制度
- 助爱归巢计划书管理制度
- shuru药品管理制度
- 【山东】国际足球运动小镇概念规划方案
- 海氏(hay)职位分析法-介绍、实践与评价合集课件
- 煤矿安全规程露天部分参考题库(含答案)
- 有趣的英汉互译-课件
- (参考)菲达公司国内电除尘器业绩表
- 步进式加热炉耐材砌筑施工方案
- GB-T12232-2005- 通用阀门 法兰连接铁制闸阀
- 大学生职业生涯规划与就业指导教案第5讲:兴趣探索
- 2022年中国电信店长技能四级认证教材
- 门店电表记录表
- 常见散料堆积密度汇总-共10
评论
0/150
提交评论