草庐IT

【Oculus Interaction SDK】(一)设置 VR 相机与控制器 & 实现简单的抓取功能

小叶子 の 成长足迹 2023-03-28 原文

前言

前段时间 Oculus 的 SDK 频繁更新,很多已有的教程都不再适用于现在的版本了。本系列文章的主要目的是记录现版本常见功能的实现方法,便于自己后续开发。当然,不排除我文章刚写完 SDK 又变了的可能性,所以如果有人发现文章的内容已经不适用于新版本了,也可以留评论或者私信我,我会持续更新文章内容。

当前适用版本:

  • Unity 版本:2021.3.7f1c1
  • Oculus Interaction SDK 版本:47.0

文章最近更新日期:2023.02.07

 


安装 SDK

安装 Unity XR 支持

在导航栏找到 Edit > Project Settings > XR Plugin Management,点击 Install XR Plugin Management 安装 XR 支持工具

随后分别在 Windows 和 Android 选项卡中勾选 Oculus 选项,添加对 Oculus SDK 的支持

 

安装 Oculus 开发工具

Oculus Interaction SDK 在 Unity 资源商店里可以找到,这是 Oculus 官方提供的开发工具,需要添加到自己的账号里面使用

Oculus Integration | 整合 | Unity Asset Store

添加完成之后回到自己的项目,在导航栏找到 Windows > Package Manager,在自己的资源里搜索、下载并安装

 

选择 All,导入所有资源

 

如果遇到更新提示,选择 Yes

 

选择 Use OpenXR

 

点击 OK

 

选择 Restart

 

选择 Show Assets(Recommended)

 

选择 Clean Up(Recommended)

 

选择 Clean Up Package

 

选择 Upgrade

 

选择 Restart,重启 Unity

 

正式开发

添加相机和控制器

新建一个场景,或者保存使用默认的 SampleScene 场景

删除场景中原有的 Camera,在 Project 窗口搜索 OculusInteractionSampleRig,添加到场景中

找到 OculusInteractionSampleRig > OVRCameraRig 的组件 OVR Manager,将 Tracking Origin Type 调整为 Floor Level

这是我比较喜欢的追踪类型,它会将场景中世界原点的位置与你所处的地面对齐

 

运行效果如下

 

实现抓取物品功能

控制器设置

在 Project 窗口搜索 ControllerGrabInteractor,使其成为 ControllerInteractors 的子物体(注意:Grab 与 Poke 是同级的)

 

因为两只手的设置过程基本一致,在本文及后续文章中我只会给出一只手的设置过程,另一只手大家按照同样的步骤来设置就可以了

 

手势追踪设置

在 Project 窗口搜索 HandGrabInteractor,使其成为 HandInteractorsLeft 的子物体(右手是 HandPokeInteractorRight)

 

手的设置与控制器设置类似,在这里只演示一只手的设置方式

这样,控制器和手的抓取功能就可以实现了

 

制作可被抓取的物体

想要一个物体可以被抓取,需要添加几个必要的组件:

  • Collider
  • Rigidbody
  • Grabbable
  • Grab Interactable(只实现控制器抓取)/ Hand Grab Interactable(只实现用手抓取) 注:如果同时添加二者,表示两种方法都可以实现抓取

在场景中添加一个 Cube,添加所需的组件(Pointable Element 引用的是 Grabbable 组件,这点在后续的内容中也会出现)

 

这样就可以实现简单的控制器抓取物体的效果了

 

其他的方式在此只放出必要的内容,具体细节不做展示(方法都是类似的)

以下内容按顺序分别为:只能用控制器、只能用手、二者都可以用

 

关闭操作检测器

在前面的内容里可以看到控制器上有一个会变色的小球,这个小球其实是 debug 用的

碰到可交互区域的时候小球会变蓝色,按下 Grab(握柄)按钮的时候会变成绿色,这个可视化工具可以帮助我们判断可交互的内容是否出现问题

 

如果不想要这个这个小球,也可以手动关闭它

在我们之前添加的 ControllerInteractors 中找到 Visuals > DebugVisuals,禁用这个子物体

 

这样就关闭了控制器的操作检测器

 


参考资料

How to Interact in VR - Oculus Interaction SDK - PART 1 - YouTube

有关【Oculus Interaction SDK】(一)设置 VR 相机与控制器 & 实现简单的抓取功能的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  7. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  8. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  9. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  10. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

随机推荐