>我以前已经讨论过在SitePoint文章中开发虚拟现实网络体验的所有基础知识,将VR带到网络上使用Google Cardboard和Thrive.js,因此,如果您是整个想法的新手,请先阅读该一个,然后再阅读一个,然后出现。后退。该演示使用相同的基础。
>我们将要构建的演示将观看现场Twitter流以获取关键字。当一个人在观看溪流时发推文时,它将带来一个闪亮的颗粒的“塔”,代表了推文的时间。特别是该演示将寻找“披萨”一词。你为什么要披萨?我正在寻找一个不像“ Bieber”那样频繁提及的术语,而是“ Boxcar Racing Hyenas”更频繁。简而言之,最好的术语是相对频繁的术语,在您正在观看时会出现它们,但并不是那么频繁,以至于它们每秒几百次。披萨是其中之一。
钥匙要点
我们将首先查看我们的节点服务器代码。它将显示我们的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>
>我们还可以在服务器上的公共目录中提供任何其他静态文件:
<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内容流中跟踪哪个关键字。
>如果我们的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访问功能,我们需要的只是将该功能分配给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>
>我们通过将我们的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中文网其他相关文章!