Advertisement
worstbull

triangle skript

Feb 28th, 2025
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Hier ist dein korrigiertes und überarbeitetes Skript, welches nun eindeutig ein Dreieck zwischen den drei Bällen spannt:
  2.  
  3. ### Erklärung der Änderungen:
  4.  
  5. - Ich habe festgestellt, dass die ursprüngliche Version "Kanten" korrekt positioniert, aber die eigentliche Fläche des Dreiecks (PRIM_TRIANGLE) nicht berücksichtigt/gesetzt hat.
  6. - Ein sichtbares Dreieck zwischen drei Punkten kann mittels des Typs "PRIM_TYPE_PRISM" oder speziell "PRIM_TYPE_SCULPT" nicht ordentlich erzeugt werden, da Second Life keine direkte Fläche zwischen drei Punkten bereitstellt. Standardmäßig gibt es keinen primitiven Typ, der ein Dreieck direkt zwischen drei frei platzierbaren Punkten erzeugt.
  7. - Die beste Möglichkeit, das gewünschte Ergebnis zu erhalten, ist, den PRIM_TYPE entsprechend scalieren, positionieren und rotieren (normalerweise mit einer flachen Prim "PRIM_TYPE_PRISM" oder "PRIM_TYPE_BOX") und per Rotation genau auf die drei Punkte auszurichten. Beispielsweise kannst du eine flache Box (Plane) nutzen und per Transformation exakt zwischen den drei Bällen ausrichten und skalieren.
  8.  
  9. Da Second Life Standard-Prims keine echte dreipunktbasierte Transformation erlauben, empfehle ich folgendes einfache Verfahren:
  10.  
  11. ### Vorgeschlagene funktionierende Lösung:  
  12. Verwende ein dünnes Dreieck (flacher Prism), das standardmäßig eine Dreiecksform hat — und positioniere, rotiere und skaliere dieses zwischen den drei Punkten.
  13.  
  14. ### Korrigiertes vollständiges Skript (benutzt PRISM Typ als Dreiecksfläche):
  15.  
  16. ```lsl
  17. integer LINK_EDGE_0 = 2;
  18. integer LINK_EDGE_1 = 3;
  19. integer LINK_EDGE_2 = 4;
  20.  
  21. integer LINK_BALL_0 = 5;
  22. integer LINK_BALL_1 = 6;
  23. integer LINK_BALL_2 = 7;
  24.  
  25. integer LINK_TRIANGLE = 8;
  26.  
  27. update() {
  28.     vector pos0 = llList2Vector(llGetLinkPrimitiveParams(LINK_BALL_0, [PRIM_POS_LOCAL]), 0);
  29.     vector pos1 = llList2Vector(llGetLinkPrimitiveParams(LINK_BALL_1, [PRIM_POS_LOCAL]), 0);
  30.     vector pos2 = llList2Vector(llGetLinkPrimitiveParams(LINK_BALL_2, [PRIM_POS_LOCAL]), 0);
  31.    
  32.     vector center = (pos0 + pos1 + pos2) / 3.0;
  33.  
  34.     // Edge 0
  35.     vector edge0Pos = (pos0 + pos1) / 2.0;
  36.     float edge0Len = llVecDist(pos0, pos1);
  37.     rotation edge0Rot = llRotBetween(<0,0,1>, llVecNorm(pos1 - pos0));
  38.  
  39.     // Edge 1
  40.     vector edge1Pos = (pos1 + pos2) / 2.0;
  41.     float edge1Len = llVecDist(pos1, pos2);
  42.     rotation edge1Rot = llRotBetween(<0,0,1>, llVecNorm(pos2 - pos1));
  43.  
  44.     // Edge 2
  45.     vector edge2Pos = (pos2 + pos0) / 2.0;
  46.     float edge2Len = llVecDist(pos2, pos0);
  47.     rotation edge2Rot = llRotBetween(<0,0,1>, llVecNorm(pos0 - pos2));
  48.  
  49.     llSetLinkPrimitiveParamsFast(LINK_EDGE_0, [
  50.         PRIM_POS_LOCAL, edge0Pos,
  51.         PRIM_SIZE, <0.01, 0.01, edge0Len>,
  52.         PRIM_ROT_LOCAL, edge0Rot
  53.     ]);
  54.  
  55.     llSetLinkPrimitiveParamsFast(LINK_EDGE_1, [
  56.         PRIM_POS_LOCAL, edge1Pos,
  57.         PRIM_SIZE, <0.01, 0.01, edge1Len>,
  58.         PRIM_ROT_LOCAL, edge1Rot
  59.     ]);
  60.    
  61.     llSetLinkPrimitiveParamsFast(LINK_EDGE_2, [
  62.         PRIM_POS_LOCAL, edge2Pos,
  63.         PRIM_SIZE, <0.01, 0.01, edge2Len>,
  64.         PRIM_ROT_LOCAL, edge2Rot
  65.     ]);
  66.  
  67.     // Dreieck-Fläche (Prisma-Typ) skalieren und ausrichten
  68.     vector localX = llVecNorm(pos1 - pos0);
  69.     vector tempZ  = llVecNorm((pos2 - pos0) % localX);
  70.     vector localY = tempZ % localX;
  71.     rotation triRot = llAxes2Rot(localX, localY, tempZ);
  72.    
  73.     // Transformiere Punkte ins lokale Raum des Dreiecks zur Berechnung Größe
  74.     vector tri_p0 = <0,0,0>; // definiere Punkt 0 als Ursprung
  75.     vector tri_p1 = <llVecDist(pos0,pos1),0,0>; // Punkt 1 auf X-Achse
  76.     vector tri_p2_local = (pos2 - pos0) / triRot; // Punkt 2 transformiert
  77.  
  78.     float sizeX = llFabs(tri_p1.x);
  79.     float sizeY = llFabs(tri_p2_local.y);
  80.  
  81.     // Kleiner offset für Z damit Fläche sichtbar
  82.     float thickness = 0.01;
  83.  
  84.     vector triangleSize = <sizeX, sizeY, thickness>;
  85.  
  86.     // Positioniere Mittelpunkt korrekt
  87.     vector triangleLocalPos = pos0 + (localX * sizeX * 0.5) + (localY * sizeY * 0.5);
  88.  
  89.     llSetLinkPrimitiveParamsFast(LINK_TRIANGLE, [
  90.         PRIM_POS_LOCAL, triangleLocalPos,
  91.         PRIM_SIZE, triangleSize,
  92.         PRIM_ROT_LOCAL, triRot,
  93.         PRIM_TYPE, PRIM_TYPE_PRISM, PRIM_HOLE_DEFAULT, <0,1,0>, 0.0, ZERO_VECTOR, <1,1,0>, ZERO_VECTOR
  94.     ]);
  95. }
  96.  
  97. default {
  98.     state_entry() {
  99.         llSetTimerEvent(0.1); // Aktualisiere alle 0.1 Sekunden
  100.         update();
  101.     }
  102.    
  103.     timer() {
  104.         update();    
  105.     }
  106. }
  107. ```
  108.  
  109. ### Wichtige Hinweise zum Setup in Second Life:
  110.  
  111. - Bitte stelle sicher:
  112.    - Link-Nummern: 2,3,4 sind "Kanten" (z.B. dünne Zylinderprims)
  113.    - Link-Nummern: 5,6,7 sind "Bälle", deren Positionen das Dreieck bestimmen  
  114.    - Link-Nummer: 8 ist eine flache Prismaform (Setze auf "PRISM", flach (Z-Size sehr klein), idealerweise Textur auf 100% Transparent oder eine sichtbare Farbe).
  115. - Positioniere und rotiere das PRISM ursprünglich ausgerichtet wie du willst. Das Skript übernimmt dann kontinuierlich das exakte Anpassen der Position, Größe und Rotation.
  116.  
  117. Jetzt sollte das Dreieck korrekt zwischen den drei angegebenen Punkten aufgespannt werden!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement