>我以前已经讨论过在SitePoint文章中开发虚拟现实网络体验的所有基础知识,将VR带到网络上使用Google Cardboard和Thrive.js,因此,如果您是整个想法的新手,请先阅读该一个,然后再阅读一个,然后出现。后退。该演示使用相同的基础。
>我们将要构建的演示将观看现场Twitter流以获取关键字。当一个人在观看溪流时发推文时,它将带来一个闪亮的颗粒的“塔”,代表了推文的时间。特别是该演示将寻找“披萨”一词。你为什么要披萨?我正在寻找一个不像“ Bieber”那样频繁提及的术语,而是“ Boxcar Racing Hyenas”更频繁。简而言之,最好的术语是相对频繁的术语,在您正在观看时会出现它们,但并不是那么频繁,以至于它们每秒几百次。披萨是其中之一。
钥匙要点
>利用node.js和socket.io创建一个可以处理和发射Twitter流数据的实时服务器,从而增强了VR可视化的交互性。
- 集成了三个.js以构建一个3D VR环境,其中推文表示为唯一的粒子塔,根据推文长度的高度变化。
- >通过设置最大粒子计数并在定义范围内安排粒子塔来优化VR中的用户体验,以防止性能滞后。
- >通过使用用户配置文件颜色来自定义Tweet表示的视觉方面
- >通过在Heroku等平台上部署节点服务器并使用Ngrok等隧道服务在各种设备上测试VR体验,请确保广泛的可访问性和实时功能。
- 演示代码
- 如果您渴望直接进入代码并尝试一下,则可以在GitHub上找到它。
我们的服务器代码
我们将首先查看我们的节点服务器代码。它将显示我们的Flat HTML,并且还可以作为socket.io服务器运行,该服务器将从Twitter中汲取数据流。
>
完整的服务器相对较短,看起来很短:>我们的第一行使用Node Express Framework设置服务器。这是一个相当简单的设置,正在吸引我们所有的依赖项,并为我们准备访问服务器功能的应用变量。端口设置了我们希望服务器运行的哪个端口(process.env.port是服务器变量,某些托管设置(例如Heroku)将定义)。
<span>var express = require('express'), </span> app <span>= express(), </span> server <span>= require('http').createServer(app), </span> port <span>= process.env.PORT || 80, </span> io <span>= require('socket.io')(server), </span> config <span>= require('./config.json'), </span> <span>Twitter = require('node-tweet-stream'), </span> t <span>= new Twitter(config); </span> app<span>.get('/', function(request<span>, response</span>) { </span> response<span>.sendFile(__dirname + '/public/index.html'); </span><span>}); </span> app<span>.get(<span>/<span>^(.+)$</span>/</span>, function(req<span>, res</span>) { </span> res<span>.sendFile(__dirname + '/public/' + req.params[0]); </span><span>}); </span> app<span>.use(function(err<span>, req, res, next</span>) { </span> <span>console.error(err.stack); </span> res<span>.status(500).send('Something broke!'); </span><span>}); </span> server<span>.listen(port, function() { </span> <span>console.log('Listening on ' + port); </span><span>}); </span> t<span>.track('pizza'); </span>t<span>.on('tweet', function(tweet){ </span> <span>console.log('Roger that. Tweets incoming!'); </span> <span>console.log(tweet); </span> io<span>.emit('tweet', tweet); </span><span>}); </span> t<span>.on('error', function (err) { </span> <span>console.log('Brace yourself! We are goin doooowwwwwwnnnnnnnn! ', err); </span><span>});</span>然后,我们设置IO变量,同时启动我们的socket.io服务器功能,将其附加到我们上面设置的Express Server上:
>设置Twitter访问
<span>var express = require('express'), </span> app <span>= express(), </span> server <span>= require('http').createServer(app), </span> port <span>= process.env.PORT || 80,</span>配置变量是将应用程序的Twitter身份验证键和访问令牌保留在自己的文件中的好方法。为了实时查看Twitter流,我们将使用一个名为Node-tweet-stream的NPM模块,该模块提供我们需要的所有功能。我们将Twitter访问的对象和所有关联功能分配给t变量,并传递我们的配置JSON,以证明我们可以访问它。
>
io <span>= require('socket.io')(server),</span>如果您没有任何访问Twitter API的Twitter键,请不要担心!您只需要在Twitter上注册一个应用程序即可。前往Twitter应用程序管理页面,使用您的Twitter凭据登录,然后单击“创建新应用”。
>拥有应用程序后,您可以通过单击将显示在应用程序管理页面上的“键和访问令牌”链接来获取键和访问令牌。如果找不到它,它将在以下网址:https://apps.twitter.com/app/0000000/keys(用您的应用程序ID替换0000000)。
然后,在与index.html相同的级别上创建一个名为config.json的文件。在其中,使用您自己的应用程序的值添加以下内容:
其他服务器基础知识
config <span>= require('./config.json'), </span><span>Twitter = require('node-tweet-stream'), </span>t <span>= new Twitter(config),</span>
>在我们的index.js文件中,我们将呼叫设置为服务器的根,以供load /public/index.html:
>我们还可以在服务器上的公共目录中提供任何其他静态文件:
<span>{ </span> <span>"consumer_key": "YOURKEY", </span> <span>"consumer_secret": "YOURKEYSECRET", </span> <span>"token": "YOURTOKEN", </span> <span>"token_secret": "YOURTOKENSECRET" </span><span>}</span>
如果我们确实有错误,我们会在服务器的控制台中记录该错误,然后返回500错误:
app<span>.get('/', function(request<span>, response</span>) { </span> response<span>.sendFile(__dirname + '/public/index.html'); </span><span>});</span>
以下几行启动我们的服务器运行,并以上面的所有设置运行。
>app<span>.get(<span>/<span>^(.+)$</span>/</span>, function(req<span>, res</span>) { </span> res<span>.sendFile(__dirname + '/public/' + req.params[0]); </span><span>});</span>
>检索我们的实时Twitter流
app<span>.use(function(err<span>, req, res, next</span>) { </span> <span>console.error(err.stack); </span> res<span>.status(500).send('Something broke!'); </span><span>});</span>>最后,我们设置了特定于Twitter的服务器功能。我们使用track()函数来指定我们要在不断扩展的Twitter内容流中跟踪哪个关键字。
然后,我们设置了一个回调函数,以便任何时候运行节点 - tweet-stream模块,都以该关键字显示一条推文。如果看到了一个,我们将其记录在服务器的控制台日志中(这是可选的,可以在您愿意的情况下删除),然后将其作为socket.io事件发出到任何连接的客户端。
>如果我们的Twitter API出于任何原因有错误,则将登录到我们的服务器日志:
server<span>.listen(port, function() { </span> <span>console.log('Listening on ' + port); </span><span>});</span>
>与所有节点应用一样,我们的所有服务器依赖性和详细信息都存储在package.json中。如果您是node.js的新手,则可能需要对所有内容的含义进行一些阅读:package.json。
我们的前端代码
>我们的前端代码以Google Cardboard和Thrim.js文章的“ Bringing VR到Web”的相同设置开头 - 我们通过立体镜面效果显示的三个.js场景,使我们的场景成为VR视图。为了保持这一简短而甜美,我不会涵盖与该文章以前的演示相同的位。如果您不确定我在这里没有解释的任何内容,请查看以前的文章以获取信息。
>设置socket.io
与以前的基础相比,我们将添加的唯一新JS文件是我们的socket.io javascript文件。这是一个简单的衬里:为了从socket.io访问功能,我们需要的只是将该功能分配给io变量,因为您会在我们的index.html文件中看到一些进一步的功能:
<span>var express = require('express'), </span> app <span>= express(), </span> server <span>= require('http').createServer(app), </span> port <span>= process.env.PORT || 80, </span> io <span>= require('socket.io')(server), </span> config <span>= require('./config.json'), </span> <span>Twitter = require('node-tweet-stream'), </span> t <span>= new Twitter(config); </span> app<span>.get('/', function(request<span>, response</span>) { </span> response<span>.sendFile(__dirname + '/public/index.html'); </span><span>}); </span> app<span>.get(<span>/<span>^(.+)$</span>/</span>, function(req<span>, res</span>) { </span> res<span>.sendFile(__dirname + '/public/' + req.params[0]); </span><span>}); </span> app<span>.use(function(err<span>, req, res, next</span>) { </span> <span>console.error(err.stack); </span> res<span>.status(500).send('Something broke!'); </span><span>}); </span> server<span>.listen(port, function() { </span> <span>console.log('Listening on ' + port); </span><span>}); </span> t<span>.track('pizza'); </span>t<span>.on('tweet', function(tweet){ </span> <span>console.log('Roger that. Tweets incoming!'); </span> <span>console.log(tweet); </span> io<span>.emit('tweet', tweet); </span><span>}); </span> t<span>.on('error', function (err) { </span> <span>console.log('Brace yourself! We are goin doooowwwwwwnnnnnnnn! ', err); </span><span>});</span>>
准备我们的塔
<span>var express = require('express'), </span> app <span>= express(), </span> server <span>= require('http').createServer(app), </span> port <span>= process.env.PORT || 80,</span>然后,我们为“塔”设置变量(基本上是代表推文的垂直粒子集)。我们所有的塔都存储在一个称为TweetTowers的三个对象中。这是一个容器对象,可让我们跟踪所有塔:
明显和特定材料是我们的变量,它将代表我们的颗粒的外观:
MaxtowerCount是我们想在场景中可见的最大塔楼数量 - 如果设定太高,我们可能会获得懒惰的体验。我将其设置为6000,因为这将最大粒子设置为大约一百万。我认为一个合理的数字!
>io <span>= require('socket.io')(server),</span>
config <span>= require('./config.json'), </span><span>Twitter = require('node-tweet-stream'), </span>t <span>= new Twitter(config),</span>>范围是我们希望将这些塔放置在观众周围的区域的大小。这些塔将被放置在现场的随机位置,因此这将限制了它们的分开。我发现,与用户更接近他们,这是一个更好的体验。如果他们远离用户,看来没有那么多(尽管有成千上万的粒子!)。我将其设置为100:
<span>{ </span> <span>"consumer_key": "YOURKEY", </span> <span>"consumer_secret": "YOURKEYSECRET", </span> <span>"token": "YOURTOKEN", </span> <span>"token_secret": "YOURTOKENSECRET" </span><span>}</span>我们的init函数
>在我们的init()函数中没有太多新事物。它主要设置了我们的VR摄像机,并按照上一篇文章所述进行控制。新的位在末尾。
app<span>.get('/', function(request<span>, response</span>) { </span> response<span>.sendFile(__dirname + '/public/index.html'); </span><span>});</span>
>我们将明显的图像定义为一个称为粒子new.png的png,我们在公共文件夹中具有:
>我们通过将我们的TweetTowers容器添加到我们的场景中来完成INIT()函数。在我们的场景中,我们不必担心将任何塔直接添加到场景中,我们只会将它们直接添加到我们的TweetTowers对象中。
对推文做出反应
app<span>.get(<span>/<span>^(.+)$</span>/</span>, function(req<span>, res</span>) { </span> res<span>.sendFile(__dirname + '/public/' + req.params[0]); </span><span>});</span>
>您会记得,一旦我们的服务器找到了通过Twitter的Tweet通过我们的“披萨”流式传输的推文,它就会发出一个称为“ Tweet”的事件。我们的客户端JavaScript现在将注意该事件并响应: 响应代码是对称为generateTower()函数的调用,该函数将在我们的场景中添加塔,代表该推文。我们将其传递给四个值:
然后,我们迭代塔的大小以创建每个粒子。我们设置了当前的坐标,以使y的速度值乘以i。我们的x和z值仅在向上移动时就保持着起始位置。
为了在智能手机上进行测试,您要么需要确保智能手机在同一本地网络上并找到计算机的IP地址,要么使用Ngrok等隧道服务(我介绍了如何在文章中使用Ngrok从任何地方访问本地主机)
>我还在Sitepoint上还有其他使用类似概念的演示,而是将它们带入了增强的现实体验。如果您有兴趣,请使用JavaScript和Google Cardboard过滤现实,探索从您的智能手机中摄取的相机并将过滤器添加到它的相机,并在浏览器中增强现实,awe.js探索一路探索并通过将元素扩大到您的视野中。三分和敬畏的强大组合!
如果您确实承担了本文中从演示中进行自己的VR可视化的挑战(或将其与提到的AR示例中的元素结合在一起),请在评论中留下注释或与之联系我在Twitter上(@thatpatrickguy),我会拿出头戴式耳机,看看!
如何在node.js上使用three.js? >如何优化我的three.js应用程序的性能? ><span>var express = require('express'),
</span> app <span>= express(),
</span> server <span>= require('http').createServer(app),
</span> port <span>= process.env.PORT || 80,
</span> io <span>= require('socket.io')(server),
</span> config <span>= require('./config.json'),
</span> <span>Twitter = require('node-tweet-stream'),
</span> t <span>= new Twitter(config);
</span>
app<span>.get('/', function(request<span>, response</span>) {
</span> response<span>.sendFile(__dirname + '/public/index.html');
</span><span>});
</span>
app<span>.get(<span>/<span>^(.+)$</span>/</span>, function(req<span>, res</span>) {
</span> res<span>.sendFile(__dirname + '/public/' + req.params[0]);
</span><span>});
</span>
app<span>.use(function(err<span>, req, res, next</span>) {
</span> <span>console.error(err.stack);
</span> res<span>.status(500).send('Something broke!');
</span><span>});
</span>
server<span>.listen(port, function() {
</span> <span>console.log('Listening on ' + port);
</span><span>});
</span>
t<span>.track('pizza');
</span>t<span>.on('tweet', function(tweet){
</span> <span>console.log('Roger that. Tweets incoming!');
</span> <span>console.log(tweet);
</span>
io<span>.emit('tweet', tweet);
</span><span>});
</span>
t<span>.on('error', function (err) {
</span> <span>console.log('Brace yourself! We are goin doooowwwwwwnnnnnnnn! ', err);
</span><span>});</span>
<span>var express = require('express'),
</span> app <span>= express(),
</span> server <span>= require('http').createServer(app),
</span> port <span>= process.env.PORT || 80,</span>
>我们的generateTeTower()函数本身首先定义高层变量。这是一个三个几何对象,它将包含塔中我们所有颗粒的位置。将跟踪的所有点保持在一个几何对象中可以帮助保持处理时间的降低,因为三个。JS只需要跟踪每个塔对象及其点,而不是一系列独立的粒子。在代码的稍后,我们将提供几何形状,以将这些点解释到我们的粒子中的三个。
然后,我们设置了一个称为颗粒的JavaScript对象,该对象存储了我们的粒子将在塔中启动和完成的位置,以及它们的相距多远(我们之前通过的值):
>
io <span>= require('socket.io')(server),</span>
:
config <span>= require('./config.json'),
</span><span>Twitter = require('node-tweet-stream'),
</span>t <span>= new Twitter(config),</span>
>在为该粒子定义的那些坐标中,我们将粒子的位置连接为高层测定对象中的顶点:
<span>var express = require('express'),
</span> app <span>= express(),
</span> server <span>= require('http').createServer(app),
</span> port <span>= process.env.PORT || 80,
</span> io <span>= require('socket.io')(server),
</span> config <span>= require('./config.json'),
</span> <span>Twitter = require('node-tweet-stream'),
</span> t <span>= new Twitter(config);
</span>
app<span>.get('/', function(request<span>, response</span>) {
</span> response<span>.sendFile(__dirname + '/public/index.html');
</span><span>});
</span>
app<span>.get(<span>/<span>^(.+)$</span>/</span>, function(req<span>, res</span>) {
</span> res<span>.sendFile(__dirname + '/public/' + req.params[0]);
</span><span>});
</span>
app<span>.use(function(err<span>, req, res, next</span>) {
</span> <span>console.error(err.stack);
</span> res<span>.status(500).send('Something broke!');
</span><span>});
</span>
server<span>.listen(port, function() {
</span> <span>console.log('Listening on ' + port);
</span><span>});
</span>
t<span>.track('pizza');
</span>t<span>.on('tweet', function(tweet){
</span> <span>console.log('Roger that. Tweets incoming!');
</span> <span>console.log(tweet);
</span>
io<span>.emit('tweet', tweet);
</span><span>});
</span>
t<span>.on('error', function (err) {
</span> <span>console.log('Brace yourself! We are goin doooowwwwwwnnnnnnnn! ', err);
</span><span>});</span>
确保我们对粒子的定位的设置的设置正确。接下来,我们定义该塔中的颗粒在颗粒变量中的外观。我们的粒子将被放置在三个点云对象中,因此将其造型,我们将使用三个coptcloudmaterial材料:<span>var express = require('express'),
</span> app <span>= express(),
</span> server <span>= require('http').createServer(app),
</span> port <span>= process.env.PORT || 80,</span>
MAP定义了我们将用于粒子的图像,我们通过了前面定义的特定时间表。
颜色以我们希望粒子为颜色的颜色传递(默认为triph.js中的0xffffff)。
>要在本地运行此演示,您需要安装节点,并且需要运行通常的命令。安装项目的所有依赖项:io <span>= require('socket.io')(server),</span>
config <span>= require('./config.json'),
</span><span>Twitter = require('node-tweet-stream'),
</span>t <span>= new Twitter(config),</span>
>您也可以在某个地方托管节点服务器。我个人使用了Heroku,但这完全是个人的偏好。>
>将服务器设置在某个地方并运行后,打开Chrome以供移动设备访问!戴上您的Google纸板或其他类似耳机,您应该看到一种经历,如果您抬头看,则在半分钟左右后看起来像这样:<span>{
</span> <span>"consumer_key": "YOURKEY",
</span> <span>"consumer_secret": "YOURKEYSECRET",
</span> <span>"token": "YOURTOKEN",
</span> <span>"token_secret": "YOURTOKENSECRET"
</span><span>}</span>
结论app<span>.get('/', function(request<span>, response</span>) {
</span> response<span>.sendFile(__dirname + '/public/index.html');
</span><span>});</span>
>
我如何为网站设置Twitter?>为网站设置Twitter涉及几个步骤。首先,您需要在Twitter开发人员的网站上创建一个Twitter应用程序。创建应用程序后,您将收到一组键和令牌。这些用于用Twitter来验证您的应用程序。然后,您需要在网站上安装Twitter JavaScript API。此API允许您的网站与Twitter进行交互,从而启用了诸如Tweet按钮和嵌入式推文之类的功能。 three.js是跨浏览器用于在Web浏览器中创建和显示动画3D计算机图形的JavaScript库。它使用WebGL渲染图形。该库提供了一组对象和方法,使创建复杂的3D场景变得更容易,包括相机,灯光,材料和几何形状。
> three.js是一个高级库,为创建3D图形提供了简单的API。它抽象了直接与WebGL合作的许多复杂性,从而更容易创建复杂的3D场景。其他库可能会提供对WebGL的更低级访问权限,但需要更深入地了解3D图形编程。 Twitter流,出于多种原因可能发生错误,例如网络问题或不正确的身份验证凭证。 Twitter API提供的错误消息可以帮助您诊断和解决这些问题。处理代码中的这些错误很重要,以确保您的应用程序继续顺利运行。
>
>我如何自定义在VR?
以上是用三个和节点在VR中可视化Twitter流的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

因此,在这里,您准备好了解所有称为Ajax的东西。但是,到底是什么? AJAX一词是指用于创建动态,交互式Web内容的一系列宽松的技术。 Ajax一词,最初由Jesse J创造

10款趣味横生的jQuery游戏插件,让您的网站更具吸引力,提升用户粘性!虽然Flash仍然是开发休闲网页游戏的最佳软件,但jQuery也能创造出令人惊喜的效果,虽然无法与纯动作Flash游戏媲美,但在某些情况下,您也能在浏览器中获得意想不到的乐趣。 jQuery井字棋游戏 游戏编程的“Hello world”,现在有了jQuery版本。 源码 jQuery疯狂填词游戏 这是一个填空游戏,由于不知道单词的上下文,可能会产生一些古怪的结果。 源码 jQuery扫雷游戏

本教程演示了如何使用jQuery创建迷人的视差背景效果。 我们将构建一个带有分层图像的标题横幅,从而创造出令人惊叹的视觉深度。 更新的插件可与JQuery 1.6.4及更高版本一起使用。 下载

本文演示了如何使用jQuery和ajax自动每5秒自动刷新DIV的内容。 该示例从RSS提要中获取并显示了最新的博客文章以及最后的刷新时间戳。 加载图像是选择

Matter.js是一个用JavaScript编写的2D刚体物理引擎。此库可以帮助您轻松地在浏览器中模拟2D物理。它提供了许多功能,例如创建刚体并为其分配质量、面积或密度等物理属性的能力。您还可以模拟不同类型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流浏览器。此外,它也适用于移动设备,因为它可以检测触摸并具有响应能力。所有这些功能都使其值得您投入时间学习如何使用该引擎,因为这样您就可以轻松创建基于物理的2D游戏或模拟。在本教程中,我将介绍此库的基础知识,包括其安装和用法,并提供一

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Dreamweaver Mac版
视觉化网页开发工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器