一步步教你用 WebVR 实现虚拟现实游戏

2023-10-31

翻译:疯狂的技术宅

www.smashingmagazine.com/2018/11/vir…

在本教程中,我们将创建三维对象并为它们添加简单的交互。此外,你还可以学到如何在客户端和服务器之间建立简单的消息传递系统。

虚拟现实(VR)是一种依赖计算机生成环境的体验,其应用范围广泛:美国利用虚拟现实进行冬季奥运会的运动训练;外科医生正在试验用虚拟进行医学培训;把虚拟现实用于游戏是最常见的一种应用。

我们将把目光放在最后一类程序上,并将专注于点击式冒险游戏。这是一种休闲类游戏,游戏的目标是通过选择场景中的三维对象来完成拼图。在本教程中,我们将在虚拟现实中构建一个简单的版本。这是一篇关于三维编程的介绍,是在 Web 上部署虚拟现实模型的独立入门指南。你将使用 webVR 进行构建,这个框架具有双重优势 —— 用户可以在VR中玩游戏,而没有VR眼镜的用户也可以在手机或桌面上玩。

在本教程的后半部分中,你将为桌面构建一个“镜像”。这意味着在移动设备上进行的所有移动都将会在桌面预览中进行镜像。这样你可以看到玩家所看到的内容,允许你提供指导、记录游戏,或只是让客人娱*乐。

至于为什么“娱”和“乐”中间有一个奇怪的符号,因为,这两个字连在一起在掘金是违规的,哈哈,不信你发文的时候可以试试~

前提条件

在开始之前你需要准备以下内容。对于本教程的后半部分,你将需要一台Mac OSX。虽然代码可以应用于任何平台,但下面依赖项的安装说明适用于Mac。

  • 互联网接入,特别是glitch.com;
  • VR 眼镜(可选,推荐)。我用的是Google Cardboard,每个售价15美元。

步骤1:设置虚拟现实(VR)模型

在此步骤中,我们将设置一个包含单个静态 HTML 页面的网站。这样可以允许你从桌面进行编码并自动部署到Web上,然后可以将部署的网站加载到手机上并放入VR眼镜内。或者部署的网站可以由独立的 VR 眼镜加载。首先打开https://glitch.com/。然后

  1. 单击右上角的 “New Project” 。
  2. 单击下拉列表中的“hello-express”。

接下来,单击左侧边栏中的 views/index.html。我们将此称为你的“编辑器”。

要预览网页,请单击左上角的“Preview”。我们将此作为你的预览。请注意,编辑器中的任何更改都将会自动反映在预览中,除非出现错误或不受支持的浏览器。

返回编辑器,将当前HTML替换为下面 VR 模型的代码框架。

<!DOCTYPE html>
<html>
  <head>
      <script src="https://aframe.io/releases/0.7.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>

      <!-- blue sky -->
      <a-sky color="#a3d0ed"></a-sky>

      <!-- camera with wasd and panning controls -->
      <a-entity camera look-controls wasd-controls position="0 0.5 2" rotation="0 0 0"></a-entity>

      <!-- brown ground -->
      <a-box shadow id="ground" shadow="receive:true" color="#847452" width="10" height="0.1" depth="10"></a-box>

      <!-- start code here -->
      <!-- end code here -->
    </a-scene>
  </body>
</html>
复制代码

之后可以看到以下内容:

要在VR眼镜上预览此功能,请使用 omnibar 中的URL。在上图中,URL 为 https://point-and-click-vr-game.glitch.me/。你的工作环境现在已建立,可以随时与家人和朋友分享这个URL。在下一步中,你将创建一个虚拟现实模型。

步骤2:创建一个树的模型

现在,我们将用 aframe.io 中的 primitives 创建一个树。这是 Aframe 为便于使用而预编程的一些标准对象。具体来说,Aframe 将对象称为实体(entities)。与实体相关的概念有三个:

  1. 几何和材质,
  2. 转换轴,
  3. 相对转换。

首先,几何材质是代码中所有三维对象的两个构建块。几何定义了一系列的“形状” —— 立方体,球体,金字塔等。材质定义了形状的静态属性,例如颜色、反射率、粗糙度。

Aframe 通过定义基元来简化这个概念,例如 <a-box><a-sphere><a-cylinder> 以及许多其他基本原理来简化几何体及其材料。首先定义一个绿色球体。在代码的第19行,也就是 <!-- start code here -->之后添加以下内容。

<!-- start code here -->
<a-sphere color="green" radius="0.5"></a-sphere>  <!-- new line -->
<!-- end code here -->
复制代码

其次,有三个轴可以转换对象。 x 轴是水平运动的,当我们向右移动时,x 值会增加。 y 轴垂直运行,y 值随着我们向上移动而增加。 z 轴用垂直你的屏幕,当对象向你移动时,z 值会增加。我们可以沿这三个轴平移,旋转或缩放实体。

例如,要将对象向“右”移动,我们需要增加其x值。要向上旋转对象,我们需要沿 y 轴旋转它。下面我们修改第19行来“向上”移动球体 —— 这意味着你需要增加球体的 y 值。请注意,所有转换都指定为 <x> <y> <z>,意味着要增加其y值,需要增加第二个值。默认情况下,所有对象都位于 0,0,0 位置。在下面添加 position

<!-- start code here -->
<a-sphere color="green" radius="0.5" position="0 1 0"></a-sphere> <!-- edited line -->
<!-- end code here -->
复制代码

第三,所有变换都相对于其父对象。要在树中添加树干,就在上方球体内添加圆柱体,这样可确定树干相对于球体的位置,还可以将你的树木整合为一个单元。在<a-sphere ...></ a-sphere>标签之间添加<a-cylinder>实体。

<a-sphere color="green" radius="0.5" position="0 1 0">
	<a-cylinder color="#84651e" position="0 -0.9 0" radiu
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一步步教你用 WebVR 实现虚拟现实游戏 的相关文章

  • 有没有办法动态更改 jqGrid 的单元格值?

    这个问题可能已经被问过很多次了 但我想知道是否可以动态更改 jqgrid 的单元格值 我基本上有一个网格 它通过 JSON 字符串加载数据 在特定列的某些行上 该值可能为 null 因此 预先知道哪个行 ID 是一个问题 然后能够将 nul
  • Javascript 进程是否有多个执行线程?

    背景 我正在创建一个 地址簿 类型的应用程序 有很多条目需要加载 一个想法是首先加载一小部分条目 让用户开始 然后将剩余条目排队 优先考虑用户单击的条目 例如 如果他们单击以 X 开头的名称 请先加载这些名称 然后再处理队列的其余部分 这个
  • 将时间戳转换为一个数组

    在应用程序脚本 谷歌表中运行 我从 API 获取时间戳并返回此结果 1 6370611672429312E18 1 63706107263277082E18 我执行此代码并且工作正常 但问题不在数组中 我每次都需要它在数组中 const t
  • Angular UI 路由器嵌套视图问题

    我在理解 Angular UI Router 嵌套视图的工作原理时遇到了一些问题 我的 stateProvider 看起来像这样 stateProvider state login url login views main template
  • JavaScript 相当于 Python 的参数化 string.format() 函数

    这是 Python 示例 gt gt gt Coordinates latitude longitude format latitude 37 24N longitude 115 81W Coordinates 37 24N 115 81W
  • 我可以在 GWT 中使用第三方 Javascript 库吗

    例如穆工具 用 js 编码对我来说很舒服 但显然不适合所有人 你当然可以 最好的事情就是给自己写一些好看的JavaScript 覆盖类型 http code google com webtoolkit doc latest DevGuide
  • 正则表达式中连字符的这种用法有效吗?

    NB I only想知道它是否是正则表达式定义中未转义连字符的有效应用 它是not关于匹配电子邮件 连字符或反斜杠的含义 量词或其他任何内容的问题 另外 请注意 链接的答案并没有真正讨论转义 未转义连字符之间的有效性问题 通常我会像这样声明
  • websockets 如何处理同一浏览器的两个选项卡

    I have 1 个 PHP 服务器 提供 http 请求 和 1 node js 发布更新的数据消息 每个连接都带有 websocket php 服务器设置其 cookie 在一个浏览器中 此 cookie 可在所有选项卡中使用 当浏览器
  • 如何显示接下来的三个图像单击加载更多按钮

    我需要一个加载更多按钮来显示图像 页面加载时 我显示 3 个图像 单击 加载更多 按钮后 接下来的 3 个图像将显示在屏幕上 我尝试了下面的代码 但它不起作用 你能帮我解决这个问题吗 function item slice 0 2 show
  • jQuery:将文本区域滚动到给定位置

    我有一个包含很多文本的文本区域
  • Apache Camel 的 JsonMappingException

    我在骆驼路线上遇到以下异常 Caused by com fasterxml jackson databind JsonMappingException No serializer found for class org apache cam
  • 返回视图作为 JSON 对象的一部分

    我有一个应用程序只加载一次完整视图 我这样做的原因并不重要 重要的是 其余内容只会以部分视图的形式返回 除了一些内容之外 我还有一些 JSON 对象 我想通过每个 AJAX 请求在服务器之间来回传递 有没有办法返回一个 JSON 对象 并将
  • Angular 4 Http POST 不起作用

    我希望每个人都做得很好 我最近开始使用 Angular 4 4 我一直在尝试将数据发布到我的 api 服务器 但不幸的是它不起作用 我花了大约两天的时间 但仍然没有成功 甚至已经尝试过 6 7 篇文章角 io https angular i
  • ES6 模块范围

    我有代码 lib js var a a export var b b main js console log a a variable is not available in a global scope import b from lib
  • 如何从 html 页面 [javascript] 调用 Web 服务方法而不刷新页面

    我有一个webservice这将返回一个值 我的要求是 我需要调用它webservice从一个index html页面 该页面有一个 html 提交按钮 在该按钮上单击我正在呼叫JavaScript 从那里我想调用网络方法 我怎样才能做到这
  • vuejs中如何获取组件编译后的html内容

    我有一个这样的组件
  • 如何在 React Native 中使用相同的 Firebase 数据库在两个应用程序之间进行通信?

    我有两个不同的应用程序使用相同的实时数据库 在第一个应用程序中 我发送的订单包含一些要保存在数据库中的数据字段 在另一个应用程序中 我只添加一个侦听器 firebase database ref userOrder currentUser
  • 如果 POST 响应仅包含 ID,如何将数据保存到我的 Ember 存储?

    Ember 数据期望我的服务器在每次成功后返回完整的对象POST 但是 我的 API 只返回一种元对象 其中包含id 当 Ember 收到此对象时 记录中的现有数据将被删除 除了id 例如 当我这样做时 var asset App Asse
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但
  • 将引导程序弹出框保留在视口内

    我正在尝试使用带有按钮的侧边栏创建一个菜单 每个按钮都有一个指定的包含相关数据的弹出窗口 不幸的是 其中一个弹出窗口可能包含任意数量的行 并且在某些情况下它可能部分位于视口之外 See http jsfiddle net bfd9f 1 h

随机推荐

  • 针式打印机打印发虚_针式打印机打印输出字符模糊不清晰的原因有哪些

    针式打印机打印输出字符模糊不清晰的原因有哪些 针式打印机应用于发票和多联单据 如果打印效果出现模糊或者不清晰情况的话 所打印出来的发票和多联单据就会报废 这样就会出现耗材浪费 所以针式打印机输出字符模糊不清的时候 我们就应该找出引起故障原因
  • TCP和UDP详解

    文章目录 一 UDP协议 1 1 UDP协议报文格式 1 2 UDP协议的特点 1 3 扩展问题 二 TCP协议 2 1 TCP协议报文格式 2 2 什么是可靠性 2 2 1 确认应答机制 2 2 2 超时重传机制 2 2 3 连接管理机制
  • java eclipse 和 adt eclipse 去掉红色的波浪线以及错误语法提示

    windows gt perferences gt editors gt text editor gt annotation 在里面选择errors 把其中的三个选项都取消勾选 在里面选择c c indexer markers 把其中的三个
  • 前端代码规范

    文章目录 一 编程规约 一 命名规范 二 HTML 规范 Vue Template 同样适用 三 CSS 规范 四 LESS 规范 五 Javascript 规范 二 Vue 项目规范 一 Vue 编码基础 二 Vue 项目目录规范 前端代
  • 网络安全:XSS、CSRF、点击劫持、HTTPS加密(中间人攻击、DNS劫持)、泛洪攻击、SQL注入

    一 XSS攻击 什么是 XSS 攻击 XSS 全称是 Cross Site Scripting 即跨站脚本 为了和 CSS 区分 故叫它XSS XSS 攻击是指浏览器中执行恶意脚本 无论是跨域还是同域 从而拿到用户的信息并进行操作 这些操作
  • AMA: Yoshua Bengio (self.MachineLearning)

    Yoshua Bengio http www iro umontreal ca bengioy yoshua en index html is one of the machine learning professors who led t
  • 线上环境 CPU 使用率飙升如何快速排查?

    相比于一大堆复杂的 JVM 调优过程 本文介绍的排查步骤还是挺简单的 可以帮助各位小伙伴排查一些简单问题 面试官问起来也好过啥也不会 这个 CPU 打满如何排查我被问过好多次 模拟高 CPU 场景 这里就不麻烦地建 Web 项目了 用一个最
  • 上拉电阻和下拉电阻的作用详解

    一 定义 1 上拉就是将不确定的信号通过一个电阻嵌位在高电平 电阻同时起限流作用 下拉同理 2 上拉是对器件注入电流 下拉是输出电流 3 弱强只是上拉电阻的阻值不同 没有什么严格区分 4 对于非集电极 或漏极 开路输出型电路 如普通门电路
  • HTTP服务器实现(一)

    实现一个HTTP服务器就是实现一个程序可以接受客户端发送给服务器进程的请求消息 通过解析这些请求消息 做出相应的响应 下面我们先来梳理一下整体的思路 进行服务器的初始化 int init server char ip int port in
  • FPGA时序约束系列文章汇总

    时序约束在FPGA开发中起着非常关键的作用 与时序约束相关的方面包括时钟分析 路径分析 布线和布局优化等 时序约束的正确性和准确性对于设计的成功是至关重要的 因为它们对电路的时序性能 功耗和资源利用率有着重要影响 有效的时序约束可以帮助设计
  • UE4开发学习笔记(双人游戏共享视角,共享相机)

    先创建一个共享相机的actor类share camera 里面只要spring arm和camera就行 在关卡蓝图里设置摄像机位置 setviewtargetwithblend是将character本身的摄像机过渡到公共摄像机 这里的bl
  • 前端小白练习题查缺补漏2

    1 声明不是 HTML 标签 它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令 声明没有结束标签 声明对大小写不敏感 2 end Math pow 2 50 111111 假设的值 var start end 100
  • duilib-自定义圆形按钮-环形进度条控件

    duilib 自定义圆形按钮 环形进度条控件 如何自定义一个圆形按钮控件内嵌到环形进度条底部 点击按钮刷新进度条值 类似下图 1 在UIDefine h中增加宏定义 define DUI CTR BTN PROGRESS T btnProg
  • sqli-labs(27)

    0X01 先查询闭合 id 1 报错 id 1 正确 知道是 的闭合语句 0X02那么开始我们的注入之旅 空格过滤了 尝试一下 0a绕过 也被过滤了 那么用and 1 1构造闭合 id 1 1 1 显示正确 我们来爆一下数据名称 哦豁 un
  • 产品经理工作积累(1)

    相比较做技术工作的人来说 做产品工作的更倾向于软能力 而这种软能力体现在个人的产品思想上 更或者说做产品的思维或理念 做产品除了本身的产品设计能力外 还有一点就是产品的思想 同一种产品不太的产品做出来后产品形态都会不同 特别是对于一些有独特
  • 在 Shell 脚本中调用另一个 Shell 脚本的三种方式

    先来说一下主要以下有几种方式 fork 如果脚本有执行权限的话 path to foo sh 如果没有 sh path to foo sh exec exec path to foo sh source source path to foo
  • android 反编译方法、工具介绍

    网上有很多的反编译文章 个人认为写的比较好的文章有 APK反编译得工具总结 转载 hayhx 博客园 我也是参考其文章来的 本人写此文章目的 以及反编译运用场景 主要有以下几方面 记录反编译的方法 方便自己用的时候比较方便 起到记录的作用
  • python词频统计_Python中文词频统计

    1 下载一长篇中文小说 2 从文件读取待分析文本 3 安装并使用jieba进行中文分词 pip install jieba import jieba ljieba lcut text import jieba txt open r piao
  • async 和 await

    async async是一个加在函数前面的修饰符 被async修饰的函数会默认返回一个promise对象 可以使用then方法添加回调函数 返回的promise对象的结果是由async函数执行的返回值的结果来决定的 1 当async函数内部
  • 一步步教你用 WebVR 实现虚拟现实游戏

    翻译 疯狂的技术宅 www smashingmagazine com 2018 11 vir 在本教程中 我们将创建三维对象并为它们添加简单的交互 此外 你还可以学到如何在客户端和服务器之间建立简单的消息传递系统 虚拟现实 VR 是一种依赖