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

news2024/11/20 23:23:44

文章目录

  • 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.coloradmin.cn/o/1566639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenHarmony实战:CMake方式组织编译的库移植

以double-conversion库为例&#xff0c;其移植过程如下文所示。 源码获取 从仓库获取double-conversion源码&#xff0c;其目录结构如下表&#xff1a; 表1 源码目录结构 名称描述double-conversion/cmake/CMake组织编译使用到的模板double-conversion/double-conversion/源…

浅谈分布式光伏电站的运维管理

摘要&#xff1a;随着近些年我国对节能降耗关注力度的持续加大&#xff0c;为满足人们不断增长的电能需求&#xff0c;光伏发电产业得到迅猛发展&#xff0c;其中分布式光伏发电的比重持续增长。在打赢脱贫攻坚战的大背景下&#xff0c;国家电网公司探索出一条“阳光扶贫”的扶…

第十三届蓝桥杯JavaA组省赛真题 - 青蛙过河

解题思路&#xff1a; 定义一个累和数组arr&#xff0c;我们可以比较arr[ i ]和arr[ l ]之间的差值看是否大于等于2倍的x&#xff0c;满足则证明这两点之间可以跳满所有实际过河次数&#xff0c;此时记录最大距离&#xff0c;并移动左边界 l import java.util.Scanner;public…

大数据时代下,如何利用信息化、数字化、数智化成为行业领先者

在大数据时代背景下&#xff0c;企业的竞争力提升离不开信息化、数字化和数智化的联动作用。首先&#xff0c;企业需通过信息化手段&#xff0c;将业务流程、管理方式等进行标准化和系统化&#xff0c;提高效率和减少错误。同时&#xff0c;借助数字化技术如云计算、物联网等&a…

抖店体验分是什么?怎么快速提升体验分?今天一篇带你搞懂!

大家好&#xff0c;我是电商小布。 经营小店的小伙伴应该都有发现&#xff0c;当自己的店铺成功出够30单之后&#xff0c;小店就会出现体验分这个东西。 简单来说&#xff0c;这个就相当于是对我们店铺的一个综合评价&#xff0c;包括有商品、物流、服务三个方面。 这个分数…

前端作业之完成学校官方网页的制作

&#xff08;未使用框架&#xff0c;纯html和css制作&#xff09; 注&#xff1a;由本人技术限制&#xff0c;代码复用性极差 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>xxx大学</tit…

java框架学习——注解/元注解概述及使用案例

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! 注解 注解&#xff08;Annotation&#xff09;是java代码里的特殊标记。作用为&#xff1a;让其他程序根据注解信息来决定怎么执行该程序&#xff0c;如&#xff1a;Override,Test等。同时可以根…

换到idf 5.0版本后报错 jsmn could not be found

原因&#xff1a; idf5.0去掉了部分组件&#xff0c;包括jsmn&#xff0c;工程中adf又用到了这个组件&#xff0c;所以会报错。 解决办法&#xff1a; 升级adf到新版本即可。

从C到C++过渡知识 中(为什么C++支持函数重载,而C不支持函数重载)

感谢大家的阅读&#xff0c;这篇文章我们接着了解C对于C的一些优化。 函数重载 了解C这个特殊用法之前&#xff0c;我们先考虑一个问题&#xff0c;如何交换两个整数。相信大家一定信手捏来&#xff0c;实参传地址而非变量&#xff0c;于是可以写出如下函数。 void Swap(int*…

无极低码:免费版部署操作指南

无极低码 :https://wheart.cn 无极低码:免费试用版部署过程参照: 无极低码部署版操作指南 https://wheart.cn/so/home?m=index&id=ad614930-d936-11ee-8489-525400be6368 ” 。 下载完解压成后进行部署

Codeforces Round 837 (Div. 2) C. Hossam and Trainees

题目 #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; const int N sqrt(1…

硬件RAID横评(上)

正文共&#xff1a;3857字 50图&#xff0c;预估阅读时间&#xff1a;12 分钟 之前误打误撞测试了软件RAID&#xff08;Windows下软RAID测试&#xff09;&#xff0c;发现性能基本上是线性的&#xff0c;而据说硬件RAID性能比这个高的很。那本文将就硬件RAID展开测试&#xff0…

【leetcode】 c++ 数字全排列, test ok

1. 问题 2. 思路 3. 代码实现 #if 0 class Solution { private:vector<int> path; // 满足条件的一个结果 vector<vector<int>> res; // 结果集 void backtracking(vector<int> nums, vector<bool> used){// 若path的个数和nums个数相等,说明…

C++中的vector与C语言中的数组的区别

C中的vector和C语言中的数组在很多方面都有所不同&#xff0c;以下是它们之间的一些主要区别&#xff1a; 大小可变性&#xff1a; vector是C标准模板库&#xff08;STL&#xff09;提供的动态数组容器&#xff0c;它的大小可以动态增长或减少。这意味着你可以在运行时添加或删…

JavaScript高级 —— 学习(三)

目录 一、深入面向对象 &#xff08;一&#xff09;面向对象介绍 &#xff08;二&#xff09;面向对象编程 &#xff08;oop&#xff09; 1.面向对象编程介绍 2.面向对象编程优点 3.面向对象的特征 4.和面向过程编程对比 二、构造函数 &#xff08;一&#xff09;介绍…

STM32 移植 LVGL -- 教程图解

&#xff08; 编辑状态中&#xff0c;已完成80%&#xff0c;估计清明假期后完成更新 ) 移植效果&#xff0c;先睹为快&#xff1a; 目录 一、LVGL 简述 二、准备一个STM32的工程 三、LVGL 官方下载 四、裁剪 源文件 五、添加 源文件 六、注册 显示 七、注册 触摸输入 八…

014——超声波模块驱动开发Plus(基于I.MX6uLL、SR04和poll机制)

目录 一、基础知识 二、分析为什么打印会影响中断 三、驱动程序 四、应用程序 五、验证及其它 一、基础知识 013——超声波模块驱动开发&#xff08;基于I.MX6uLL与SR04&#xff09;-CSDN博客 二、分析为什么打印会影响中断 asmlinkage __visible int printk(const ch…

如何在本地搭建集成大语言模型Llama 2的聊天机器人并实现无公网IP远程访问

文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛&#xff0c;包括聊天机…

Python字典操作

假设我们有一个学生信息数据库&#xff0c;其中存储了每个学生的姓名、年龄、性别和成绩。我们可以使用字典来表示每个学生的信息&#xff0c;并将所有学生存储在一个字典列表中。 设计者&#xff1a;ISDF 版本&#xff1a;v1.0 日期&#xff1a;03/29/2024# 定义学生信息字典列…

Ruby 之交租阶段信息生成

题目 我看了一下&#xff0c;这个题目应该不是什么机密&#xff0c;所以先放上来了。大概意思是根据合同信息生成交租阶段信息。 解答 要求是要使用 Ruby 生成交租阶段信息&#xff0c;由于时间比较仓促&#xff0c;变量名那些就用得随意了些。要点主要有下面这些&#xff1a…