Heim >Web-Frontend >js-Tutorial >Visualisieren eines Twitter -Streams in VR mit drei.js und Knoten
Twitter ist ein wunderbares und Information Rich Beast. Ich wollte einige der Visualisierungskräfte, drei.Js und seine VR -Funktionen mit Socket.io und Knoten kombinieren, um eine hübsche Welt von Partikeln zu erzeugen, die über einen Twitter -Stream erzeugt werden.
Ein zurück. Diese Demo verwendet die gleichen Grundlagen.Die Demo, die wir erstellen werden, wird einen Live -Twitter -Stream für ein Keyword ansehen. Wenn man während der Beobachtung des Streams getwittert wird, wird ein „Turm“ glänzender Partikel angezeigt, die darstellen, wie lange der Tweet war. Insbesondere diese Demo wird nach Erwähnungen des Wortes „Pizza“ suchen. Warum Pizza fragst du? Ich suchte nach einem Begriff, der nicht so häufig als „Bieber“, sondern häufiger als „Boxcar Racing Hyänen“ erwähnt wurde. Kurz gesagt, die besten Begriffe sind diejenigen, die relativ häufig genug sind, dass sie auftreten, während Sie zuschauen, aber nicht so häufig, dass sie mit vielen Hundert pro Sekunde durchkommen. Pizza ist einer von ihnen.
Key Takeaways
Möchten Sie es in Aktion versuchen? Ich habe hier eine laufende Version gehostet: VR Twitter World.
unser Servercode
Der vollständige Server ist relativ kurz und sieht so aus:
Unsere ersten Zeilen haben einen Server mit dem Knoten Express -Framework eingerichtet. Es ist eine ziemlich einfache Einrichtung, die alle unsere Abhängigkeiten anzieht und die App -Variable vorbereitet, damit wir auf unsere Serverfunktionen zugreifen können. Port wird eingerichtet, auf welchem Port unser Server ausgeführt werden soll (Prozess.Env.Port ist eine Servervariable Einige Hosting -Setups wie Heroku haben definiert).
<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> 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>
Dann richten wir die IO -Variable ein, während wir gleichzeitig unsere Funktionalität des Socket.IO -Servers starten und sie an den oben eingerichteten Expressserver anhängen:
<span>var express = require('express'), </span> app <span>= express(), </span> server <span>= require('http').createServer(app), </span> port <span>= process.env.PORT || 80,</span>
Die Konfigurationsvariable ist eine gute Möglichkeit, die Twitter -Authentifizierungsschlüssel der Anwendung in ihrer eigenen Datei zu halten. Um den Twitter-Stream anzeigen zu können, werden wir ein NPM-Modul namens Node-Tweet-Stream verwenden, das alle Funktionen bietet, die wir benötigen. Wir weisen das Objekt für unseren Twitter -Zugriff und alle zugehörigen Funktionen der T -Variablen zu und geben in unserem Konfigurations -JSON weiter, um zu beweisen, dass wir darauf zugreifen dürfen.
io <span>= require('socket.io')(server),</span>
Wenn Sie keine Twitter -Schlüssel für den Zugriff auf die Twitter -API haben, fürchten Sie sich nie! Sie müssen nur eine App mit Twitter registrieren. Gehen Sie zur Seite "Twitter Application Management", melden Sie sich mit Ihren Twitter -Anmeldeinformationen an und klicken Sie dann auf "Neue App erstellen".
Sobald Sie eine App haben, können Sie Ihre Schlüssel und Zugriff auf Token erhalten, indem Sie auf den Link "Tasten und Zugriff auf Tokens zugreifen" klicken, die auf der Verwaltungsseite Ihrer App angezeigt werden. Wenn Sie es nicht finden können, befindet sich es an der URL von: https://apps.twitter.com/app/0000000/keys (Ersetzen von 0000000 durch die ID Ihrer App).
Erstellen Sie dann eine Datei auf derselben Ebene wie index.html namens config.json. Fügen Sie darin Folgendes mit den Werten Ihrer eigenen App hinzu:
config <span>= require('./config.json'), </span><span>Twitter = require('node-tweet-stream'), </span>t <span>= new Twitter(config),</span>
Weiter in unserer Index.js -Datei richten wir Aufrufe an das Stammverschluss unseres Servers ein, um /public/index.html:
zu laden<span>{ </span> <span>"consumer_key": "YOURKEY", </span> <span>"consumer_secret": "YOURKEYSECRET", </span> <span>"token": "YOURTOKEN", </span> <span>"token_secret": "YOURTOKENSECRET" </span><span>}</span>
Wir haben auch alle anderen statischen Dateien innerhalb des öffentlichen Verzeichnisses auf unserem Server aufgestellt:
app<span>.get('/', function(request<span>, response</span>) { </span> response<span>.sendFile(__dirname + '/public/index.html'); </span><span>});</span>
Wenn wir einen Fehler haben, protokollieren wir diesen Fehler in der Konsole unseres Servers und geben einen 500 -Fehler zurück:
app<span>.get(<span>/<span>^(.+)$</span>/</span>, function(req<span>, res</span>) { </span> res<span>.sendFile(__dirname + '/public/' + req.params[0]); </span><span>});</span>
Die folgenden Zeilen starten unseren Server mit allen obigen Einstellungen.
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>
Schließlich richten wir unsere Twitter -spezifische Serverfunktionen ein. Wir verwenden die Funktion Track (), um anzugeben, welches Schlüsselwort wir im immer erweiterten Twitter -Inhaltsstream verfolgen möchten.
server<span>.listen(port, function() { </span> <span>console.log('Listening on ' + port); </span><span>});</span>
Wir haben dann eine Rückruffunktion eingerichtet, die jederzeit ausgeführt werden soll, wenn das Node-Tweet-Stream-Modul einen Tweet mit diesem Schlüsselwort entdeckt. Wenn es eines sieht, protokollieren wir es in dem Konsolenprotokoll unseres Servers (dies ist optional, Sie können dies entfernen, wenn Sie möchten) und geben diesen Tweet als Socket.io -Ereignis an verbundene Clients aus.
.t<span>.track('pizza');</span>
Wenn wir aus irgendeinem Grund einen Fehler mit unserer Twitter -API haben, wird sie an unseren Serverprotokollen angemeldet:
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>
Alle unsere Serverabhängigkeiten und -Details werden in package.json wie bei allen Knoten -Apps gespeichert. Wenn Sie Node.js neu sind, möchten Sie vielleicht ein wenig darüber nachlesen, was alles bedeutet: package.json.
Unser Front -End -Code beginnt mit dem gleichen Einrichten von der VR -VR mit Google Cardboard und Three.JS -Artikel - eine drei.js -Szene, die wir durch einen stereoskopischen Effekt anzeigen und unsere Szene in eine VR -Ansicht bringen. Um diese kurze und bündige und süße zu halten, werde ich die Teile nicht wie die vorherige Demo aus diesem Artikel abdecken. Wenn Sie sich nicht sicher sind, was ich hier nicht erkläre, überprüfen Sie diesen früheren Artikel, um Informationen zu erhalten.
Die einzige neue JS -Datei, die wir im Vergleich zu unserer vorherigen Stiftung hinzufügen werden, ist unsere JavaScript -Datei in Socket.io. Es ist ein einfacher Liner:
<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>
Um auf die Funktionalität von Socket.io zuzugreifen, müssen wir diese Funktionalität der IO -Variablen nur zuweisen, wie Sie in unserer Index.html -Datei etwas weiter unten sehen werden:
<span>var express = require('express'), </span> app <span>= express(), </span> server <span>= require('http').createServer(app), </span> port <span>= process.env.PORT || 80,</span>
wir haben dann Variablen für unsere „Türme“ eingerichtet (im Grunde unsere vertikalen Partikelsätze, die einen Tweet darstellen). Alle unsere Türme werden innerhalb eines Dreier -Objekts aufbewahrt, das als Tweettower namens Tweettowers genannt wird. Dies ist ein Containerobjekt, mit dem wir alle unsere Türme im Auge behalten können:
io <span>= require('socket.io')(server),</span>Particlexture und Partlematerial sind unsere Variablen, die darstellen, wie unsere Partikel aussehen:
config <span>= require('./config.json'), </span><span>Twitter = require('node-tweet-stream'), </span>t <span>= new Twitter(config),</span>
mAXTOWERCOUNT ist die maximale Anzahl von Türmen, die wir in unserer Szene sichtbar sein möchten. Wenn dies zu hoch ist, können wir ein verzögertes Erlebnis haben. Ich habe es auf 6000 gesetzt, da dies die maximalen Partikel auf etwa eine Million belegt. Eine vernünftige Nummer meiner Meinung nach!
<span>{ </span> <span>"consumer_key": "YOURKEY", </span> <span>"consumer_secret": "YOURKEYSECRET", </span> <span>"token": "YOURTOKEN", </span> <span>"token_secret": "YOURTOKENSECRET" </span><span>}</span>
Reichweite ist, wie groß ein Bereich um den Betrachter um den Zuschauer ist, dass diese Türme platziert werden. Die Türme werden an zufälligen Stellen in der Szene platziert, sodass dies so weit voneinander entfernt ist. Ich habe festgestellt, dass es eine schönere Erfahrung mit ihnen näher am Benutzer ist. Wenn sie weiter vom Benutzer entfernt sind, sieht es so aus, als gäbe es nicht so viele (obwohl es Tausende von Tausenden von Partikeln gibt!). Ich setze es auf 100:
app<span>.get('/', function(request<span>, response</span>) { </span> response<span>.sendFile(__dirname + '/public/index.html'); </span><span>});</span>
Es gibt nicht zu viel, was in unserer Init () -Funktion neu ist. Es richtet hauptsächlich unsere VR -Kamera und steuert, wie im vorherigen Artikel erläutert. Die neuen Bits sind am Ende.
Wir definieren unser Partikel-New-PNG, das wir in unserem öffentlichen Ordner haben:
app<span>.get(<span>/<span>^(.+)$</span>/</span>, function(req<span>, res</span>) { </span> res<span>.sendFile(__dirname + '/public/' + req.params[0]); </span><span>});</span>
Wir beenden die Init () -Funktion, indem wir unseren Tweettowers -Container zu unserer Szene hinzufügen. In dieser Szene müssen wir uns keine Sorgen machen, dass wir einen unserer Türme direkt in die Szene hinzufügen. Wir fügen sie einfach direkt in unser Tweettower -Objekt hinzu.
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>
Sie werden sich erinnern, dass unser Server, sobald unser Server Tweets mit unserem Keyword von "Pizza" über Twitter streamen, ein Ereignis namens "Tweet" ausgibt. Unser Client -Seite JavaScript wird nun auf dieses Ereignis achten und antworten:
<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>
Der Antwortcode ist ein Aufruf einer Funktion namens Generatetower (), mit der unsere Szene einen Turm hinzufügt, der diesen Tweet darstellt. Wir übergeben es vier Werte:
<span>var express = require('express'), </span> app <span>= express(), </span> server <span>= require('http').createServer(app), </span> port <span>= process.env.PORT || 80,</span>
Unsere generatetower () -Funktion selbst beginnt mit der Definition einer Tokusometrievariablen. Dies ist ein drei.Gerometrie -Objekt, das die Positionen aller unserer Partikel im Turm enthält. Wenn Sie alle Punkte innerhalb eines Geometrie -Objekts verfolgen, können die Verarbeitungszeiten niedrig bleiben, da drei.Js nur jedes Turmobjekt und seine Punkte und seine Punkte anstelle einer Reihe unabhängiger Partikel verfolgen müssen. Später im Code werden wir die Geometrie einem Dreier -Objekt bereitstellen, das diese Punkte in unsere Partikel interpretieren kann.
io <span>= require('socket.io')(server),</span>
Wir haben dann ein JavaScript -Objekt eingerichtet, das als Partlemovements bezeichnet wird und dort speichert, wo unsere Partikel im Turm beginnen und enden, und wie weit sie voneinander entfernt sind (die Werte, die wir früher übergeben haben):
config <span>= require('./config.json'), </span><span>Twitter = require('node-tweet-stream'), </span>t <span>= new Twitter(config),</span>
Die Variable der CurrentCoords verfolgt die letzte Position eines Teilchens innerhalb des Turms. Wir initialisieren es bei 0,0,0. Die Startkosten, in denen der Turm platziert wird, werden früher aus dem Funktionsaufruf analysiert. Wenn wir keine Startkoordinaten aus dem Funktionsaufruf haben, initialisieren wir sie so wie CurrentCoords:
<span>{ </span> <span>"consumer_key": "YOURKEY", </span> <span>"consumer_secret": "YOURKEYSECRET", </span> <span>"token": "YOURTOKEN", </span> <span>"token_secret": "YOURTOKENSECRET" </span><span>}</span>
Wir itererieren dann die Größe unseres Turms, um jedes Teilchen zu erzeugen. Wir haben die aktuellen Koordinaten festgelegt, damit y sich um unseren Geschwindigkeitswert multipliziert von i erhöht. Unsere X- und Z -Werte bleiben an ihren Startpunkten, da wir uns nur nach oben bewegen.
app<span>.get('/', function(request<span>, response</span>) { </span> response<span>.sendFile(__dirname + '/public/index.html'); </span><span>});</span>
Mit den für dieses Teilchen definierten Koordinaten befinden wir uns die Position dieses Partikels als Scheitelpunkt in unserem Towergeometrie-Objekt:
<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>
, das sicherstellt, dass unsere Positionierung der Partikel korrekt eingestellt ist. Als nächstes definieren wir, wie die Partikel in diesem Turm innerhalb der partellematerialischen Variablen aussehen werden. Unsere Partikel werden innerhalb eines Dreier -Objekts platziert. Um sie zu stylen, verwenden wir ein Drei.
<span>var express = require('express'), </span> app <span>= express(), </span> server <span>= require('http').createServer(app), </span> port <span>= process.env.PORT || 80,</span>
Wir fügen diesen Turm zu unserem Tweettower -Sammlungsobjekt hinzu und überprüfen dann, wie viele Türme in der Szene sind. Wenn wir mehr Türme als unser maximal erlaubt haben, verbergen wir die älteste, um die Last auf dem Gerät zu reduzieren. Wenn Sie Leistungsprobleme haben, sind sie wahrscheinlich etwas besser, wenn Sie den MaxtowerCount reduzieren!
io <span>= require('socket.io')(server),</span>
Ausführen unseres Codes
config <span>= require('./config.json'), </span><span>Twitter = require('node-tweet-stream'), </span>t <span>= new Twitter(config),</span>
Dann führen Sie es aus:
<span>{ </span> <span>"consumer_key": "YOURKEY", </span> <span>"consumer_secret": "YOURKEYSECRET", </span> <span>"token": "YOURTOKEN", </span> <span>"token_secret": "YOURTOKENSECRET" </span><span>}</span>
Um dies auf Ihrem Smartphone zu testen, müssen Sie entweder sicherstellen beim Zugriff auf Localhost von überall).
app<span>.get('/', function(request<span>, response</span>) { </span> response<span>.sendFile(__dirname + '/public/index.html'); </span><span>});</span>
Sie können den Knotenserver auch irgendwo hosten. Ich persönlich habe Heroku verwendet, aber dies ist eine völlig persönliche Präferenz.
Sobald Sie den Server irgendwo in Betrieb haben, öffnen Sie Chrome für Mobile und besuchen Sie ihn! Legen Sie Ihr Google -Karton oder ein anderes ähnliches Headset auf und Sie sollten eine Erfahrung sehen, die nach einer halben Minute oder so so aussieht, wenn Sie nachschlagen:
Schlussfolgerung
Ich habe auch andere Demos hier bei SitePoint, die ähnliche Konzepte verwenden, sie aber stattdessen in eine erweiterte Realitätserfahrung einfließen. Wenn Sie interessiert sind, filtern Sie die Realität mit JavaScript und Google Cardboard durch, um die Kamera von Ihrem Smartphone aus zu nehmen und Filter hinzuzufügen, und erweiterte die Realität im Browser mit AWE.js. Die immer kraftvolle Kombination von drei.js und Awe.js!
Wenn Sie sich die Herausforderung stellen, Ihre eigene VR -Visualisierung aus der Demo in diesem Artikel zusammenzustellen (oder sie mit Elementen aus den genannten AR -Beispielen zu kombinieren), hinterlassen Sie eine Notiz in den Kommentaren oder setzen Sie sich mit uns in Verbindung Ich auf Twitter (@thatpatrickguy), ich werde mein Headset herausholen und einen Blick darauf werfen!
Wie kann ich einen Twitter -Stream in VR? Zunächst müssen Sie mit der Twitter -API einen Twitter -Stream einrichten. Dies beinhaltet das Erstellen einer Twitter -Anwendung und die Authentifizierung mit Ihrem Twitter -Konto. Sobald der Stream eingerichtet ist, können Sie drei.js verwenden, um eine 3D -Visualisierung der Tweets zu erstellen. Dies beinhaltet das Erstellen einer 3D-Szene, das Hinzufügen von Objekten zur Darstellung von Tweets und das Aktualisieren der Szene in Echtzeit, wenn neue Tweets eintreffen.
Wie kann ich die Leistung meiner drei.js -Anwendung optimieren? eine Vielzahl von Techniken. Dazu gehört die Reduzierung der Komplexität Ihrer 3D -Modelle, die Optimierung Ihrer Texturen und die Minimierung der Anzahl der Ziehanrufe. Sie können auch Tools wie den drei.js -Inspektor verwenden, um die Leistung Ihrer Anwendung zu analysieren und Engpässe zu identifizieren. Das Erscheinen Ihres Twitter -Streams in VR durch Änderung der Eigenschaften der 3D -Objekte, die Tweets darstellen. Dies schließt Eigenschaften wie Farbe, Textur und Größe ein. Sie können auch verschiedene Arten von Lichtern und Kameras verwenden, um das Gesamtaussehen und das Gefühl der Szene zu ändern.
Das obige ist der detaillierte Inhalt vonVisualisieren eines Twitter -Streams in VR mit drei.js und Knoten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!