用三个和节点在VR中可视化Twitter流
>我以前已经讨论过在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>
>设置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>
>
io <span>= require('socket.io')(server),</span>
>拥有应用程序后,您可以通过单击将显示在应用程序管理页面上的“键和访问令牌”链接来获取键和访问令牌。如果找不到它,它将在以下网址: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>
然后,我们设置了一个回调函数,以便任何时候运行节点 - 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>
明显和特定材料是我们的变量,它将代表我们的颗粒的外观:
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>
<span>{ </span> <span>"consumer_key": "YOURKEY", </span> <span>"consumer_secret": "YOURKEYSECRET", </span> <span>"token": "YOURTOKEN", </span> <span>"token_secret": "YOURTOKENSECRET" </span><span>}</span>
>在我们的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>
<span>var express = require('express'),
</span> app <span>= express(),
</span> server <span>= require('http').createServer(app),
</span> port <span>= process.env.PORT || 80,</span>
颜色以我们希望粒子为颜色的颜色传递(默认为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>
>
>将服务器设置在某个地方并运行后,打开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中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...
