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 30 -



HofK
Alle Ecken der Dreiecke sind im Pufferfeld der Positionen gespeichert.
Somit kann man beliebige Längen berechnen, wenn man die benötigten Indizes hat.
g.indices = new Uint32Array( faceCount * 3 );
g.positions = new Float32Array( posCount * 3 );
//g.normals = new Float32Array( posCount * 3 );
g.setIndex( new THREE.BufferAttribute( g.indices, 1 ) );
g.setAttribute('position', new THREE.BufferAttribute( g.positions, 3 ) );

Aus verschiedenen Gründen speichere ich die primären Positionen für die Löcher in einem normalen array let pos = []; mittels pos.push( x, y, z ); zwischen.

Damit berechnen sich die Längen sehr einfach. Da die Löcher auch stärkere Krümmungen enthalten, habe ich den Iterationsabbruch auf 90% der ungefähren Seitenlänge der Dreiecke gesetzt.
////////// console //////////////////////////////////////////////
let lx,ly,lz;
console.log('g.d', g.d ); //// rough side length of the triangles

for ( let i = 3; i < pos.length; i += 3 ) {//	uses sqlen0 < 0.81 * dd, equals 0.9*d

    lx = pos[ i     ] - pos[ i - 3 ];
    ly = pos[ i + 1 ] - pos[ i - 2 ];
    lz = pos[ i + 2 ] - pos[ i - 1 ];
    console.log('length',length( lx, ly, lz) ); // 0.9*d = 0.135

}

////////////////////////////////////////////////////////////////////

Für dieses kleine Löchlein ergeben sich folgende Werte.

 
vor 29 Tagen  
 




p.specht
Danke, das gibt´s also. Für FEM etc. müsste man noch die Richtungen wissen. Aber das bleibt ohnehin Spezialisten überlassen. Da in der representation nur Flächen vorkommen, es dort aber auf Trägheitsmomente, Massenverteilungen, Materialsteifigkeiten etc. ankommt, bleibt das hier Zukunftsmusik. War auch nur so eine Idee - ich hatte mal ein 16bit-Programm für FEM, das ganz gut war. Läuft natürlich nicht mehr.
Gruss
 
So Computer sind halt auch nur Menschen...
vor 29 Tagen  
 




HofK
Mit FEM (Finite-Elemente-Methode) habe ich mich nicht beschäftigt. Da benötigt man aber Teilkörperchen des Gesamtkörpers. Meine "Körper" sind nur Oberflächen. Die Löcher erzeuge ich für die Innengeometrie, siehe Beitrag vom 25.09. Ansonsten kann man die zusammengesetzten Oberflächen einfach durch Überschneidung generieren.
 
vor 29 Tagen  
 




HofK
Die bisher noch fehlenden Varianten Zylinder-Zylinder sind soweit fertig.

Ein verbundenes Loch:





Zwei Löcher:





Knappe Sache:



Nun noch etwas Fleißarbeit beim Aufräumen und optimieren des Codes.
 
vor 24 Tagen  
 




p.specht
 
XProfan 11
So Computer sind halt auch nur Menschen...
vor 24 Tagen  
 




HofK
HofK (16.11.2019)
Nun noch etwas Fleißarbeit beim Aufräumen und optimieren des Codes.


Zu Euphorisch


Mit der Kugel am Zylinder ist es perfekt.



Aber beim weiteren Zusammenbau der Körper habe ich festgestellt, dass ich bei den Enden der Zylinder immer noch nur die primitive Variante mit teils verzerrten Seitenlängen der Dreiecke habe.



Also doch noch ein wenig Arbeit.



Das ist noch nicht ganz perfekt, die iterative Rechnung bringt bei Loch und Zylinderende leicht unterschiedliche Ergebnisse. Da muss ich tiefer prüfen.

Die Formel ist auch nicht sehr übersichtlich:

Dabei müssen die Variablen wegen der Lage der Öffnung auch noch vertauscht werden. psi ist der umlaufende Winkel, tilt ist der Neigungswinkel, exc die Exzentrik.
 
vor 20 Tagen  
 




p.specht
Laufmasche, sozusagen ... Wie wär´s mit einem Ausgleichsstück, überlagernd? Zuschweissen wird wohl eher nicht gelingen
 
XProfan 11
So Computer sind halt auch nur Menschen...
vor 20 Tagen  
 




HofK
Ich hatte eher an kleben gedacht, aber das verschmiert das Display. Lötzinn würde wohl abperlen und schweißen wäre bei einem alten Röhrenmonitor sicher ein schönes Implosions-Experiment.

Also dann doch lieber meinen Soft-JavaScript-Tacker benutzen!

Das Problem liegt in den leicht unterschiedlichen Umsetzungen der Iteration. Da ich es für die unterschiedlichen Fronten nacheinander experimentell ermittelt habe, gibt es feine Unterschiede im Algorithmus. Zur Optimierung des Codes muss das ohnehin vereinheitlicht werden, um ähnliche /identische Codeabschnitte nicht mehrfach zu haben.

Der gegenwärtige Stand ergibt die folgende allgemeine Funktion
function makeFrontPos( xyzCalc ).
Dieser wird die konkrete Funktion für die Schnittlinie übergeben
function xyzCalcSphHole( ) für die Kugel (Schnitt mit Zylinder).

Ausgangswerte werden in der Triangulations-Hauptfunktion gesetzt um Parameterübergaben zu sparen. Das entspricht meiner Vorgehensweise beim Triangulationsprojekt.

Nätürlich anfangs wieder eine schöne Fehldarstellung. Sie zeigt nochmals die hohe Stabilität der Triangulation bei fehlerhaften Fronten.



function makeFrontPos( xyzCalc ) {

    psi = psiStart;
    dpsi = Math.PI * 2 / g.detail / 16;
    sqlen1 = 9 * dd;// initial
    xyzCalc( );// start point
    pos.push( x, y, z );
    // notice start point
    x0 = x;
    y0 = y;
    z0 = z;

    if ( psi !== psiEnd ) {

        psi = psiEnd;
        xyzCalc( );
        psi = psiStart;// initial again

    }

    // notice endpoint to check finish
    x1 = x;
    y1 = y;
    z1 = z;

    while ( sign > 0 ? psi < psiEnd && ( sqlen1 > 5.76 * dd || psi < ( psiEnd - psiStart ) / 2 ) : psi > psiEnd && ( sqlen1 > 5.76 * dd || psi > ( psiStart - psiEnd ) / 2 ) ) {

        // (adaptive-deformed) circle
        psi0 = psi;
        sqlen0 = 0;

        while ( sqlen0 < 0.81 * dd ) {

            psi += sign * dpsi;
            xyzCalc( );
            dx = x - x0;
            dy = y - y0;
            dz = z - z0;
            sqlen0 = squareLength( dx, dy, dz );

        }

        pos.push( x, y, z );

        if ( slope ='dx' )	{

            dyzdx = Math.abs( Math.sqrt( dy * dy + dz * dz ) / dx );
            dyzdx = dyzdx > 1 ? 1 : dyzdx;
            dpsi = Math.abs( psi - psi0 ) * dyzdx / 16;

        } else {// 'dy'

            dxzdy = Math.abs( Math.sqrt( dx * dx + dz * dz ) / dy );
            dxzdy = dxzdy > 1 ? 1 : dxzdy;
            dpsi = Math.abs( psi - psi0 ) * dxzdy / 16;

        }

        x0 = x;
        y0 = y;
        z0 = z;
        dx = x - x1;
        dy = y - y1;
        dz = z - z1;
        sqlen1 = squareLength( dx, dy, dz );

    }

    // possibly a intermediate point

    if( sqlen1 > 1.44 * dd )  {

        psi += ( psiEnd - psi ) / 2 ;
        /* or
        a = y1 === 0 ? 3 : 2;
        psi += a * ( psiEnd - psi ) / 4;
        */
        xyzCalc( );
        pos.push( x, y, z );

    }

    if( !openFrt ) pos.push( x1, y1, z1 );

}


// partial front:
// y = sqrt( rSph * rSph - g.radius * g.radius - exc * exc - 2 * g.radius * exc * cos( psi ) )
rex = rSph * rSph - g.radius * g.radius - exc * exc;
sign = 1;
psiStart = Math.PI;// initial
psiEnd = psiStart + Math.acos( rex / ( -2 * g.radius * exc ) );
openFrt = false;
slope ='dy';
pos = [];
makeFrontPos( xyzCalcSphHole );


 
vor 16 Tagen  
 




HofK
Die Ergänzung der Fronten zur Anpassung von Zylinder und Kugel an die Enden des Zylinders hat mehr Arbeit gemacht als gedacht.

Aber so sieht es ganz praktikabel aus.





Die Parameter des Beispiels. Unten passt ein Zylinder dran, oben eine Kugel.
const parameters =  {

    d: 0.15,// rough side length of the triangles
    div4: 15,// division of the quarter circle
    geoBtm:'cylinder', //  'cylinder', 'sphere', solid to be adapted
    bottom: -3.0,
    div4Btm: 34,// division bottom adaptation, (to quarter, >= div4)
    phiBtm: 0,// rotation of adaptive-deformed circle (Bottom)
    excBtm: 1.8049,
    //tiltBtm: 0.0, // tilt of bottom adaption ( -PI/2 < tilt < PI/2 )
    geoTop:'sphere', // 'sphere', solid to be adapted
    top: 1.0,
    div4Top: 34,// division top adaptation, (to quarter, >= div4)
    phiTop: 0,// rotation of adaptive-deformed circle (Top)
    excTop: 1.8049,
    //tiltTop: 0.0, // tilt of top adaption ( -PI/2 < tilt < PI/2 )
    holes: [
    // unit: '%' of the radius, 'd' factor to d, 'v' value
    //  hole to conect a sphere:  [ 'sphere', div4AdpSph, y, phi, exc, unit ]
    ['sphere', 16, -1.11, 0,  2.686, 'v' ],
    // hole to conect a cylinder: [ 'cylinder', div4AdpCyl, y, phi, exc, unit, tilt, <optional: side> ]
    ['cylinder', 8,  -2.2, 1.57, 50, '%', -0.22, '+-' ],
    //points hole,: array of points y, phi, ...  (last point is connected to first)
    [ 0.15,0.45, 0.5,0.9, 0.8,0.6, 0.75,-0.2, 0.1,-0.15  ]
    ]

}


Es waren einige Funktionen zu gestalten.



Nun sind noch "Restarbeiten" nötig. 
 
vor 3 Tagen  
 




p.specht
Gratulation! Das war sicher eine grössere Hürde! Jetzt wären wahrscheinlich sowas wie Makros hilfreich, die die Fälle unterscheiden helfen - sonst bleibt es Hand-/Kopfarbeit. Wie sieht es übrigens mit Bemaßung aus?
 
XProfan 11
So Computer sind halt auch nur Menschen...
Vorgestern (16:52)  
 




HofK
Bemaßungen sind kein Problem, habe ich aber nicht vorgesehen. Man zeichnet Linien und kleine Dreiecke als Spitzen. Die Ziffern kann man auf unterschiedliche Weise erzeugen. Beispielsweise so, wie ich es für meine NumbersHelper gemacht habe, z.B.  [...] 

Zwischendurch habe ich nach langer Zeit wieder mal shader betrachtet.  [...] 
und mir noch eine andere Sache "eingehandelt" als ich über einen kleinen Fehler gestolpert bin.  [...] 
 
Gestern (20:48)  
 




p.specht
Maßzahlen, die nicht mitdrehen: Wow, super!

Wie könnte man eine Schnittebene in das Objekt legen, sodaß nur der dahinter-befindliche Teil gezeichnet wird (z.B. Stockwerkspläne) ?
 
So Computer sind halt auch nur Menschen...
vor 30 min.  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

68.969 Betrachtungen

Unbenanntvor 0 min.
p.spechtvor 25 min.
Jürgen StrahlGestern (23:46)
E.T.Gestern (22:33)
HofKGestern (20:48)
Mehr...

Themeninformationen



AGB  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Impressum  |  Mart  |  Support  |  Suche

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