Deutsch
PHP, HTML & JavaScript- Forum

3D Grafik - WebGL mit three.js

 
- Seite 1 -



HofK
Auf einen heißen Tipp von IF hin, habe ich mir mal
three.js  [...]  angeschaut. Da  [...]  (ganz unten) die ersten Resultate.
 
31.01.2016  
 



 
- Seite 17 -



HofK
Noch ein Nachtrag oben ergänzt, man kommt kaum hinterher:
Wehende Fahne und Video (noisejs).
 
17.07.2018  
 




HofK
Schon wieder ein Nachtrag zur Linkliste mit den tollen Beispielen!

Zeichnen Drawing with THREE.LineDashedMaterial()
 
19.07.2018  
 




HofK
Ganz untätig war ich selbst nicht.

Auf eine Anfrage hin habe geschaut, wie man die Eingabe über das Mikrofon in eine 3D Reaktion umsetzen kann.

Da ich bei der Recherche kein Beispiel dafür gefunden habe, war wieder mal eine Frage bei discourse  [...]  fällig.

Aber ohne Erfolg.

Also doch selber basteln.

Die Seite  [...]  war das, was ich brauchte, allerdings ohne 3D. Die Aufnahme wird als wav gespeichert. Funktioniert lokal mit Firefox!

Nach einigen Fehlversuchen habe ich nun ein Basisbeispiel. Die Eingabe wird in einfache Rotation umgewandelt und die Daten werden angezeigt. Auf dieser Basis kann man nun kreativ werden.

Was noch fehlt, ist die Umwandlung in mp3. Das läßt sich zwar extern machen, aber gleich im Browser wäre noch besser.

Die zip Datei entpacken und index.html mit Firefox öffnen . Natürlich muss man dann das Mikrofon freigeben. Funktioniert mit PC, Tablet und Handy.

03_audio.zip Herunterladen

.... ----

Mit Firefox auspropbieren bei threejs.hofk.de, direkt unter  [...] 

235 kB
Hochgeladen:19.07.2018
Ladeanzahl69
Herunterladen
 
19.07.2018  
 




HofK
Weiterer Nachtrag zur Linkliste mit den tollen Beispielen!
Bewegtes Gitter
 
23.07.2018  
 




HofK
Noch eine interessante Sache vom discourse.threejs.org Moderator looeee.

Eine verschiebbare Teilung der Seite, wobei in jedem Teil eine extra three.js Scene gerendert wird. [...]  - Demo und Code auf codepen:  [...] 



Habe ich mir natürlich auch gleich lokal gespeichert und getestet. Die einfachen Szenen kann man beliebig komplex selbst gestalten. 
 
08.08.2018  
 




HofK
Beim Schauraum geht es jetzt auch etwas weiter.

Anfangs hatte ich die Design-Daten für den Raum in Textfeldern eingegeben. Das ist zwar praktisch für schnelles testen, aber bei dem inzwischen stark gewachsenem Umfang an Daten nicht mehr praktikabel.
Für die finale Variante werden die Daten deshalb in einer halbwegs übersichtlichen aber knappen Form in einer JavaScript-Datei showroomDesign.js gespeichert.
Diese kann als reine Textdatei einfach editiert werden und nach Aktualisierung der html-Seite ist das Ergebnis sofort sichtbar.

Das Projektverzeichnis enthält Ordner mit den Grafiken für die Oberflächen (textures), den Ausstellungsstücken, Modellen (exhibits), der Umgebung (CubeMap), Symbolgrafiken für die Steuerung des Besuchers per circleControl, (ccimg) und die nötigen System-JavaScrips (js).

Die fünf eigentlichen Projektdateien sind derzeit bei der Entwicklung alle noch im Projektverzeichnis vereint.



Die Datei showroomDesign.js ist noch nicht ganz fertig/ noch in Bearbeitung.
Man kann aber die innere Logik erkennen.

Geometrie und Material müssen getrennt eingegeben werden, eine Zusammenlegung wird unübersichtlich. Bei der Trennung hilft eine Nummerierung die Zusammengehörigkeit zu überschauen.

Am Beispiel der runden Wände:

roundWallsArray = [

// round walls / runde Wände:
// x,z, y0 lower niveau / unteres Niveau, y1 upper niveau / oberes Niveau,
//rx radius ,rz radius, radius segments, start angle / Startwinkel, angle / Winkel
[ 2,2, 0,3.5, 2,2, 12, 3.14,1.57 ], //01
[ 0,4.5, 0,3.5, 2.5,2.5, 12, 3.14,3.14 ] //02

];


roundWallsMaterialArray = [

[ 'Textur', 'uvgrid01.png', doubleSide ], //01
[ 'Textur', 'uvgrid01.png', doubleSide ], //02

];

Die umschließenden Hauptfelder dürfen derzeit noch nicht verändert werden. Allerdings kann man sie leer lassen, wenn man hier z.B. keine runden Wände benötigt. Natürlich kann man weitere Teilfelder (hier für weitere runde Wände) einfügen

(Die Möglichkeit der kompletten Entfernung wird noch eingearbeitet!) 

Wenn man sich eine Zeichnung vom Raum macht, ist der Eintrag der Werte recht einfach zu bewerkstelligen.

// ----------- SHOWROOM DESIGN ---------------------------

// en / de
// ground plan / Grundriss
plans = [
// Points Ground plan lines counter-clockwise / Punkte Grundrisslinien gegen Uhrzeigersinn:
// x, z, y0 floor height /Bodenhöhe, y1 ceiling height/ Deckenhöhe, ...
[ 0,7, 0,3.5, 9,7, 0,3.5, 9,0, 0,3.5, 0,0, 0,3.5 ], // 01 main room / Hauptraum
[ -2.5,7, 0,3.5, 0,7, 0,3.5, 0,2, 0,3.5, -2.5,2, 0,3.5 ], // 02 oriel, round wall / Erker, Wand rund
[ 9,6, 0.2,3.5, 11,5, 0.2,3.5, 11,2, 0.2,3.5, 9,1, 0.2,3.5 ] // 03 oriel / Erker
];

// floor material / Bodenmaterial
floorsMaterial = [
// 'Textur', 'Grafikdatei', , ...Side, (optional wrap S.., wrap T.. , ... 'Basic' 'Phong' 'Lambert',
[ 'Textur', 'Granit.jpg', doubleSide ], // 01
[ 'Textur', 'Granit.jpg', doubleSide ], // 02
[ 'Textur', 'Granit.jpg', doubleSide ], // 03
];

// ceiling material / Deckenmaterial
ceilingsMaterial = [
// 'Textur', 'Grafikdatei', , ...Side, (optional wrap S.., wrap T.. , ... 'Basic' 'Phong' 'Lambert',
[ 'Textur', 'uvSpray.png', doubleSide ], // 01
[ 'Phong', 0xfeff55, doubleSide, smoothShading ], // 02
[ 'Phong', 0xfeff55, doubleSide, smoothShading ], // 03
];

plansUV = [

// main room / Hauptraum ( Textur 9:7 )
[], // auto uv's: [] , otherwise / sonst [ 0,0, 1,0, 1,1, 0,1 ],
// according to the circulation of the floor plan line / entsprechend Umlauf der Grundrisslinie

// oriel, round wall / Erker, Wand rund
[ 0,0, 0.25,0, 0.25,1, 0,1 ],

// oriel
[ 0,0.143, 0.22,0.286, 0.22,0.714, 0,0.857 ]
];

walls = [
// main room, usually without thickness, only visible from the inside, counterclockwise /
// Hauptraum, meist ohne Dicke, nur von innen sichtbar, gegen Uhrzeigersinn
// x0,z0, y00 lower niveau / unteres Niveau, y01 upper niveau / oberes Niveau , x1,z1, y10,y11, (optional: thickness / Dicke)
[ 0,7, 0,3.5, 9,7, 0,3.5 ], //01
[ 9,7, 0,3.5, 9,6, 0,3.5 ], //02
[ 9,6, 0,0.2, 9,1, 0,0.2 ], //03
[ 9,1, 0,3.5, 9,0, 0,3.5 ], //04
[ 9,0, 0,3.5, 3.2,0, 0,3.5, 0.5], //05 ->(0.5 thick / dick)
[ 3.2,0, 2.1,3.5, 2,0, 2.1,3.5 ], //06
// oriel / Erker
[ 9,6, 0.2,3.5, 11,5, 0.2,3.5 ], //07
[ 11,5, 2.6,3.5, 11,2, 2.6,3.5], //08
[ 11,2, 0.2,3.5, 9,1, 0.2,3.5 ], //09
// imagery / Bilder
[ 6,0.26, 1.3,2.8, 4,0.26, 1.3,2.8 ], //10

// Interior walls, partition walls, structural components, blockings, platforms: .. + thickness /
// Innenwände, Trennwände, Strukturbauteile, Aufblockungen, Podeste: .. , + Dicke
// [ with 6 materials each! / mit je 6 Materialien! ]
[ 0.4,5.5, 0,0.8, 1.1,5.7, 0.1,0.6, 0.6 ], //11
[ 0.2,7.0, 0.7,1.1, 1.6,5.0, 0.8,1.1, 0.7 ], //12
[ 8.0,7.5, 0.0,0.7, 8.1,7.9, 0.0,0.7, 0.1 ] //13

];

wallsMaterial = [
// 'Textur', 'graphic file / Grafikdatei', ..Side, ( optional: wrap S, wrap T)
// 'Video'
// 'Basic' 'Phong' 'Lambert', color, ..Side, ..Shading
['Textur', 'uvgrid01.png', doubleSide ], //01
['Phong', 0x886600, doubleSide, smoothShading ], //02
['Lambert', 0x222233, doubleSide, smoothShading ], //03
['Phong', 0x222233, doubleSide, flatShading ], //04

[ //05

['Video', 'sintel.xxx', backSide, 'autoplay', 'loop' ], // noch Datei und Eigenschaften zu nutzen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,
[ 'Textur', 'Fliese02.png', doubleSide, 27, 21 ],
[ 'Basic', 0x886600, doubleSide, flatShading ],
[ 'Basic', 0x678901, doubleSide, flatShading ],
[ 'Basic', 0x0000bb, doubleSide, flatShading ],
[ 'Basic', 0xaa00aa, doubleSide, flatShading ],

],

['Textur', 'Fliese01.png', doubleSide, 6, 15 ], //06
['Lambert', 0xeeffaa, doubleSide, flatShading ], //07
['Basic', 0xabcdef, doubleSide, smoothShading ], //08
['Basic', 0x886600, doubleSide, smoothShading ], //09

['Textur', 'QueenOfNight.png', doubleSide ], //10
[ //11 // 6 materials in the array / Materialien im Feld

[ 'Textur', 'uvgrid01.png', doubleSide ],
[ 'Textur', 'Fliese02.png', doubleSide, 27, 21 ],
[ 'Basic', 0x886600, doubleSide, flatShading ],
[ 'Basic', 0x678901, doubleSide, flatShading ],
[ 'Basic', 0x0000bb, doubleSide, flatShading ],
[ 'Basic', 0xaa00aa, doubleSide, flatShading ],

],
[ //12 // 6 materials in the array / Materialien im Feld

[ 'Textur', 'uvgrid01.png', doubleSide ],
[ 'Textur', 'Fliese02.png', doubleSide, 27, 21 ],
[ 'Basic', 0x886600, doubleSide, flatShading ],
[ 'Basic', 0x678901, doubleSide, flatShading ],
[ 'Basic', 0x0000bb, doubleSide, flatShading ],
[ 'Basic', 0xaa00aa, doubleSide, flatShading ],

],
[ //13 // 6 materials in the array / Materialien im Feld

[ 'Textur', 'uvgrid01.png', doubleSide ],
[ 'Textur', 'Fliese02.png', doubleSide, 27, 21 ],
[ 'Basic', 0x886600, doubleSide, flatShading ],
[ 'Basic', 0x678901, doubleSide, flatShading ],
[ 'Basic', 0x0000bb, doubleSide, flatShading ],
[ 'Basic', 0xaa00aa, doubleSide, flatShading ],

],

];

archways = [
// archways / Torboegen: x0,z0, x1,z1, y0 lower niveau / unteres Niveau, y1 upper niveau / oberes Niveau, thickness / Dicke
// [ with 3 materials each! / mit je 3 Materialien! ]
[ 5,1.6, 6.5,1.6, 0,2.2, 0.3 ] // 01
];

archwaysMaterial = [

[ // 01 [ 3 materials in the array / Materialien im Feld ]
[ 'Textur', 'uvgrid01.png', doubleSide ],
[ 'Basic', 0xff0000, doubleSide, smoothShading ],
[ 'Basic', 0x00ff00f, doubleSide, smoothShading ],
]

];

roundWalls = [

// round walls / runde Wände:
// x,z, y0 lower niveau / unteres Niveau, y1 upper niveau / oberes Niveau,
//rx radius ,rz radius, radius segments, start angle / Startwinkel, angle / Winkel
[ 2,2, 0,3.5, 2,2, 12, 3.14,1.57 ], //01
[ 0,4.5, 0,3.5, 2.5,2.5, 12, 3.14,3.14 ] //02

];

roundWallsMaterial = [

[ 'Textur', 'uvgrid01.png', doubleSide ], //01
[ 'Textur', 'uvgrid01.png', doubleSide ], //02

];

rounds = [
// round components / runde Bauteile: x,z, y0,y1, rx,rz, (Drehwinkel, Zuspitzung optional)
[ 7,2, 0,0.5, 0.5,0.7 , 0.785, 1.1 ] //01
];

roundsMaterial = [

[ // 01 // [ 3 Materialien ]
[ 'Phong', 0x8822dd, frontSide, flatShading ],
[ 'Textur', 'uvgrid01.png', doubleSide ],
[ 'Phong', 0x00ff00f, doubleSide, smoothShading ],
]

];

// Rahmenprofile für Rahmen: ...Shape (Querschnitt)
doorShape = [ 0,0, 0,0.05, 0.08,0.05, 0.08,0.03, 0.1,0.03, 0.1,0 ]; // Zarge
pictureShape = [ 0,0, 0.01,0.04, 0.07,0.04, 0.1,0 ]; // Bilder

frames = [
// Rahmen: Profil, x0,z0, y00,y01, x1,z1, y10,y11, optional geschlossen: 1
[ doorShape, 2,0, 0,2.1, 3.2,0, 0,2.1 ], //01
[ pictureShape, 3.91,0.25, 1.21,2.89, 6.09,0.25, 1.21,2.89, 1 ], //02
[ pictureShape, 6.15, 0.25, 0.3,3.45, 8.85,0.25, 0.3,3.45, 1 ], //03
];

framesMaterial = [

[ 'Phong', 0x4455ff, doubleSide, smoothShading ], //01
[ 'Lambert', 0x00ffff, doubleSide, smoothShading ], //02
[ 'Basic', 0x876543, doubleSide, smoothShading ], //03

];

visitorAreas = [
//Besucher, Rechtecke x0,z0, < x1,z1
[ -1.5, 3, 1.1, 6 ],
[ 1, 1, 8, 6 ],
[ 8, 2, 9, 5 ],
[ 9, 2.5, 10, 4.5 ]
];

// Spiegel

mirrors = [

// Spiegel: Typ, ...
// Typ 'wall': x0,z0, x1,z1, y0,y1, (optional: color)
// Typ 'polygon': Ecken, Radius, x,y,z-Position, x,y,z-Rotation, (optional: color)
[ 'wall', 6.225, 0.3, 8.75, 0.3, 0.4, 3.35 ],
[ 'polygon', 36, 1.6, 6, 1.8, 6.8888, -0.05, 3.1416, 0 ]

];


// Ausstellungsobjekte

exhibits = [
//Ausstellungsobjekte: 3D Format, Dateiname, x,y,z-Skalierung, x,y,z-Position, x,y,z-Rotation
[ 'json', 'flower', 0.01, 0.01, 0.01, 7, 0.0001, 3, 0, 0, 0 ],
//[ 'json', 'nefertiti', 0.1, 0.1, 0.1, 7, 1, 2, 0, 2.1, 0 ],
[ 'obj', 'flower', 0.01, 0.01, 0.01, 5.5, 0.0001, 3, 0, 0, 0 ] // dazu muss Datei flower.mtl (Material) vorhanden sein!
];


// Beleuchtung

lights = [
// Typ, Farbe
[ 'ambient', 0x444444 ],
// Typ, Farbe, Position x,y,z
[ 'point', 0xffdddd, 4, 3.4, 3 ],
]

// Umgebung:

// Textur: 6 Texturen in Reihenfolge +x,-x,+y,-y,+z,-z
//var surroundingTextur = [ 'CubeMap/', 'posx.png', 'negx.png', 'posy.png', 'negy.png', 'posz.png', 'negz.png'];
surroundingTextur = [ 'posx.jpg', 'negx.jpg', 'posy.jpg', 'negy.jpg', 'posz.jpg', 'negz.jpg'];

// Groesse, x,y,z-Position
surrounding = [ 80, 10, -0.5, -20 ];

// -------------- end of showroom design --------------------

Update 12.08. Die Endung ...Array = ... bei allen Design-Datenfeldern war nur bei der Entwicklung hilfreich. Fällt nun weg. Also statt vorher plansArray nun plans!

Wer Spaß daran hat, kann mir ja eine veränderte Datei zukommen lassen. Eventuell mit anderen Texturen. Wäre interessant, was dabei herauskommt.
 
Was meine Testdatei im Rundgang ergibt, werde ich mal als Video aufnehmen und dann auf meine Seite bringen.
 
11.08.2018  
 




HofK
Der Rundgang durch den "bunten" und etwas chaotischen Testraum ist ab sofort und für die nächste Zeit als Video auf  [...]  zu sehen.

 
12.08.2018  
 




HofK
Bisher wurden die Wände automatisch mit uv Mapping versorgt.
Der Nachteil ist, dass man für jede Wand eine von der Größe her passende Textur haben muss. Auch wenn in einer realen Wand ein Fenster ist, müssen hier vier Wände erstellt werden (links, rechts, unter ,über dem Fenster) und man braucht vier zueinander passende Texturen.

Jetzt kann man bei Bedarf die uv Werte selbst angeben und so aus einer großen Textur den passenden Bereich "herausschneiden".



Ein leeres Datenfeld   wird derart interpretiert, dass auto UV's erzeugt werden. Das entspricht [ 0,0, 0,1, 1,0, 1,1 ]. Die leeren eckigen Klammern sind als Platzhalter erforderlich. Am Ende können sie weggelassen werden.

Man kann erkennen, dass bei einigen Wänden Ausschnitte aus der Test-Textur benutzt werden.

 
13.08.2018  
 




HofK
Die Bewegung des Besuchers im Schauraum erscheint mir etwas ruckelig. Im Video wird das noch deutlicher hervorgehoben.

Es gibt da eine Bibliothek tween.js, die weiche Bewegungsabläufe ermöglicht und häufig mit three.js zusammen benutzt wird.
Anleitung:  [...] 
Quellcode:  [...] 

Die verschiedenen Varianten (bei 'easing') kann man dort ausprobieren.  [...] 

Ich habe das mal mit einem sehr einfachen Beispiel getestet. Auf threejs.hofk.de ist es dort  [...]  zu finden.



Es gibt noch eine kommerzielle Variante TweenLite  [...]  , die aber für private Nutzung und wenn ich es richtig verstanden habe für Projekte die nur einmal verkauft werden (Auftragsprojekt, spezielle Anwendung) kostenfrei ist. Nur bei mehrfach zu verkaufenden Anwendungen fallen Lizenzgebühren an.
.........................

Wenn ich das für meine Kamerasteuerung benutzen will, komme ich nicht umhin, diese völlig neu zu konzipieren. Einfaches "einbauen" geht nicht, da der Ansatz ein völlig anderer ist. 
 
15.08.2018  
 




HofK
Weiter oben hatte ich eine interessante Sache ( 2 Szenen verschiebbar) vom discourse.threejs.org Moderator looeee vorgestellt.

Der Moderator Mugen87 ist ständig aktiv und hat auf fast alle Fragen schnell eine super Antwort. Oft mit sehr guten Beispielen, die es leicht machen, die Sache umzusetzen. Schaut man bei github nach three.js oder in den Quellcode der Bibliothek wird klar, woher dieser Überblick kommt. Mugen87 taucht an sehr vielen Stellen als Autor/ Mitautor auf!

Diese beiden Dinge habe ich mir notiert, lokal gespeichert und ausprobiert, da ich sie eventuell bald gebrauchen kann:

Skycube as background [...]  jsfiddle  [...] 



....................................

Connection between 3D Point and 2D Point [...]  jsfiddle  [...] 

 
16.08.2018  
 




HofK
Bei discourse.threejs.org ist wieder eine interessante Sache gepostet worden.

3D grid of lines  [...] 

Demo und Code:  [...] 

 
21.08.2018  
 




HofK
Spiegel habe ich bereits in meinen Schauraum eingebaut.

Dank Mugen87 gibt es nun eine erweiterte Variante mit abklingender Spiegelung. [...] 
- Demo und Code:  [...] 

Dazu wurde die Definition des Spiegels von ihm erweitert. Man bindet diese Version einfach als Script ein, z.B. habe ich das in meiner Kopie so gemacht:
<script src="three.min.95.js"></script>
<script src="OrbitControls.js"></script>
<script src="enhancedReflector.js"></script> <!-- @author Mugen87 -->



Die Nutzung ist sehr übersichtlich (aus dem jsfiddle kopiert) :
 
24.08.2018  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

332.856 Betrachtungen

Unbenanntvor 0 min.
HofK vor 23 Tagen
Rschnett24.08.2024
Michael W.28.03.2024
Thomas Zielinski17.02.2024
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie