人机交互技术 课件 第5-10章 射线检测-梦幻森林案例教学_第1页
人机交互技术 课件 第5-10章 射线检测-梦幻森林案例教学_第2页
人机交互技术 课件 第5-10章 射线检测-梦幻森林案例教学_第3页
人机交互技术 课件 第5-10章 射线检测-梦幻森林案例教学_第4页
人机交互技术 课件 第5-10章 射线检测-梦幻森林案例教学_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

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

文档简介

人机交互技术人机交互技术射线检测目录Catalog1教学目的与要求2重点、难点3教学进程安排4课后学习任务布置教学目的与要求01.本章将介绍射线检测技术的应用,让学生了解射线检测的原理和用法。目的:教学目的与要求学生完成课堂的学习与讨论,并且能够积极完成课后作业。要求:重点、难点02.射线检测的概念和程序结构。重点:重点、难点射线检测的发散性使用。难点:教学进程安排03.概念在开发中,尤其是跟模型与交互的时候,都会用到射线检测。射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。用途:射线应用范围比较广,多用于碰撞检测。在射击游戏中,我们就可以使用射线来代替子弹的作用。相关APIRayCamera.main.ScreenPointToRay(Vector3pos):返回一条射线Ray从摄像机到屏幕指定一个点。RayCamera.main.ViewportPointToRay(Vector3pos):返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点。Ray射线类RaycastHit:光线投射碰撞信息boolPhysics.Raycast(Vector3origin,Vector3direction,floatdistance,intlayerMask):当光线投射与任何碰撞器交叉时为真,否则为假。boolPhysics.Raycast(Rayray,Vector3direction,RaycastHitouthit,floatdistance,intlayerMask):在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()。boolPhysics.Raycast(Rayray,floatdistance,intlayerMask):当光线投射与任何碰撞器交叉时为真,否则为假。boolPhysics.Raycast(Vector3origin,Vector3direction,RaycastHitouthit,floatdistance,intlayerMask):当光线投射与任何碰撞器交叉时为真,否则为假。注意:如果从一个球型体的内部到外部用光线投射,返回为假。参数理解Origin:

在世界坐标中射线的起始点direction:

射线的方向distance:

射线的长度hit:

使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的

transform,rigidbody,point等信息。layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。选择性的碰撞。RaycastHit[]RaycastAll(Rayray,floatdistance,intlayerMask):

投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。代码结构以摄像机所在位置为起点,创建一条向下发射的射线:

课后学习任务布置学生分组讨论、并总结射线检测还有哪些用法。THANKYOU人机交互技术人机交互技术鼠标及键盘交互动作项目介绍1项目展示2项目设计开发3总结4目录CONTENTS项目介绍1当我们需要做一个PC端的软件时,免不了需要用鼠标以及键盘进行交互,控制,输入等,有了这些功能之后,我们的软件才能称之为一款完整的软件。而这也是我们学习开发的基础功能,接下来我们就看一下在Unity中如何调用键盘和鼠标在软件中完成交互。项目展示2观看视频项目实现3项目实现Step1,打开unity3d,新建3D项目。项目实现Step2,在场景中新建一个text用来显示我们的操作信息。项目实现Step3,新建脚本KeyboardController,在Update函数中我们通过Input方法可以调用

键盘上的所有按键。其中主要有GetKeyDown、GetKey和GetKeyUp分别代表

按键被按下、按着以及松开三种状态。项目实现Step4,挂载代码运行场景进行测试。项目实现Step5,继续编写代码,使用Input调用鼠标点击事件,同理有按下,按着和抬起三种状态,在此不一一赘述,而GetMouseButton方法所带的参数中0,1,2分别代表着鼠标的左键、右键、和中键。项目实现Step6,再次运行场景进行测试。项目实现Step7,新建代码OnMouseController,使用函数方法来用来获取点击物品事件。项目实现Step8,删除代码KeyboardController。新建Cube,Sphere,Capsule等3D物体,给他们重命名并挂载代码后进行测试。总结4总结通过以上的学习,我们了解了鼠标事件和键盘事件的调用方法。我们根据以上学习的基础,可以搭配自己的想法以及其他知识点,就可以做出一个有趣的小作品了。总结起来,可以大致分为两种,一、使用Input方法在Update函数中调用鼠标和键盘事件。二、使用OnMouseDown等函数获取鼠标点击某个物体的时间。THANKYOU人机交互技术AI寻路系统(入门)目录Catalog1教学目的与要求2重点、难点3教学进程安排4课后学习任务布置教学目的与要求01.本章将介绍自动寻路的作用和基础用法。目的:教学目的与要求学生能够根据学习内容进行AI寻路的实现,完成课堂的学习与讨论,并且能够积极完成课后作业。要求:重点、难点02.掌握地形烘焙和寻路组件的使用重点:重点、难点掌握非水平地形寻路的烘焙技术。难点:教学进程安排03.寻路简介Unity3d中的导航网格Navmesh广泛应用于动态物体实现自动寻路的功能,属于人工智能的一种,通过此功能可以使智能AI自行绕过障碍或翻越墙体等,最终到达目标地点或找到目标对象,是一种既方便,有简单,同时还很实用的功能。寻路功能的组成寻路功能主要由三方面组成:1.Navigation地形烘焙。地形烘焙的作用是限定寻路范围,只有在已经经过烘焙的地形上,AI才可以通过寻路找到目标。2.NavmeshAgent寻路组件。其次,NavmeshAgent是控制AI进行寻路的组件,只有挂载了NavmeshAgent组件的AI会通过寻路寻找他的目标。3.代码控制。最后,通过代码控制可以确定NavmeshAgent寻路的目标,也可以限定其寻路的条件。Navigation烘焙说明Navigation不只是使AI可以在水平地形上寻路那么简单,它还有许多的属性值,通过调节这些值我们可以调整地形烘焙时的高度,半径,角度等,其中如果有坡度较大的地形需要烘焙,我们只需要将

Bake中的MaxSlope值调至最大值就可以让AI自行爬坡了。除此外,还可以通过调节其他数值实现AI的跳跃坠落等行为,请同学们自行探索。课后学习任务布置实现水平地形的寻路功能,探讨Navigation属性值的作用。THANKYOU人机交互技术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.mag

温馨提示

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

评论

0/150

提交评论