VRTK4.0草稿

VRTK4.0

    • P11 抛物线事件
    • P12 直线指针
    • P13 直线指针 样式修改
    • P14 忽略某一层级
    • P15 使用导航网格限制移动区域
    • P16设置无效目标
    • P17 组合动作1 bool转Axes转Vector3(移动)和Angel(旋转)
    • P18 组合动作2“移动” 的脚本TransformPositionMutator(位置增变)里的两个元素
    • P19 组合动作3“旋转”(旋转增变)
    • P20 用手柄控制物体的移动和旋转
    • P21 FloatActionToBooleanAction
    • L21创建代理操作和链接操作
    • L22 InputManager下剩余的三个选项:AxisAction、ButtonAction、DoubleClickAction CombineAction下的AngleRangeToBoolean
    • L24其它三种移动方式
    • L25 创建一个门
    • L26 开门关门
    • L27组件属性的讲解
    • P29 28-抽屉
    • P30 29-用正确的方式开关抽屉和门
    • P31 30-可以抓取的物体
    • P32 L31关于抓取
    • P33 L32动作发布器和动作接收器
    • L33在抓取的基础上完成其它操作
    • L34 属性讲解
    • L35 一个手柄对应一个抓取点
    • L36 远距离抓取物体
    • L37 远距离抓取属性解读
    • L38 创建一个操作杆
    • L39 创建物理按钮
    • L54 HeadSet代表的“真实身体”进入到了自建的立方体内,伪身体进不去的原因
    • L55攀爬(基础篇)
    • L56攀爬——解决受PseudoBody的真实、伪身体同步设置影响,爬不上去,老是掉下来的问题。
    • L57和L58两种瞬移方式——Instant(立刻)和Dash(猛冲)
    • L58的内容:抛物线、瞬移预设体Dash的设置
    • L59瞬移区域
    • L61 传送点的锁定、移动放大器(略,不是很重要,有时间的时候再处理)
    • 63 交互模块下的“Snapzone”(“吸附”突然移动到某地带)
    • 65、手柄震动
    • L66/Obscurance Tracker(操作略)
    • L67 Collision Fader 碰撞调节器?
    • 68-限制collision fader只和某些物体交互
    • 69-interactable highlighter tooltip 它是Visual中的高亮组件

github官方示例D:\VRTKExample\VRTK 2020.3.33

P11 抛物线事件

Q1、Activation Action、Selection Action这两个Action在作用上的区别是什么?
Q2、 Selection Action为什么曲线是弯曲的?

P12 直线指针

用手柄发射一条直线——用左手柄扳机键发射一条直线:
1、把“追踪别名”预设体的左手柄,赋给“直线指针”预设体的
2、把“左手柄”预设体的扳机键,赋给“直线指针”预设体的

P13 直线指针 样式修改

原理:用它Element项容器(Container)下的物体,替换以下物体脚本上的预设体(还可以让其“仅激活显示”,还是“一直显示”)
控制手柄射线的,就是下图最底下三部分,它们所带脚本都有以上显示设置:
起点 Origin
重复中段 RepeatSegment
目标点 Destination

P14 忽略某一层级

法1 将物体的层Layer设置为ignoreRaycast

法2 比如给指针(直线或抛物线),添加PhysicalCast规则脚本,设置好要忽略的层级后,拖给指针上的ruler元素。

P15 使用导航网格限制移动区域

设置导航网格区域:把Plane和Cube设置为static或StraightStatic后,进行导航烘焙(Window——AI——Navigation——Bake)
给指针或任意物体添加“网格导航规则”(NavMeshRuler)脚本,并把它赋给“TargetPoint Validity”

P16设置无效目标

借用空物体上List Contains Rule,然后取反(空物体上PointerNegationRule),赋给指针上的“TargetPoint Validity”元素

P17 组合动作1 bool转Axes转Vector3(移动)和Angel(旋转)

P18 组合动作2“移动” 的脚本TransformPositionMutator(位置增变)里的两个元素

:限制在某个轴上的移动、朝向

P19 组合动作3“旋转”(旋转增变)

(注意只在Y轴上进行变动,且调用的是TransformEulerRotationMutator)

用键盘按键控制物体的移动和旋转

P20 用手柄控制物体的移动和旋转

Part1:(不用WSAD键了,直接用1D轴预设体)
Part2:(不用轴预设体了,直接用手柄“跟踪板”的水平、垂直)
核心是“CombineAction”(组合模块)里的“AxesToVector3”(轴转三维向量)、“AxesToAngle”(轴转角度)
另需:Movement、Rotation、某手柄预设体

P21 FloatActionToBooleanAction

目的:用手柄的轴,控制二向bool的一个动作
把左手柄的1D轴(扳机键),用FloatToBool脚本的DoTransform方法,转为Bool类型的动作
官方文档中的Axis9,不明白怎么拖入的——直接复制Inspector元素里的名称

把紫框内的FloatAction,用黄线空物体上的脚本变为BooleanAction
左手柄

1DAxes Action

L21创建代理操作和链接操作

重要脚本BooleanAction.cs
1、正常操作
按下扳机键,Plan显示;松开,Plan隐藏
2、代理操作
“代理”是说多个命令,都对应相同操作——我们希望化繁为简:把多个命令放到一个地方。
例子是手柄触摸板的水平轴和扳机键对应同一个操作(如Plan的隐现),即控制源可以是多个物体

“链接”没注意到是什么事儿

L22 InputManager下剩余的三个选项:AxisAction、ButtonAction、DoubleClickAction CombineAction下的AngleRangeToBoolean

1、AxisAction的例子:水平轴控制位移——1DAxisAction的OnValueChange事件监听圆球身上脚本的SetHorizontalPosition方法(需具体例子,脑子里没有概念——手柄的那个部件来控制的)/
2、ButtonAction的例子:WASD吗
3、DoubleClickAction 注意其中的ActionControl和duration元素(控制脚本输出True或False的例子)
4、(操作留)AngleRangeToBoolean第二职业 需要指定手柄的水平轴、竖直轴(测试时,调用的是自己写的脚本)转化成角度,输出在它下面的两个预设体里
“外部角度范围”默认在-180,180的范围内,会输出True——可以设置范围如(0,180)
“内部的轴网络或盲区”不知道表示的含义
除了水平竖直轴外,还有一套类似的DeadZone

L23 移动——位置放的不合适的话,需要手柄来移动(不明确它的作用是什么——用手柄控制某个物体运动自己或者某个GameObject?)
预设体:Locomotor——AxisMove——VerticalSideHorizontalSide(好像是头盔上的VR摄像机跟随某手柄的移动)
具体操作:
把某手柄触控板的水平轴、竖直轴,TrackedAlias的PlayAreaAlias、HeadSetAlias拖入它对应的元素即可,另可调整它下面的属性

L24其它三种移动方式

01“平滑旋转” 预设体是SmoothRotation,比L23中的移动,多了一个旋转轴(头盔),如下图

前方偏移,仍然是头盔别名——ForwardOffset仍然是HeadsetAlias
02“折断旋转”预设体是SnapRotate,如下图多了场景相机SceneCamera:
如果没有SceneCamera,物体瞬间旋转(中间是没有连续的),教程中说可能会产生恶心感;
如果加上SceneCamera,旋转过程会有个黑色过渡,给人的感受要好一些。(除了用黑色外,还可以用以下第二张图的Blind设置颜色)

旋转倍增,原先是一次旋转30度,现在改成一次旋转45度

03最后还有个与02略有差别的包裹的(Wrap)“折断旋转”,设置都和02一样,但效果上的差别没看出来(视频里说是02的改进版)。

L25 创建一个门

导入各种包(留)
建门——手动修改预设(角度关节驱动AngulerJointDrive预设体),把它改成门的形状,并给它添加碰撞体BoxCollider

L26 开门关门

下图一是设置旋转轴和开合度
下图二是设置关节点的位置(左侧两个红框处,有两个旋转点)
另注意开合度是以闭合的初始状态为0点,前-180,后+180

开始移动手柄到门上,门是开不了的——得给手柄加个碰撞
用手柄的带有碰撞体的立方体(如下图2),把门撞开后,门自动闭合的原因——门框有碰撞体,得去掉
也可以用“碰撞忽略”预设体,做出同样的效果,如下图

L27组件属性的讲解

开关门多个属性的讲解(略)
1.DriveSpeed属性 转动的角速度
2.MoveToTargetValue属性 我们设定的门的开合范围是-120~120,如果我们将Value的值设定为0,门就会自动向-120移动,如果我们设置为0,就会固定在中间(如下图)——此时,若我们推动门,它仍旧向目标点移动。
3.HingeLocation、关节线段长度、关节球的半径 下图2
4.其中的几个事件(略)

P29 28-抽屉

核心组件 交互模块的线性关节驱动linear Joint Drive
视频主要讲抽屉的外壳,及抽屉本身的建模
如果已经有抽屉模型,只需把下图的Cube替换即可

P30 29-用正确的方式开关抽屉和门

在上几节课门和抽屉的交互中,我们是给手柄加了立方体,用它来碰——现实中,我们是用手来抓——本节课我们用“交互器”实现抓的动作(把立方体用交互器代替):
交互器中要有实现抓取动作的按钮、及速度追踪者(以后会学到抓取后扔掉的案例,扔的动作需要知道当前的速度)

修改样式替换手部的模型

交互器之所以能够抓取门或抽屉——原因就是都有碰撞体,如果我们只让抽屉的把手能被抓,就把其它的部件碰撞体去掉。

P31 30-可以抓取的物体

总结:抓取的基本操作,Interactor设置Grab Action、Velocity Tracker
Interactable设置“主抓取”、“次抓取”

interactor:"追踪别名"里新建的interactor预设体是负责抓取的抓取动作用手柄的哪个按键(TrackAlias的Left/RightController是真实手柄在层级面板的替身?那置左右手柄预设体为何地?得再去研究TrackAlias)另注明如果我们扔出抓住的物体,物体的速度将跟随LeftControllerAlias?
interactable:可以被抓取的物体(需注明“主抓去”和“次抓取”)
疑问:第6分钟“丢不掉”,是说一直按着真实手柄抓取键,往外扔丢不掉,还是只按一次抓取键,物体就跟随手柄,往外扔丢不掉?

抓取丢不下的原因:第二次抓取(次抓取),应该设置为空
疑问:如果我们只用到一个手柄,也要设置次抓取吗?另外,初始状态的Custom是什么含义

主抓取和次抓取试验:
1、主抓取为Follow,次抓取为None——比如,右手柄抓取物体后,左手柄去抓,将抓不到
2、主抓取为Follow,次抓取为Follow——比如,右手柄抓取物体后,左手柄去抓,能抓到,但松开右手柄抓取键,左手柄上的物体会掉
3、主抓取为Follow,次抓取为Swap(交换)——比如,右手柄抓取物体后,左手柄去抓,能抓到,但松开右手柄抓取键,左手柄上的物体不会掉
4、主抓取为Follow,次抓取为ControlDirection——比如,比如,右手柄抓取物体后,左手柄可以拨动物体,改变它的旋转
另注意:主抓取有三个选项,而次抓取有6个选项

P32 L31关于抓取

本节解说了“可抓取物体”的两个属性:Follow Tracking、Grab Offset
第一部分,可交互物体的FollowTracking元素,里面不同选项的区别

上图中1和2区别:
1能随意穿过带Collider的物体,
2碰撞穿不了
3效果像是手柄和被抓取物体有根橡皮筋相连,注意得同时修改Grab Offset,下图两项都可以

4手柄围着物体转圈,物体跟着转(但好像,抓不起来)

5晃动手柄时,它绕着某个轴进行旋转(可以全部勾选)

第二部分,Grab Offset元素:None或Oritention时,默认抓取的点,是“跟踪别名”里的GrabAttachPoint

而precision则是手柄接触物体上的精确点(看下图,此句话好像也不太对,留)

知识点:改变抓取点的位置——1、改变交互器 2、改变交互物体
2的例子

P33 L32动作发布器和动作接收器

Interactions.ActionPublisher/Interactions.ActionReciever
该需求的原因:interactor只能将一个Float动作(如扣动扳机),传递给Interactble,如果要传两个或多个,就需要用发布器和接收器。举个例子,比如我们在抓取键抓取物体的同时,按一下扳机键,让物体改变透明度。(L32只是完成了抓取操作,另外的操作在L33)

案例是:将浮点数,从“交互器”传到“可交互物体”(疑问是讲:解者,加了“平滑旋转”是为了说明什么(答案,为了让身体跟随右手柄移动),另,我自己做的为什么看不见物体,是没设置UnityXR 的问题吗(答案,UnityXR在2019后废弃,我们用UnityXRpluginFramework)
Tip:动作发布器里“源动作”的类型,可以是:BoolAction、FloatAction、1DAction、Vector2Action,因为它是动作的一个基类

L33在抓取的基础上完成其它操作

总结:
简版:发布器、接收器找到它们附加的源头,接收器再和发布器联系起来——然后发布器的动作,就能触发发布器相应组件的方法了。
详细:发布器、接收器源头是原有的Interactor、interactable,并存在联系(如下两图:发布器对应交互器,接收器对应可交互物体),更像是在原有抓取操作基础上,附加了另外一套(发布器添加附加的动作,接收器处理发布器新传过来的动作【它先要和发布器联系起来】)——我写的,脚本报错,不知问题出在了哪里

对应动作的类型

平常的操作是,按下手柄的键,就能输出一个操作
而此刻(前提是物体被抓着),再按下手柄按键,才能输出一个操作

L34 属性讲解

Tip1、左右发布器的Source Action要一样,不同类型会报错
Tip2、如图激活状态(ActivationState)由Grab改成Custom后,变色失效

Tip3、以上改成Touch,接触到物体,再按下扳机键,物体变色

Tip4、下图第一种抓取方式,松开抓取键,物体会掉下来;第二种Toggle,偶数次按抓取键的时候,
物体会掉下来

Tip5、比如忽略左手的interactor

L35 一个手柄对应一个抓取点

案例:一个宝剑两个手柄来抓取,左右手柄各对应一个抓取点,宝剑的姿势不同

注意Interactions.Interactable的主抓取、次抓取、朝向
步骤:1、造剑的模型 2、“按朝向抓取”Orientation Handler的相关设置

要先把抓取方式GrabType,改为Orientation Handler

下图据说是:真正抓取的位置(怎么理解?)

下图改为2后,不会自动出现新的GenericOrientationHandle,它是我们复制出来的

核心就是上图:就是搞两个不同的实际抓取点,分别对应左右手柄的追踪别名

L36 远距离抓取物体

手柄发出一个类似射击游戏圆形准心的光标,射到物体上,按抓取键即可抓取物体
它对于正常的抓取,只是增加了“远距离抓取预设体”,并把交互器赋给它(类似它代替了原先的交互器Interactor?),并注意设置可抓取物体的主抓取和次抓取。

L37 远距离抓取属性解读

1、“可交互物体”的“抓取类型”HoldTillRelease和Toggle的区别:Toggle到达手中后,不用再按下抓取键

2 、Ungrab Delay第一次抓取完成之后,多久可进行第二次抓取

3、RaycastRuls结合脚本 Physics Cast使用,达成忽略某一层的效果。

4抓取事件

5、远距离抓取,本来就是一个直线指针,怎么让它的射线显示
如下两图所示,直线指针的起点Origin和重复线段,都是AwaysOff的,改一下就显示了

6替换光标图形

L38 创建一个操作杆

核心是交互模块的“角度关节”(AngleJointDrive)
过程见笔记本(最后脚本的开和关方法,一个放在“起点”,一个放在“终点”)如下图
(Unity里有对应的场景L38)

L39 创建物理按钮

核心是交互模块的“线性关节”(LinearJointDrive)

1、 创建ColliderFollower预设体(图一)
原因是——“追踪别名里的Collider和物体碰,是没有任何反应的,因为它身上没有Rigidbody”(不理解),因此才建了ColliderFollower(图二)

2、

L23伪身体(PseudoBody)
总结:赋值源头和偏移两个属性,然后解决真实身体与伪身体不同步的问题
我感觉它像Unity中的第三人称控制器
属性:
1、它追踪(Tracking)的“源头”(Source)是头盔(HeadSet)——也就是说,跟着谁动——伪身体跟随头盔
2、OffSet偏移,为什么是PlayAreaAlias

L54 HeadSet代表的“真实身体”进入到了自建的立方体内,伪身体进不去的原因

具体解决:调用自身StillDiverged事件的图二方法(原理是让两种身体同步),如果还抖动(强制两种身体同步导致的),调节厚度(图三)

L55攀爬(基础篇)

总结:感觉Climbing是个中间件,把伪身体和实质是interactor的Climbale联系起来
需要组件:伪身体、“攀爬运动”预设体(注明谁在爬:图二,把伪身体赋过去)、“可攀爬物体”预设体
步骤:
第一步 Climbing需要伪身体元素,Climbale需要ClimbingFacade元素

第二步,下图可以看到Climbable实质是个interactable——因而需要设置interactor的GrabAction和Velocity Tracker两个属性(不需要设置interactale的主次抓取)

L56攀爬——解决受PseudoBody的真实、伪身体同步设置影响,爬不上去,老是掉下来的问题。

原因:interactor停止接触可抓取物体是时,抓取也停止了
解决:把climbale下的Untouch事件给关掉,如下图(但好像Untouchable事件,是Interactor的事件)

可抓取物体下面,加了一个山(注意,它是先把预设体给Unpack,然后加上的山)

总结:设置联系好后,像抓取那样:设置interactor,interactorale(没有主次抓取,只是关闭了Untouch事件)

瞬移(L57~61)

L57和L58两种瞬移方式——Instant(立刻)和Dash(猛冲)

原理:把PlayAreaAlias移动到抛物线指的位置
核心组件:抛物线指针、instant瞬移
第一步,instant瞬移组件,属性设置:目标位置、偏移(好像是为防止身体偏移)、渐变相机,如下图

第二步,抛物线指针的,
属性设置:源、激活动作、选择动作
方法设置:选择动作命令本身,移动到抛物线指的位置,如下图

L58的内容:抛物线、瞬移预设体Dash的设置

——同Instant(我感觉移动的太快了——可以调整DurationTime,如下图)

L59瞬移区域

效果一、抛物线射到瞬移区域上时,瞬移区域高亮:
用分发器,分发抛物线指针的“移入”、“移出”、“选择”事件,“瞬移区域”自动接收——但此时,并不能瞬移

效果二、按键,瞬移到“瞬移区域”
问题一:课程中说加一个PseudoBody,就能瞬移过去了——但加上后,一运行,屏幕黑一下后,射线在抖动——原因是PseudoBody带刚体,在没有地面的情况下,它落到下面去了
问题二:想让射线只和瞬移区域交互(忽略掉地面)
把地面设置为IgnoreCast层,建物体添加PhysicsCast脚本,忽略该层,然后将物体给抛物线的规则(课程说,把地面换成IgnoreCast层后,他的移动不过去了,得换成别的层——我的没有出现类似情况)

问题三、忽略特定的标签(略)
核心脚本:AnyTagRule、NegationRule

L61 传送点的锁定、移动放大器(略,不是很重要,有时间的时候再处理)

Part一、我感觉只是把“瞬移区域”、“瞬移点”的CollisionVolume给隐藏了
Part二、移动放大器

63 交互模块下的“Snapzone”(“吸附”突然移动到某地带)

小的Tips:移动过去的时间、调整大小

疑问:我的怎么还没抓取,它就自动被吸附过去了(就是自动吸附)
Part1:抓取操作回顾1、抓取动作与速度跟随 2、可抓取物体的主抓取与次抓取
Part2:Snapzone的设置,初始化吸附的物体

64Mutator
1/CollisonIgnore两物体或多个物体忽略碰撞

2/Follow跟随:RigidbodyFollow/ObjectFollow

让跟随者偏移一定距离

65、手柄震动

抓取时震动

Profile方式震动,强度的调整

L66/Obscurance Tracker(操作略)

案例:两个Cube之间直线检测,有遮挡和没遮挡,会产生一个bool时间,控制物体的显示隐藏等。

L67 Collision Fader 碰撞调节器?

内容一、Utility.ObjectStateToSwitch只有其中一个显示,其它拖入元素列表的物体隐藏

内容二、CollisionFader

目的是防止头盔碰到物体后穿入,导致穿帮现象的出现——解决方式是,头盔进入Collision范围后直接黑屏

68-限制collision fader只和某些物体交互

运用规则脚本实现:AnyTagRule
ListContainRule

69-interactable highlighter tooltip 它是Visual中的高亮组件

:当手柄碰到该物体时,物体高亮(模拟器版没有高亮,原因不明确)
ToolTip文本提示

你可能感兴趣的:(vr,VRTK4.0)