常见问答
什么是A-Frame?
:a:-Frame 是一个用来构建虚拟现实(VR)应用的网页开发框架。由WebVR的发起人Mozilla VR 团队所开发,在three.js和DOM之上实现了声明式的实体-组件-系统模式。
为什么需要A-Frame
A-Frame使得WebVR易于学习和快速开发,有益于构建WebVR的内容生态系统。
如何开始A-Frame的开发
阅读入门教程来建立基础概念和开发环境。
阅读开发指南来构建简单到高级的WebVR应用。
此外,你可以在网上搜索参考作品,比在百度上搜索要更实时和有效。或者您可以在awesome-aframe
A-Frame代码仓库上获取项目资源。如果需要技术帮助,可以在StackOverflow上提问。
A-Frame的性能如何
DOM的布局系统已经成为Web应用程序的主要性能瓶颈之一。A-Frame通过自定义元素把DOM作为场景中图形对象的数据容器来使用,这些元素不经过浏览器渲染系统,而是由WebGL直接渲染。这使得我们能够达到90+FPS的渲染性能。A-Painter就是用A-Frame开发的一个性能非常平滑的应用实例。
setAttribute
方法的效果是异步的。当修改一个实体的位置时,开销几乎为零。执行setAttribute('position', {x: 1, y: 2, z: 3})
几乎等同于直接修改底层three.js对象。- 当改变一个实体的属性时,数据不会序列化回DOM。这减少了DOM开销,大多数修改直接在内存中完成,类似于React的虚拟DOM。
- 从HTML文件中显式设置的HTML属性被缓存在内存中。
A-Frame提供了基本的性能优化机制,但是性能最终取决于每个场景的复杂性和特性。为了充分利用资源,我们需要对3D图形有更深的理解。请阅读最佳性能实践和指南章节来了解更多细节。
为什么我的资源(比如 image, video, model) 没有被加载?
如果您正在从另一个域加载该资源,请确保该资源所在服务器启用了跨域资源共享(CORS),或者将你的资源放在和场景代码同一域名下。
所有部署在GitHub网页上的资源是可以跨域访问的。我们推荐使用GitHub网页作为一个简单的部署平台。或者您也可以使用A-Frame + Uploadcare Uploader,这也是一个提供了CORS信息头的服务。
为什么A-Frame中的HTML/DOM不更新?
出于性能原因,A-Frame不使用组件数据来更新DOM。使用调试组件来启用组件到DOM的序列化(component-to-DOM serialization)。
为什么在移动设备上视频不播放?
出于移动网络流量耗费的原因,当前移动浏览器在显示内置视频方面有所限制。
由于iOS平台限制,为了获得内置视频(无论是否自动播放),我们必须:
- 设置
<meta name="apple-mobile-web-app-capable" content="yes">
meta标签(如果没有将会被自动注入到页面头部)。 - 为video元素设置
webkit-playsinline
属性(将自动添加到所有视频中)。 - 把网页锁定到iOS主屏幕。
iOS 10可能将对在线视频支持做出改变(长期而言,限制应该被取消)。在某些Android设备或浏览器上,我们必须:
- 需要用户交互来触发视频(例如单击或点击事件)。查看Chromium Bug 178297.
我们将努力创建一个视频应用模板,来适配尽可能多的移动设备。
如何显示iframe或者在A-Frame中渲染HTML?
作为浏览器的一个限制,<iframe>
不能在A-Frame中显示,不能作为纹理,不能和WebGL/WebVR混在一起。尽管我们可以把它作为一个A-Frame场景之上的浮层来使用,但并不能在VR模式下正常显示。
解决方案可以画到<canvas>
上并以此作为纹理贴图的来源。社区有一些组件可以使用:
在哪里找到资源?
awesome-stock-resources,上面有很多免费资源
对于纹理贴图,textures.com。
对于360°全景图,搜索Flickr球面投影图。
对于3D模型:
<!--能否在纹理中渲染Youtube视频?
With manual effort, you could either proxy YouTube videos as a texture or download them locally to serve, but that is against their terms of service.
For inspiration, Chris Van has a project that proxies YouTube videos for WebVR.
-->能否在场景中添加链接?
Mozilla目前正在改进浏览器中的链接访问用户体验,以及帮助迭代API。A-Frame将会提供一个链接组件。
A-Frame使用什么类型的单位?
A-Frame使用的单位为米。它维持1:1的比率。在A-Frame中5单位等于在现实生活中的5米。此外,当使用类似Blender这样为英制或公制模式的程序时,度量也将是1:1转换。Blender中的10英尺长等同于现实生活中的10英尺。
A-Frame和VRML有什么不同?
A是一个JavaScript框架,不是3D或Web标准。它包含Extensible Web Manifesto。只吸收在标准化过程中获胜的想法。VRML曾经是一个和HTML类似的网页3D标准,不过已接近被淘汰。
技术上来讲,A-Frame构建在一个entity-component-system模式之上,是完全可扩展的,并且与现有的所有Web开发框架和工具都可以很好的集成在一起。
A-Frame支持哪些特性?
A-Frame提供了一些现成的组件和原语。不过因为基于entity-component-system模型,当一个特性没有现成的组件支持时,你可以自己编写组件来支持它。或者某个基础组件不能完全满足需求时,你可以克隆它并扩展出自己需要的特性。
看看社区生态系统已经提供了哪些功能组件:awesome-aframe组件集/a>。
A-Frame支持哪些开发库或框架?
A-Frame是基于DOM的,所以绝大部分Web框架原则上都可以集成。我们发现如下框架已经可以和A-Frame一起很好的工作:
A-Frame支持Leap Motion吗?
可以使用Leap Hands组件支持Leap Motion控制。
这个医学教育项目也支持Leap Motion控制模式。
A-Frame支持哪些设备,头戴和平台?
请查看 设备和平台支持.
如何提高性能?
请查看 最佳实践.
如何分享作品?
我们推荐在国内使用在线平台来分享作品(好的作品会被推荐到网站首页),您也可以使用如下几个国外渠道:
- A-Frame的官推:@aframevr.
- 社区:A-Frame Slack channel.
- 博客:A Week of A-Frame.
- 代码仓库:awesome-aframe repository.
我怎么跟A-Frame团队联系?
- 在线问答: A-Frame StackOverflow tag.
- 问题反馈: A-Frame GitHub repo.