人机交互技术 课件 第8-10章 寻路(进阶)、群组行为、梦幻森林案例教学_第1页
人机交互技术 课件 第8-10章 寻路(进阶)、群组行为、梦幻森林案例教学_第2页
人机交互技术 课件 第8-10章 寻路(进阶)、群组行为、梦幻森林案例教学_第3页
人机交互技术 课件 第8-10章 寻路(进阶)、群组行为、梦幻森林案例教学_第4页
人机交互技术 课件 第8-10章 寻路(进阶)、群组行为、梦幻森林案例教学_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

人机交互技术AI寻路系统(进阶)目录Catalog1教学目的与要求2重点、难点3教学进程安排4课后学习任务布置教学目的与要求01.本章将更深入地介绍AI寻路系统,更有深度的探究寻路组件的其他功能。目的:教学目的与要求学生能够深入了解寻路系统,完成课堂的学习与讨论,并且能够积极完成课后作业。要求:重点、难点02.在寻路系统入门的基础上进行进阶学习,学习寻路系统的其他功能。重点:重点、难点寻路系统的整理。难点:教学进程安排03.梯子效果爬坡功能允许攀爬的只有最大限度为60°的坡度,当面对更大的坡度时,MaxSlope就已经无法满足我们的需求了。这时我们需要用到一个新的组件:OffMeshLink。我们只需要给梯子添加OffMeshLink组件并挂载底端和顶端的空物体,我们就可以完成爬梯子的效果,实现垂直爬坡了。寻路路线限制到此为止我们学习的寻路都是在同一片烘焙区域,通过最短路径自行寻找目标的AI行为,但有时候我们需要限定不同的AI可以走的路线进行区分,这种情况我们就需要用到Navigation组件的Areas功能了。在Areas中我们可以添加烘焙区域名称,添加后Object中可以给烘焙区域限定区域名称,最后就可以在NavmeshAgent里面选择行走区域来限定AI的行走路线了。道路阻断在寻路系统中,只要AI开始寻路,就会“一去不回头”。要怎么做才能在它寻路过程中对它进行中途阻止呢,我们只需要在相应的路段上添加一个名为NavMeshObstacle的组件,这一段路就会阻止AI通过了,再通过代码控制该组件的显隐性,就可以控制AI寻路时,相应路段的阻断和连通了。课后学习任务布置学生分组讨论,并整理进阶寻路实现过程的笔记。人机交互技术群组行为教学目的与要求1重点难点2教学进程安排3课后学习任务布置4目录CONTENTS教学目的与要求1教学目的与要求目的:本章将介绍群组行为功能的实现方法,让学生了解群组行为的实现流程。要求:学生能够使用群组行为模拟AI行为,完成课堂的学习与讨论,并且能够积极完成课后作业。重点难点2重点难点重点:在本章中我们要学会力学的简单运算,组的管理方法,完成对整个群组的控制。难点:整理逻辑的整理,权重的把控。教学进程安排3群组行为的作用群组行为队列聚集分离力学计算距离检测碰撞组管理当有一群的人或者动物与环境进行真实的交互的时候,我们要想模拟出最真实的行为,就要让群体的行为符合群体的特征。在不加入unity3d环境中的人工智能的情况下,用简单的视觉模糊来进行鸟群的行为模拟。主要方法队列的力力学计算聚集的力距离检测分离的力碰撞组管理整个集体的前进方向恒定,不会因为个体而进行变动。每个个体都会向集体汇聚,不会脱离大部队,分散太远。每个个体都会与其他个体保持一定距离,不会非常靠近。通过牛顿第二定律计算每一个个体的前进方向和速度每一个个体通过距离检测判断自身附近是否有其他个体将附近的同类放到一个碰撞组中进行管理。群组行为的实现定义并初始化变量:publicTransformtarget;publicVector3velocity=Vector3.forward;privateVector3startVelocity;publicVector3SumForce=Vector3.zero;voidStart(){target=GameObject.Find("Target").transform;startVelocity=velocity;}ForceCompute(){SumForce=Vector3.zero;

Lisan_Force=Vector3.zero;Duilie_Partner.Clear();//清除队列数据

Collider[]colliders=Physics.OverlapSphere(transform.position,Lisan_Distance);//physicis之后代码的作用:用来检测以某个位置为半径发射一个圆以检测球体内有哪些游戏物体(用来做物理检测,得到的结果是coliider的集合)for(inti=0;i<colliders.Length;i++){if(colliders[i]!=null&&colliders[i].gameObject!=this.gameObject){Duilie_Partner.Add(colliders[i].gameObject);}}for(inti=0;i<Duilie_Partner.Count;i++){//计算位置距离

Vector3dir=transform.position-Duilie_Partner[i].transform.position;Lisan_Force+=dir.normalized/dir.magnitude;//计算所有邻居向前的向量和

}if(Duilie_Partner.Count>0){Lisan_Force*=Lisan_Weight;SumForce+=Lisan_Force;}}定义计算合力的函数并添加分离的力:群组行为的实现定义队列的力变量:publicfloatDuilie_Distance=6;//检测距离publicList<GameObject>Duilie_Partner=newList<GameObject>();publicfloatDuilie_Weight=3;publicVector3Duilie_Force=Vector3.zero;SumForce=Vector3.zero;

Lisan_Force=Vector3.zero;Duilie_Partner.Clear();//清除队列数据

Collider[]colliders=Physics.OverlapSphere(transform.position,Lisan_Distance);//physicis之后代码的作用:用来检测以某个位置为半径发射一个圆以检测球体内有哪些游戏物体(用来做物理检测,得到的结果是coliider的集合)for(inti=0;i<colliders.Length;i++){if(colliders[i]!=null&&colliders[i].gameObject!=this.gameObject){Duilie_Partner.Add(colliders[i].gameObject);}}for(inti=0;i<Duilie_Partner.Count;i++){//计算位置距离Vector3dir=transform.position-Duilie_Partner[i].transform.position;Lisan_Force+=dir.normalized/dir.magnitude;//计算所有邻居向前的向量和

}if(Duilie_Partner.Count>0){Lisan_Force*=Lisan_Weight;SumForce+=Lisan_Force;}}在合力计算中添加队列的力:群组行为的实现定义聚集的力变量:publicTransformtarget;publicVector3velocity=Vector3.forward;privateVector3startVelocity;publicVector3SumForce=Vector3.zero;voidStart(){target=GameObject.Find("Target").transform;startVelocity=velocity;}ForceCompute(){SumForce=Vector3.zero;

Lisan_Force=Vector3.zero;Duilie_Partner.Clear();//清除队列数据

Collider[]colliders=Physics.OverlapSphere(transform.position,Lisan_Distance);//physicis之后代码的作用:用来检测以某个位置为半径发射一个圆以检测球体内有哪些游戏物体(用来做物理检测,得到的结果是coliider的集合)for(inti=0;i<colliders.Length;i++){if(colliders[i]!=null&&colliders[i].gameObject!=this.gameObject){Duilie_Partner.Add(colliders[i].gameObject);}}for(inti=0;i<Duilie_Partner.Count;i++){//计算位置距离

Vector3dir=transform.position-Duilie_Partner[i].transform.position;Lisan_Force+=dir.normalized/dir.magnitude;//计算所有邻居向前的向量和

}if(Duilie_Partner.Count>0){Lisan_Force*=Lisan_Weight;SumForce+=Lisan_Force;}}在合力计算中添加聚集的力:群组行为的实现在合力中添加恒定飞行速度的力变量:ForceCompute(){…………//保持恒定飞行速度的力

Vector3engineForce=startVelocity-velocity;SumForce+=engineForce*0.1f;Vector3targetDir=target.position-transform.position;SumForce+=(targetDir.normalized-transform.forward)*speed*10f;}publicfloatTimer=0;publicfloatcheckTime=0.2f;publicfloatmass=1;voidUpdate(){Timer+=Time.deltaTime;if(Timer>checkTime){ForceCompute();//每0.2秒调用一次函数

Timer=0;}velocity+=(SumForce/mass)*Time.deltaTime*0.1f;transform.rotation=Quaternion.Slerp(transform.rotation,Quaternion.LookRotation(velocity),Time.deltaTime*3);transform.Translate(transform.forward*Time.deltaTime*velocity.magnitude,Space.World);}稳定频率调用计算合力的函数:课后学习任务布置4课后学习任务布置学生分组讨论,整理群组行为实现过程的笔记并理清整个功能的逻辑。THANKYOU人机交互技术Human-ComputerInteractionTechnology——基于LeapMotion的《梦幻森林》案例学习目的和要求1

重点和难点2《梦幻森林》LeapMotion和完善3

课后总结4目录CONTENTS学习指导建议重点掌握LeapMotion基本手势控制函数,能够替换不同的手部模型控制场景中的物体将LeapMotion与Unity3D进行连接,能够理解相关的参数设定,并且能够熟练的掌握位移、换色等基本操作强化练习LeapMotion的使用,通过相关的粒子特效案例增加趣味性、通过群组行为的控制使其和其他知识单元能够紧密结合,并且能够掌握相关的可穿戴设备的优缺点,参加各项学科赛事本章的学习建议在实验室的环境中进行,能够结合相应的设备进行不断的测试,同时本章的案例源代码在本书的配套光盘中,课后的案例和课程回顾等保存在本书的慕课资源中,建议读者先学习本章的基础知识,在最后通过线上教学资源进行不断的提升和课程的内容的加强练习。

学习目的和要求1学习目的和要求目的:

通过对《梦幻森林》案例的分析和学习,了解完整项目的制作过程,学习交互设计思路。将素材与技术更好的结合。目的:

通过对《梦幻森林》案例的分析和学习,了解完整项目的制作过程,学习交互设计思路。将素材与技术更好的结合。要求:

基于《梦幻森林》案例的了解结合对LeapMotion的学习,设计并创新新的交互创意和ji'yu玩法。

重点和难点2重点和难点重点:

掌握LeapMotion的基础知识,学会灵活运用,完善项目。难点:

对LeapMotion的运用,研究出符合自己主题的功能,设计合理有趣。LeapMotion和项目完善3LeapMotion和项目完善本节主要是对《梦幻森林》案例的最后一个交互模块LeapMotion交互和整个项目最好完善部分的分析,在《梦幻森林》的LeapMotion中,用简单的交互方式,实现蝴蝶群对LeapMotion手部的追踪。LeapMotion和项目完善首先,先导入LeapMotion,进入场景测试设备是否正常。,正常状态如下图所示将3D场景导入到LeapMotion场景中,导入蝴蝶资源包,添加进入场景中。LeapMotion和项目完善LeapMotion和项目完善以下脚本负责控制蝴蝶的群组行为控制。usingSystem.Collections;usingSystem.Collections.Generic;usingunityEngine;publicclassBufferController:MonoBehaviour{publicfloatspeed=1;publicVector3velocity=Vector3.forward;privateVector3startVelocity;publicTransformtarget;publicVector3sumForce=Vector3.zero;

LeapMotion和项目完善

publicfloatm=10;publicfloatseparationDistance=3;publicList<GameObject>seprationNeighbors=newList<GameObject>();publicfloatseparationWeight=1;//publicVector3separationForce=Vector3.zero;//分离的力publicfloatalignmentDistance=6;publicList<GameObject>alignmentNeighbors=newList<GameObject>();publicfloatalignmentWeight=3;publicVector3alignmentForce=Vector3.zero;//队列的力publicfloatcohesionWeight=1;publicVector3cohesionForce=Vector3.zero;//聚合的力publicfloatcheckInterval=0.2f;publicfloatanimRandomTime=2f;

privateAnimationanim;

LeapMotion和项目完善

privatevoidStart(){target=GameObject.Find("Target").transform;startVelocity=velocity;InvokeRepeating("CalcForce",0,checkInterval);anim=GetComponentInChildren<Animation>();Invoke("PlayAnim",Random.Range(0,animRandomTime));}voidPlayAnim(){anim.Play();}voidCalcForce(){print("calcForce");sumForce=Vector3.zero;separationForce=Vector3.zero;

LeapMotion和项目完善//计算分离的力seprationNeighbors.Clear();Collider[]colliders=Physics.OverlapSphere(transform.position,separationDistance);foreach(Collidercincolliders){if(c!=null&&c.gameObject!=this.gameObject){seprationNeighbors.Add(c.gameObject);}}foreach(GameObjectneighborinseprationNeighbors){Vector3dir=transform.position-neighbor.transform.position;separationForce+=dir.normalized/dir.magnitude;}if(seprationNeighbors.Count>0){separationForce*=separationWeight;sumForce+=separationForce;}

//计算队列的力alignmentNeighbors.Clear();//清空邻居每执行一次清空一次colliders=Physics.OverlapSphere(transform.position,alignmentDistance);//物理检测colliders的集合foreach(Collidercincolliders)//查找出来每一个Collider在colliders里找{if(c!=null&&c.gameObject!=this.gameObject)//c.gameObject!=this.gameObject是检测本身,排除自己{alignmentNeighbors.Add(c.gameObject);//检测到的添加到c.gameObject}}Vector3avgDir=Vector3.zero;//定义一个参数存储平均朝向

LeapMotion和项目完善foreach(GameObjectninalignmentNeighbors)//遍历所有的alignmentNeighbors{avgDir+=n.transform.forward;//把所有的n.transform都给平均朝向}if(alignmentNeighbors.Count>0)//如果队列的邻居大于0就是alignmentNeighbors不为空{avgDir/=alignmentNeighbors.Count;//得到平均朝向alignmentForce=avgDir-transform.forward;//alignmentForce平均朝向+transform.forward=avgDiralignmentForce*=alignmentWeight;sumForce+=alignmentForce;}//聚合的力if(alignmentNeighbors.Count>0){Vector3center=Vector3.zero;

LeapMotion和项目完善foreach(GameObjectninalignmentNeighbors){center+=n.transform.position;}center/=alignmentNeighbors.Count;Vector3dirToCenter=center-transform.position;cohesionForce+=dirToCenter.normalized*velocity.magnitude;cohesionForce*=cohesionWeight;sumForce+=cohesionForce;}//保持恒定飞行速度的力Vector3engineForce=velocity.normalized*startVelocity.magnitude;sumForce+=engineForce;Vector3targetDir=target.position-transform.position;sumForce+=(targetDir.normalized-transform.forward)*speed*20;}

LeapMotion和项目完善voidUpdate(){Vector3a=sumForce/m;velocity+=a*Time.deltaTime;//transform.rotation=Quaternion.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论