2024-04-03 NO.4 Quest3 手势追踪抓取物体

文章目录

  • 1 手势抓取方式
    • 1.1 Hand Grab
    • 1.2 Touch Hand Grab
    • 1.3 Distance Hand Grab
  • 2 HandGrabExamples 示例场景
    • 2.1 Interactor 对象
    • 2.2 Interactable 对象
      • 2.2.1 父子结构
      • 2.2.2 “Hand Grab lnteractable” 脚本
      • 2.2.3 “Move Towards Target Provider” 脚本
      • 2.2.4 其他 Movement Provider
  • 3 抓取配置
    • 3.1 玩家配置
      • 3.1.1 自制预制体
      • 3.1.2 添加交互功能
    • 3.2 物体配置
      • 3.2.1 配置 HandGrabInteractable
      • 3.2.2 One Grab Free Transformer
      • 3.2.3 Two Grab Free Transformer
    • 3.3 颜色高亮显示
  • 4 添加物理抛掷效果
  • 5 录制抓取手势
    • 5.1 场景录制
    • 5.2 工具录制
    • 5.3 手势镜像和缩放
  • 6 远距离抓取物体
    • 6.1 玩家配置
    • 6.2 物体配置
      • 6.2.1 抓取配置
      • 6.2.2 添加物理效果

1 手势抓取方式

1.1 Hand Grab

  1. 无抓取手势(手和物体会穿模)

    适合非实物的抓取,例如魔法球。

image-20240401154501544
  1. 有抓取手势(给不同形状的物体制作不同的抓取手势)
  • Pinch Grab:手指靠近物体,做捏合动作激活。
image-20240401154559680
  • Palm Grab:手掌靠近物体,做握持动作激活。
image-20240401154223604
  • Pinch Grab + Palm Grab:多个抓取点,每个抓取点对应不同抓取姿势。
image-20240401154811065

适用场景

​ 在需要精准抓取手势或者固定某几个抓取手势时,可使用 Hand Grab。

image-20240401160027921

1.2 Touch Hand Grab

image-20240401154311300

​ 可以在物体表面(准确来说是物体的碰撞体)上的任意位置进行抓取,抓取时手指会贴在物体表面上,可以用任意根手指进行抓取。

​ 相比于 Hand Grab,抓取手势更自由。

1.3 Distance Hand Grab

image-20240401154320144

​ 在远距离通过射线抓取物体,可以将远处的物体抓取到手上,或者在远距离操控物体移动。

2 HandGrabExamples 示例场景

​ VR 中手势交互需要两个对象:

  • Interactor:发起交互的对象。
  • Interactable:可以被交互的对象。

2.1 Interactor 对象

​ 展开玩家物体 OVRCamreaRig,其子物体 OVRInteraction 是所有交互功能的父物体:

  • OVRHmd:头显交互。
  • OVRControllerDrivenHands:手柄交互(手柄控制虚拟手部模型的相关功能)。
  • OVRHands:手势追踪交互。
image-20240401164506695

​ 展开 OVRHands > LeftHand > HandInteractorsLeft,可看到左手的 Interactor 共有两个:

  • HandPokeInteractor:手指点触交互(手指点击虚拟按钮)。
  • HandGrabInteractor:手部抓取交互。
image-20240401165127233
  1. HandGrabAPI:检测 Hand Grab 是否选中或者取消选中可抓取物体。即,检测抓取动作是否发生。

  2. HandWristPoint:控制在抓取时虚拟手部和现实手部在位置和旋转角度上的偏移。

    • Offset:位置偏移。
    • Rotation:角度偏移。
    image-20240401165654917
  3. GripPoint:Palm Grab 的探测范围。

    调整 GripPoint 上的 HandWristOffset 脚本参数可以修改探测范围的位置和旋转角度。物体进入探测范围后触发抓取,会被吸到手上。

    image-20240401165845549
  4. PinchPoint:Pinch Grab 的探测范围。

    范围大小取决于 PinchPoint 子物体的 Collider 的碰撞体大小。

    image-20240401170033887
  5. PinchArea:PinchPoint 的 HandPinchOffset 脚本默认引用 PinchArea , PinchArea 碰撞体的位置会影响 PinchPoint 探测范围的位置。

  6. HandGrabVisual :连接 SyntheticHand ,在手部呈现出完整的抓取手势后固定手部姿态,让抓取手势不与物体穿模。

  7. HandGrabGlow:控制抓取时手部的特效。

    image-20240401172533854
    • Glow Color Grabing:抓取时特效的颜色。

    • Glow Color Hover:靠近时特效的颜色。

    • Glow Type:特效类型。

      • Outline:手指轮廓高亮。
      image-20240401172235645
      • Fill:手指颜色填充。
      image-20240401172416873
      • Both :结合 Outline 和 Fill。

2.2 Interactable 对象

2.2.1 父子结构

​ 可抓取物体上需要添加 “Grabbable” 脚本,以实现在抓取物体的时候控制物体的位移、旋转和缩放。

image-20240402160241906

​ 可抓取物体下有一到多个 HandGrabInteractable 物体,即 Hand Grab 所需要的 Interactable 对象。

​ 在示例场景 HandGrabExamples 中,Interactable 对象被统一存放在 Interactables 路径下。以 SimpleGrab2PalmGrab 为例,其子物体 HandGrabInteractable 挂载了交互脚本 “Hand Grab lnteractable”。

image-20240401164416438

2.2.2 “Hand Grab lnteractable” 脚本

image-20240402160758438
  • Supported Grab Type:抓取方式。

    • Palm:捏合抓取。
    • Pinch:握持抓取。
    • All:二者均可。
  • Pinch / Palm Grab Rules:抓取触发手指的规则。

    Thumb、lndex、Middle、Ring、Max:大拇指、食指、中指、无名指、小指。

    • Required:标记了 Required 的手指,必须参与到抓取的触发过程中。即,想要抓起一个物体,必须要用到 Required 手指。
    • Optional:如果没有 Required 手指,则至少要用到一个标记 Optional 的手指。
    • Ignore:标记了 Ignore 的手指,不会被考虑到抓取的触发过程中。

    Unselect Mode:取消抓取的判定条件。

    • All Released:所有 Required 或者 Optional 手指松开后,视为取消抓取。
    • Any Released:有一个 Required 手指松开后,视为取消抓取。
  • Hand Alignment(Unity 中单词拼写错误):决定虚拟手如何变化到对应的抓取手势。

    • None:没有对应限制,会穿模。与没有添加 SyntheticHand 效果一样。
    • AIign On Grab:靠近物体时(即处于 hover 状态)虚拟手会与物体发生穿模。抓取时手部从物体内部快速调整到物体表面。
    • Attract On Hover:靠近物体时虚拟手会被限制在物体外部,不会穿模。抓取时手部直接吸附在物体表面。
    • Align Fingers On Hover:靠近物体时虚拟手会慢慢靠近物体。抓取时手部慢慢吸附到物体表面,穿模程度较小。
  • [Optional] ScaIed Hand Grab Poses:为不同大小的手配置相应的抓取手势。

    • HandGrab Point:后续专门介绍。

2.2.3 “Move Towards Target Provider” 脚本

​ 在运行程序时,如果当前 HandGrabInteractable 物体上没有挂载 “Move Towards Target Provider” 脚本,“Hand Grab lnteractable” 脚本会自动添加 “Move Towards Target Provider” 脚本,用于控制物体被抓取时朝向手部的移动。

image-20240402170405450
  • Travel Speed:移动速度。值越大,移动时间越长。

​ 如果想在程序运行前控制物体朝向手部的移动速度,可以在 HandGrabInteractable 物体上添加 “Move Towards Target Provider” 脚本,并设置其引用。

image-20240402171109624

2.2.4 其他 Movement Provider

(1)Move From Target Provider

​ 抓取时将手部吸附到物体上,而不是物体吸附到手上。

image-20240402171525204

(2)Follow Target Provider

​ 抓取时物体会跟随手部移动,具有阻尼效果。

image-20240402171636276
  • Speed:物体跟随速度。

3 抓取配置

3.1 玩家配置

3.1.1 自制预制体

(1)将 《2024-04-01 NO.3 Quest3 手势追踪与玩家角色配置》 文章中 SampleScene 场景下的 OVRCameraRig 进行 Prefab Unpack Completely,之后拖拽到 Assets > Prefabs 文件夹下。

image-20240402200905432

3.1.2 添加交互功能

(1)在 Package 中找到 HandGrabInteractor 预制体,将其拖拽为 SampleScene 场景中 MyOVRCameraRig > OVRInteraction > OVRHands > LeftHand > HandInteractorsLeft 的子物体。并对 RightHand 进行同样的操作。

image-20240402201242950

(2)场景中展开 LeftHand 下的 HandGrabInteractor 对象,将其 Visuals 下的两个子对象 HandGrabVisual 和 HandGrabGlow 激活,并设置对应的引用参数。同样的操作应用于 RightHand(步骤中所有 Left 对象改为 Right)。

  • HandGrabVisual:
    • Synthetic Hand <-- OVRLeftHandSynthetic。
  • HandGrabGlow:
    • Hand Visual <-- OVRLeftHandSynthetic > OVRLeftHandVisual。
    • Hand Renderer <-- OVRLeftHandSynthetic > OVRLeftHandVisual > OculusHand_L > l_handMeshNode。
    • Material Editor <-- OVRLeftHandSynthetic > OVRLeftHandVisual > OculusHand_L > l_handMeshNode。
image-20240402202042735 image-20240402202143256

(3)找到 LeftHand > HandInteractorsLeft 物体上的 “Best Hover lnteractor Group” 脚本,将 HandInteractorsLeft 物体拖拽入 Interactors 列表中。同样的操作应用于 RightHand > HandInteractorsRight 物体(步骤中所有 Left 对象改为 Right)。

image-20240402202813087

​ Interactors 列表存储不同种类的 Interactor 脚本。

​ Interactor Group 保证其列表下的所有 Interactor 在同一时刻只有一个进行交互,而其他 Interactor 暂时失活。

​ 此处 Best Hover Interactor Group 是 Meta XR SDK 中 Interactor Group 的其中一种。其特性是:

  1. 保证优先级高的 Interactor 进入到 hover 状态,优先级低的 Interactor 会暂时失活。

  2. 默认情况下,越靠前的列表元素拥有越高的优先级。

3.2 物体配置

3.2.1 配置 HandGrabInteractable

(1)在场景中创建一个桌面(Cube,这里配置了红色材质),桌面上放一个立方体 Cube 用于抓取。

​ 同时,给 Cube 添加 Rigidbody 和 Grabbable 组件,并将其 Box Collider 设置为 Trigger,取消勾选 Rigidbody 的 Use Gravity 选项。

​ 最后,勾选 Grabbable 的 Transfer On Second Selection 选项,以实现左右手交替抓取。

image-20240402205603844

(2)在 Project 中找到 HandGrabInteractable 预制体,将其拖拽为 Cube 的子物体。可以看见 HandGrabInteractable 自动寻找到了其父物体中的 Grabbable 和 Rigidbody。

image-20240402205157590

3.2.2 One Grab Free Transformer

​ 到此,运行程序,可以实现双手抓取移动 Cube。

​ 运行程序时,可以看到 Cube 物体上自动添加了 One Grab Free Transformer 脚本,并且被 Grabbable 脚本引用。

image-20240402210103367

​ Grabbable 脚本通过 Transformer 来控制物体被抓取时的移动旋转和缩放。默认使用 One Grab Free Transformer 脚本(一只手控制)。

​ 其他 One Grab Transformer:

image-20240402210628398
  • One Grab Rotate Transformer:仅控制物体旋转。
  • One Grab Scale Transformer:仅控制物体缩放。
  • One Grab Translate Transformer:仅控制物体平移。
  • One Grab Physics Joint Transformer:相对而言使用的很少。

3.2.3 Two Grab Free Transformer

​ 取消勾选 Cube 挂载的 Grabbable 脚本的 Transfer On Second Selection 选项,并更换 One Grab Free Transformer 脚本为 Two Grab Free Transformer 脚本,即可使用双手操控物体。

image-20240402211242487

​ 若想实现单双手都可操控,则同时添加 One Grab Free Transformer 脚本即可。

image-20240402211415484

3.3 颜色高亮显示

(1)在 Cube 下方新建空子物体 Visuals,用于控制 Cube 的颜色显示。

(2)为 Cube 依次添加以下脚本:

  1. Interactable Color Visual:控制物体在各种状态下显示的颜色。

    需要设置:

    • Interactable View <-- Material Property Block Editor 脚本。
    • Editor <-- Interactable Group View 脚本。
  2. Material Property Block Editor:关联物体材质。

    需要设置:

    • Renderers <-- Cube 的 Mesh Renderer 组件。
  3. Interactable Group View:可交互物体组。

    需要设置:

    • Interactables <-- HandGrabInteractable。
image-20240402213125272

​ 设置完成后,即可通过改变 Interactable Color Visual 中的 Color State 来更改物体对应状态的颜色。

​ 到此,我们可以对 Cube 进行抓取、移动和旋转,但是没有录制抓取手势。

4 添加物理抛掷效果

(1)取消 Cube 的 Box Collider 的 Trigger 选项,并勾选 Rigidbody 的 Use Gravity。此时,手部可以和 Cube 进行碰撞,手部碰撞体在 MyOVRCameraRig > TrackingSpace > LeftHandAnchor > OVRHandPrefab 下(运行状态下可见)。

image-20240402214921602

​ 这里运行时产生碰撞体是因为先前设置了 Enable Physics Capsules 选项。

image-20240402215126160

(2)为 Cube 添加 Physics Grabbable 脚本,添加时会自动关联 Cube 上的 Rigidbody 和 Grabbable。

image-20240402215439917

(3)将 Cube 上的 Physics Grabbable 脚本关联到 HandGrabInteractable 对象上。

image-20240402215620437

(4)在 Project 中找到 HandVelocityCaIculator,将其拖拽为 LeftHand / RightHand 的子物体。

image-20240402215835097

(5)关联对应的 LeftHand / RightHand。

image-20240402221145893

(6)将 HandVelocityCaIculator 关联到 HandInteractorsLeft > HandGrabInteractor 和 HandInteractorsRight > HandGrabInteractor 对象上。

image-20240402220137277

​ 此时,即可完成 Cube 物理抛掷的效果。

image-20240403102522126

​ 如果在抛掷过程中有穿模现象,可以将 Cube 的 Rigidbody 的 Collision Detection 设置为 Continuous Dynamic,进行连续动态的碰撞检测,但性能消耗会更大。

image-20240402220309344

5 录制抓取手势

5.1 场景录制

​ 录制抓取手势需要在 Unity 编辑器运行模式下进行,并且需要将头显和电脑进行串流(串流部分在 《2024-03-28 NO.1 Quest3 开发环境配置教程-CSDN博客》 中提及)。

image-20240403103331979

(1)打开 HandGrabPoseTool 场景,添加待录制的物体 Cube(这里还添加了一个子物体 Cube)。并确保物体上挂载 Rigidbody 组件和 Grabbable 脚本,没有则手动添加。

image-20240403103216459

​ 这里将 BoxCollider 设置为 Trigger,取消勾选了 Rigidbody 的 Use Gravity 选项,并勾选了 Grabbable 脚本的 Transfer On Second Selection。

image-20240403110006980

(2)运行 Unity,按下按钮,开始做抓取手势动作,3s 后将自动结束录制。若想要延长录制准备时间,可在前方点击按钮进行调整。注意,录制完成后不要急着退出运行模式。

(3)录制完成后,可以看见 Cube 下方多了 HandGrabInteractable 子物体。首先将 Cube 拖拽至 Assets > Prefabs 文件夹下成为预制体,再退出 Unity 运行模式。

image-20240403111138734

(4)在 Unity 编辑模式下,删除场景中原有的 Cube,将刚创建的预制体拖入场景,开始进行手势微调。

​ 点击 HandGrabInteractable > HandGrabPose 物体,找到其挂载的 Hand Grab Pose 脚本,调节其参数以达到想要的手势。

image-20240403111708236
  • Fingers Freedom:手指灵活程度。

    • Locked:抓取时,虚拟手指无法跟随现实手指进行弯曲。
    • Constrained:抓取时,虚拟手指可以向外弯曲而不能向内。
    • Free:抓取时,虚拟手指不受限制。
  • Joint Angles:关节角度。

    改变值可旋转每个关节的角度,也可以在 Scene 窗口中直接旋转蓝色圆圈编辑调节。

    image-20240403112030781

​ 微调完成后,失活 HandGrabPose 的子物体 Ghost-RightHand(Clone),即可取消显示录制手势。之后抓取物体时,手部会呈现刚录制好的姿势。

image-20240403112653600

5.2 工具录制

​ 点击上方菜单 Oculus > Interaction > Hand Grab Pose Recorder,打开录制窗口。

image-20240403113546970

(1)配置场景中想要录制的手,以及待录制物体的刚体组件。这里选择的是右手。

image-20240403113903025

(2)运行 Unity,在做好手势后用鼠标点击 Record HandGrabPose 按钮即可完成录制。建议录制时将物体的 Collider 选择 Trigger,并取消勾选了 Rigidbody 的 Use Gravity。

​ 由于录制时带着头显,不方便使用鼠标。因此可以配置相应的键盘按键(默认是空格),按下该键盘按键后即可完成录制。使用键盘按键来结束录制时,需要先将鼠标双击

Hand Grab Pose Recorder 录制窗口,以获取焦点。

​ 注意,录制完成后不要急着退出运行模式。

image-20240403114948243

(3)录制完成后,点击 Save To Collection 按钮保存录制结果,再退出 Unity 运行模式。

image-20240403115057133

(4)在 Unity 编辑模式下点击 Load From Collection 按钮,即可获取刚录制的手势。

image-20240403115346225

​ 可以看到,Cube 下方添加了两个 HandGrabInteractable,且其中一个记录了手势。其上方没有手势的 HandGrabInteractable 是因为录制前 Cube 拥有一个 HandGrabInteractable 子物体,在读取结果时将其一并拷贝了进来,这里删除即可。

image-20240403115417622

​ 之后录制时,不需要先给物体配置 HandGrabInteractable,添加好 Rigidbody 后直接录制即可。

5.3 手势镜像和缩放

​ 选中需要镜像手势的父物体 HandGrabInteractable,点击 Create Mirrored HandGrabInteractable 按钮,即可生成镜像手势。

image-20240403190448779

​ 调节 Scaled Hand Grab Poses 下方的 Scale 值,点击 Add HandGrabPose Key with Scale XXX 按钮后,即可生成对应缩放比例的手势。

image-20240403190858627

6 远距离抓取物体

6.1 玩家配置

(1)在 Project 窗口中找到 DistanceHandGrabInteractor 预制体,将其拖拽为 HandInteractorsLeft / HandInteractorsRight 的子物体。同时,将其挂载到 HandInteractorsLeft / HandInteractorsRight 的 Interactors 列表下。

image-20240403192146073

(2)展开 DistanceHandGrabInteractor 的 Visuals 子物体,将其两个子物体激活。并进行如下关联(与 3.1.2 节 相同):

  • HandGrabVisual:
    • Synthetic Hand <-- OVRLeftHandSynthetic。
  • HandGrabGlow:
    • Hand Visual <-- OVRLeftHandSynthetic > OVRLeftHandVisual。
    • Hand Renderer <-- OVRLeftHandSynthetic > OVRLeftHandVisual > OculusHand_L > l_handMeshNode。
    • Material Editor <-- OVRLeftHandSynthetic > OVRLeftHandVisual > OculusHand_L > l_handMeshNode。

​ 同样的操作对 OVRRightHandSynthetic 再执行一遍(步骤中所有 Left 对象改为 Right)。

image-20240403192704980 image-20240403192827902

(3)将先前配置好的 HandVelocityCalculator 关联到 DistanceHandGrabInteractor 上。该步骤为可选,但需注意左右手对应配置。

image-20240403193055687

6.2 物体配置

6.2.1 抓取配置

​ 参考 3.2.1 节 内容,创建一个 Cube,添加 Rigidbody 和 Grabbable 脚本,并将其设置为 Trigger,取消 Use Gravity。

​ 之后,为该物体添加 Distance Hand Grab Interactable 脚本,添加时会自动关联 Cube 上的 Rigidbody 和 Grabbable。

image-20240403193731345

​ 此时运行 Unity,双手对准 Cube 握拳后,Cube 会被远距离抓到手上。这是因为 Cube 上 Interactable 脚本的 Supported Grab Types 和 RightHand 下 Interactor 的 Supported Grab Types 都是 Pinch。 如果不匹配,则不会被抓取。

image-20240403194241056 image-20240403194225022

6.2.2 添加物理效果

(1)准备模型,这里使用两个 Cube 当成一把剑。其父子结构如下图。

​ 给 Sword 添加 Rigidbody 和 Grabbable 组件,同时添加 Physics Grabbable 脚本。

image-20240403203205500

​ Cube 和 Cube (1) 上带有 BoxCollider,且均设置为 Trigger。

(2)进行手势录制,并做一些微调。这里将所有手指都设置为 Locked。

image-20240403203640338

(3)在生成的 HandGrabInteractable 物体上添加 Distance Hand Grab Interactable 脚本,并为其关联 Physics Grabbable 脚本。

​ 对于 Hand Grab Interactable 脚本,其 Physics Grabbable 的引用在录制时被自动关联,因此这里不需要再重复关联。也可以手动检查确认一下。

image-20240403203953314

(4)恢复物体的 Use Gravity,并且将 Collider 的 Trigger 选项取消。此时这把“剑”便拥有了远距离抓取和抛掷的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/299722.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux常用目录结构(目录命令)--6986字详谈

前面与大家讨论了linux的发展与由来&#xff08;这一块挺多的&#xff0c;小编还没有编写完成&#xff0c;希望大家理解&#xff09;&#xff0c;紧接着谈到了vmware安装及运行所存在的故障&#xff08;鉴定错误&#xff0c;虚拟机没有网&#xff0c;蓝屏等常见现象的总结及处理…

Day105:代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析

目录 代码审计-学前须知 Bluecms-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-2次注入审计分析 知识点&#xff1a; 1、PHP审计-原生态开发-SQL注入&语句监控 2、PHP审计-原生态开发-SQL注入&正则搜索 3、PHP审计-原生态开发-SQ…

Java 接口提示500,但console并不报错。

因为习惯了C语言printf打印&#xff0c;且当时并不明白try catch意义所在 如图所示&#xff0c;下添加了行号打印 但只打印出了line 89&#xff0c;无line 91&#xff0c;也无报错 所以使用try catch 包裹Sql查询封装函数 e.printStackTrace(); 果真打印出了 查看Entity类&…

【C++初阶】String在OJ中的使用(一):仅仅反转字母、字符串中的第一个唯一字母、字符串最后一个单词的长度、验证回文串、字符串相加

前言&#xff1a; &#x1f3af;个人博客&#xff1a;Dream_Chaser &#x1f388;博客专栏&#xff1a;C &#x1f4da;本篇内容&#xff1a;仅仅反转字母、字符串中的第一个唯一字母、字符串最后一个单词的长度、验证回文串、字符串相加 目录 917.仅仅反转字母 题目描述&am…

docker基础学习指令

文章目录 [toc] docker基础常用指令一、docker 基础命令二、docker 镜像命令1. docker images2. docker search3. docker pull4. docker system df5. docker rmi1. Commit 命令 三、 docker 容器命令1. docker run2. docker logs3. docker top4. docker inspect5. docker cp6. …

语音特征的反应——语谱图

语谱图的横坐标为时间&#xff0c;纵坐标为对应时间点的频率。坐标中的每个点用不同颜色表示&#xff0c;颜色越亮表示频率越大&#xff0c;颜色越淡表示频率越小。可以说语谱图是一个在二维平面展示三维信息的图,既能够表示频率信息,又能够表示时间信息。 创建和绘制语谱图的…

相位导数方差计算-matlab

%% 下面计算 相位导数方差% 假设 phase_map 是你的相位图二维矩阵 % K 是窗口的大小 k 3; % 请使用实际的窗口大小替换% 计算 x 和 y 方向的偏导 [dx, dy] gradient(wrappedPhase); Ksq k^2; % 计算 K^2half_k floor(k / 2);% 初始化结果矩阵 result zeros(size(wrappedPh…

CSRF介绍及Python实现

CSRF 文章目录 CSRF1. CSRF是什么&#xff1f;2. CSRF可以做什么&#xff1f;3. CSRF漏洞现状4. CSRF的原理5. 举例说明6. CSRF的防御Python示例 1. CSRF是什么&#xff1f; CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;中文名称&#xff1a;跨站请求…

Object 类的使用

文章目录 1、 如何理解根父类2、 Object类的方法1、equals()2、toString()3、getClass()4、hashCode()5、clone()6、finalize() 1、 如何理解根父类 类 java.lang.Object是类层次结构的根类&#xff0c;即所有其它类的父类。每个类都使用 Object 作为超类。 Object类型的变量与…

顺序表的应用之通讯录

学习了顺序表之后&#xff0c;我们也得知道它的实际用途吧&#xff01;所以&#xff0c;我们今天来学习一下通讯录的实现。 typedef struct personInfo SLDataType; contact.h #define NAME_MAX 20 #define GENDER_MAX 20 #define GTEL_MAX 20 #define ADDR_MAX 100 #include&…

牛客 2024春招冲刺题单 ONT98 牛牛猜节点【中等 斐波那契数列 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/6a3dfb5be4544381908529dc678ca6dd 思路 斐波那契数列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…

【Django开发】0到1美多商城项目md教程第5篇:短信验证码,1. 避免频繁发送短信验证码逻辑分析【附代码文档】

美多商城完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;欢迎来到美多商城&#xff01;&#xff0c;项目准备。展示用户注册页面&#xff0c;创建用户模块子应用。用户注册业务实现&#xff0c;用户注册前端逻辑。图形验证码&#xff0c;图形验证码接口设…

linux------jekins构建cicd

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;linux &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#…

Vue3:用Pinia的storeToRefs结构赋值store数据

一、情景描述 我们学习了Pinia之后&#xff0c;知道&#xff0c;数据是配置在Pinia的state里面的。 那么&#xff0c;如果有多个字段需要取出来使用&#xff0c;并且不丢失数据的响应式&#xff0c;如何优雅的操作了&#xff1f; 这里就用到了Pinia的storeToRefs函数 二、案…

SQL语句的编写

##创建用户-建表建库 #创建一个用户名为 feng&#xff0c;允许从任何主机 % 连接&#xff0c;并使用密码 sc123456 进行身份验证的用户。 rootTENNIS 16:33 scmysql>create user feng% identified by sc123456; Query OK, 0 rows affected (0.04 sec) #创建一个名为fen…

Docker容器与虚拟化技术:OpenEuler 部署 Prometheus 与 Grafana

目录 一、实验 1.环境 2.OpenEuler 部署 Prometheus 3.OpenEuler 部署 Grafana 4.使用cpolar内网穿透 二、问题 1.拉取镜像失败 2.如何导入Grafana监控模板&#xff08;ES&#xff09; 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注…

Linux离线安装python3(源码编译)

1、下载python包 下载python3.9.6的源码包 python下载 下载后&#xff0c;解压&#xff0c;目录如下&#xff1a; -rw-------. 1 root root 1454 Aug 26 2023 anaconda-ks.cfg -rw-r--r--. 1 root root 25640094 Apr 4 21:52 Python-3.9.6.tgz drwxrwxr…

Composer Windows 安装

Composer 的下载地址为&#xff1a;Composer 1 运行安装程序 当启动安装程序后单击下一步继续。 选择 PHP 路径 如果你的计算机上没有安装 PHP 的话&#xff0c;Composer 的安装无法继续。 你需要选择你本地安装的 PHP 路径。 配置代理地址 默认的情况下&#xff0c;可以不…

C语言 输入输出语句讲解 标识符概念讲解

上文 C语言 预处理器 注释 基本案例讲解 我们讲了一些 预处理器等逻辑 那么 本文继续 C语言由一个或多个函数组成&#xff0c;每个程序都必须有一个main() 函数 因为每个程序总是从这个函数开始执行 main() 函数可以返回一个值&#xff0c;返回值为0表示程序正常结束 如果有多…

分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别

分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别 目录 分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别分类效果基本介绍模型描述程序…