AR是增强现实的缩写,可以在真实世界的映像中叠加额外的信息来增强对现实的表达能力。最出名的一个AR应用就是精灵宝可梦了,玩家用手机在现实世界中捕捉宝可梦小精灵。
通常AR应用可以根据不同的方式来对现实世界的映像进行处理,然后生成AR信息。例如对于图像进行判断,或基于GPS位置信息判断,看是否要呈现AR的内容。要想获得好的AR的效果,对于手机的硬件也是有一定的要求的,因为手机需要进行校正,使得能准确的识别物体的表面,以更好的放置AR模型。例如谷歌的手机,只有获得了AR认证的手机型号,才能提供较好的AR能力。
制作AR的应用,也有很多的软件,例如Unity的AR foundation,其融合了谷歌的AR Core和苹果的AR kit,可以方便的制作跨平台的AR应用。我也尝试了用Unity来制作AR,但是发现需要有合适的支持AR的手机才能测试效果,我手头的两部小米的手机,虽然是在谷歌的认证型号中,但是做出的效果确差别很大,因此只能放弃用Unity。经过在网上搜索,我发现其实还有另外一种更方便的方式可以快速的搭建手机的AR应用,那就是Web AR的方式,这里有很多个开发框架支持这种方式,例如AR.js, webar-rocks等等,我选择了AR.js来进行开发。
AR.js融合了ARToolkit,A-Frame, Three.js等几个框架,其中ARToolkit是提供AR引擎的相关功能,例如对图形进行检测,测量摄像头与物体的距离等等。A-Frame和Three.js这两个框架是提供了WebGL的渲染能力。官网的介绍也很简洁易懂,可以参阅AR.js Documentation
这里我介绍一下用AR.js搭建一个AR应用的方法。AR.js支持图像追踪,Marker识别,室外定位这几种AR触发方式。我这里基于图像追踪来搭建一个室内的AR应用。
首先选取几个室内的位置来摆放AR的内容,拍摄这些位置的图片,要注意的是图片内容越复杂越好,因为之后我们要对图片进行处理,提取图片的特征。图片越复杂,其包括的轮廓线条就越丰富,例如直线,转角,弧形等等,这样就能更准确的进行定位,另外图片包括的像素越多就越好,所以我们尽量不要对手机拍摄的图片进行缩小分辨率的操作。之后我们可以把图片上传到这个网站NFT-Creator-Web来提取图片的特征,这个网站会对每张图片生成三个文件,包含了图片的特征。把这些生成后的文件保存下来。
然后我们要创建AR的内容,这里我找到一个很好的网站,里面有很多很漂亮的免费的3D模型下载,Explore 3D Models - Sketchfab,这里我们下载模型的时候尽量选择GLTF格式,因为AR.js也是推荐使用这种格式的。
最后我们就可以在web服务器里面创建一个HTML文件,内容如下:
<script src="https://cdn.jsdelivr.net/gh/aframevr/aframe@1c2407b26c61958baa93967b5412487cd94b290b/dist/aframe-master.min.js"></script>
<script src="https://raw.githack.com/AR-js-org/AR.js/master/aframe/build/aframe-ar-nft.js"></script>
<script src="https://raw.githack.com/fcor/arjs-gestures/master/dist/gestures.js"></script>
<style>
.arjs-loader {
height: 100%;
width: 100%;
position: absolute;
top: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.8);
z-index: 9999;
display: flex;
justify-content: center;
align-items: center;
}
.arjs-loader div {
text-align: center;
font-size: 1.25em;
color: white;
}
</style>
<body style="margin : 0px; overflow: hidden;">
<!-- minimal loader shown until image descriptors are loaded -->
<div class="arjs-loader">
<div>Loading, please wait ...</div>
</div>
<a-scene
vr-mode-ui="enabled: false;"
renderer="logarithmicDepthBuffer: true; precision: medium;"
embedded
arjs="trackingMethod: best; sourceType: webcam;debugUIEnabled: false;"
gesture-detector
>
<!-- we use cors proxy to avoid cross-origin problems ATTENTION! you need to set up your server -->
<a-nft
type="nft"
url="marker/marker"
smooth="true"
smoothCount="10"
smoothTolerance=".01"
smoothThreshold="5"
raycaster="objects: .clickable"
emitevents="true"
cursor="fuse: false; rayOrigin: mouse;"
>
<a-entity
gltf-model="/models/medieval/scene.gltf"
scale="5 5 5"
position="150 -100 -150"
class="clickable"
gesture-handler="minScale: 0.25; maxScale: 10"
>
</a-entity>
</a-nft>
<a-nft
type="nft"
url="ntf/location/location_1"
smooth="true"
smoothCount="10"
smoothTolerance=".01"
smoothThreshold="5"
raycaster="objects: .clickable"
emitevents="true"
cursor="fuse: false; rayOrigin: mouse;"
>
<a-entity
gltf-model="/models/rocket/scene.gltf"
scale="1 1 1"
position="50 -100 -50"
class="clickable"
gesture-handler="minScale: 0.25; maxScale: 10"
>
</a-entity>
</a-nft>
<a-entity camera></a-entity>
</a-scene>
</body>
简单解释一下,首先三个Script标签是引入了相关的JS文件,其中第三个是用于手势识别的。这里最后两个Sricpt的地址需要有国外代理才能访问,建议先下载到本地。然后<a-scene>这个标签是建立AR场景的,因为这个场景里面我们有两个图片追踪,所以里面包括了两个<a-nft>的标签。在<a-nft>里面我们需要定义url,这是指向我们之前保存的图像特征文件的路径,在<a-entity>标签里面需要指定我们要加载的3D模型的路径。
启动web服务器之后,访问这个html即可测试AR应用。注意这里的Web服务器需要采用https的方式访问,因为需要打开摄像头,按照谷歌的设定,只有通过https调用的网站才能开启摄像头。
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R