Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-01-2003, 17:39   #1 (permalink)
netTrek
 
Benutzerbild von netTrek
 
Registriert seit: Jul 2001
Ort: 46282 Dorsten
Beiträge: 2.972
3d Versuch

OK... ich glaub jetzt ist die 3D Engine von mir "nett" - Hoffe ich langeweile euch nicht zu sehr und würde mich über Feedback freuen:

ActionScript:
  1. // Hilfsmethoden
  2. // Kostante Rad - dieser Wert wird benötigt um die Winkel von Bogenmaß auf RAD zu berechnen´
  3. Math.RAD = Math.PI/180;
  4. // Sin Funktion für Grad Zahlen
  5. Math.sinD = function(degrees) {
  6.     return Math.sin(degrees*Math.RAD);
  7. };
  8. // Cos Funktion für Grad Zahlen
  9. Math.cosD = function(degrees) {
  10.     return Math.cos(degrees*Math.RAD);
  11. };
  12. // POINT
  13. // Die Point Klasse verwaltet die Punkte im 2D Raum
  14. function Point(x, y) {
  15.     this.x = x == undefined ? 0 : x;
  16.     this.y = y == undefined ? 0 : y;
  17. }
  18. // connectPoints verbindet den Punkt auf dem die Funktion angewandt  wurde
  19. // mit den Punkten die als Parameter (list := Array) übergeben wurden
  20. // targetMC ist die Instanz in der die Verbindung in form von Linien dargestellt werden soll
  21. Point.prototype.connectPoints = function(targetMC,list) {
  22.     var count = list.length;
  23.     targetMC.moveTo(this.x, this.y);
  24.     for (var i=0; i<count; i++) {
  25.         targetMC.lineTo(list[i].x, list[i].y);
  26.     }
  27.     targetMC.lineTo(this.x, this.y);
  28. };
  29. // Point3D
  30. // Die Point3D Klasse verwaltet die Punkte im 3D Raum
  31. function Point3D(x, y, z) {
  32.     this.x = x == undefined ? 0 : x;
  33.     this.y = y == undefined ? 0 : y;
  34.     this.z = z == undefined ? 0 : z;
  35. }
  36. // move - Verschieb einen Punkt um einen Vektor und gibt einen neuen punkt zurück
  37. Point3D.prototype.moveNew = function(dx, dy, dz) {
  38.     return new Point3D (dx+this.x, dy+this.y, dz+this.z)
  39. }
  40. // Die Methode getFlashCoord berechnet die 3D Koordinaten mittels Zentralprojektion  in 2D Koordinaten
  41. // Für Flash um. Da Flash nicht kartesischen Koordinaten arbeitet wird das Vorzeichen
  42. // der Y-Koordinate gewechselt.
  43. // viewDistanz ist die Distanz zur Projektionsfläche. Dieser Wert wird benötigt und im Zweifel
  44. // Mit dem defaultWert 300 angegebn
  45. // Die Methode gibt ein neues Objekt der Klasse Point mit den entsprechenden Koordinaten zurück.
  46. Point3D.prototype.getFlashCoord = function(viewDistanz) {
  47.     // get Perspective
  48.     viewDistanz = viewDistanz == undefined ? 300 : viewDistanz;
  49.     var div = this.z+viewDistanz;
  50.     // division durch mit null ist nicht möglich
  51.     div = div == 0 ? .0000000001 : div;
  52.     // perspektivenfaktor
  53.     perspective = viewDistanz/div;
  54.     return new Point(this.x*perspective, this.y*-perspective);
  55. };
  56. // Die Methode dient dem Debugging und gibt lediglich die aktuellen Werte eines Punktes zurück.
  57. Point3D.prototype.printPoint3D = function() {
  58.     trace("x:= "+this.x);
  59.     trace("y:= "+this.y);
  60.     trace("z:= "+this.z);
  61. };
  62. // rotX - rotiert den Punkt um die X-Achse. Als Parameter wird der Rotationswinkel
  63. // (degrees) erwartet
  64. Point3D.prototype.rotX = function(degrees) {
  65.     var ca = Math.cosD(degrees);
  66.     var sa = Math.sinD(degrees);
  67.     var tempY = this.y*ca-this.z*sa;
  68.     var tempZ = this.y*sa+this.z*ca;
  69.     this.y = tempY;
  70.     this.z = tempZ;
  71. };
  72. // rotY - rotiert den Punkt um die Y-Achse. Als Parameter wird der Rotationswinkel
  73. // (degrees) erwartet
  74. Point3D.prototype.rotY = function(degrees) {
  75.     var ca = Math.cosD(degrees);
  76.     var sa = Math.sinD(degrees);
  77.     var tempX = this.x*ca+this.z*sa;
  78.     var tempZ = this.z*ca-this.x*sa;
  79.     this.x = tempX;
  80.     this.z = tempZ;
  81. };
  82. // rotY - rotiert den Punkt um die Y-Achse. Als Parameter wird der Rotationswinkel
  83. // (degrees) erwartet
  84. Point3D.prototype.rotZ = function(degrees) {
  85.     var ca = Math.cosD(degrees);
  86.     var sa = Math.sinD(degrees);
  87.     var tempX = this.x*ca - this.y*sa;
  88.     var tempY = this.x*sa + this.y*ca;
  89.     this.x = tempX;
  90.     this.y = tempY;
  91. };
  92. // Klasse Object3d verwaltet ein 3D Objekt
  93. function Object3d() {
  94.     this.areas = new Array();
  95.     this.points= new Array();
  96. }
  97. // Verwaltet einzelne (nicht einer Fläche angehörigen) Punkte der Klasse Point3D
  98. Object3d.prototype.addPoint = function (point) {
  99.     var pos = undefined;
  100.     for (var i in this.points) {
  101.         // kontrolliere ob der Punkt bereits vorhanden ist
  102.         if (this.points[i].x == point.x && this.points[i].y == point.y && this.points[i].z == point.z){
  103.             pos = i;
  104.         }
  105.     }
  106.     // wenn der Punkt noch nicht vorhanden ist füge ihn hinzu
  107.     if (pos == undefined) {
  108.         this.points.push (point);
  109.         pos = this.points.length-1;
  110.     }
  111.     // gebe den Array Index des Punktes zurück
  112.     return pos; 
  113. }
  114. // addArea verwaltet Flächen eines 3D Objektes und erwartet daher als Parameter eine Liste von
  115. // Punkten (der Klasse Point3D) die eine Fläche definieren
  116. Object3d.prototype.addArea = function () {
  117.     var area = new Array;
  118.     var count = arguments.length;
  119.     for (var i=0; i<count; i++) {
  120.         var pointIndex = this.addPoint(arguments[i]);
  121.         area.push(pointIndex);
  122.     }
  123.     this.areas.push(area);
  124. }
  125. Object3d.prototype.rot = function (axis, degrees) {
  126.     for (var i in this.points) {
  127.         var currentPoint = this.points[i];
  128.         var fct = "rot"+axis.toUpperCase();
  129.         currentPoint[fct](degrees);
  130.     }
  131. }
  132. // rotX rotiert das gesamte 3D Objekt um die X-Achse bezüglich des angegebenen Rotationswinkels
  133. Object3d.prototype.rotX = function (degrees) {
  134.     this.rot("x", degrees);
  135. }
  136. // rotY rotiert das gesamte 3D Objekt um die Y-Achse bezüglich des angegebenen Rotationswinkels
  137. Object3d.prototype.rotY = function (degrees) {
  138.     this.rot("Y", degrees);
  139. }
  140. Object3d.prototype.rotZ = function (degrees) {
  141.     this.rot("Z", degrees);
  142. }
  143. // Zeichne die Flächen
  144. Object3d.prototype.drawAreas = function (target) {
  145.     for (var i in this.areas){
  146.         var currentArea = this.areas[i];
  147.         var areaPoints = new Array();
  148.         for (var j in currentArea) {
  149.             var pointIndex = currentArea[j];
  150.             var point = this.points[pointIndex];
  151.             var flashPoint = point.getFlashCoord()
  152.             areaPoints.push(flashPoint);
  153.         }
  154.         var startPoint = areaPoints.shift();
  155.         startPoint.connectPoints(target,areaPoints);
  156.     }
  157. }
  158.  
  159. // Anwendungstest:
  160. /*
  161. ................h-------e
  162. ............d---|---a ..|
  163. ............|...g---|---f
  164. ............c-------b
  165. */
  166.  
  167. this.createEmptyMovieClip("test_mc", 1);
  168. test_mc._x = 400;
  169. test_mc._y = 300;
  170.  
  171. // Würfel
  172.     // vorderen Vektroen
  173. test_mc.a = new Point3D(50, 50, -50);
  174. test_mc.b = new Point3D(-50, 50, -50);
  175. test_mc.c = new Point3D(-50, -50, -50);
  176. test_mc.d = new Point3D(50, -50, -50);
  177.     // hinteren Vektoren
  178. test_mc.e = new Point3D(50, 50, 50);
  179. test_mc.f = new Point3D(-50, 50, 50);
  180. test_mc.g = new Point3D(-50, -50, 50);
  181. test_mc.h = new Point3D(50, -50, 50);
  182.     // 3d Objekt definieren
  183. test_mc.cube = new Object3d();
  184. // vorder Seite
  185. test_mc.cube.addArea (test_mc.a, test_mc.b, test_mc.c, test_mc.d);
  186. // hinter Seite
  187. test_mc.cube.addArea (test_mc.e, test_mc.f, test_mc.g, test_mc.h);
  188. // rechte Seite
  189. test_mc.cube.addArea (test_mc.a, test_mc.e, test_mc.f, test_mc.b);
  190. // unter Seite
  191. test_mc.cube.addArea (test_mc.g, test_mc.f, test_mc.b, test_mc.c);
  192. // linke Seite
  193. test_mc.cube.addArea (test_mc.d, test_mc.h, test_mc.g, test_mc.c);
  194. // ober Seite
  195. test_mc.cube.addArea (test_mc.h, test_mc.e, test_mc.a, test_mc.d);
  196.  
  197. // Rotationswinkel
  198. test_mc.degrees = 1;
  199. this.test_mc.onEnterFrame = function() {
  200.     if (Key.isDown(Key.UP)) {
  201.         this.cube.rotX (this.degrees);
  202.     }
  203.     if (Key.isDown(Key.DOWN)) {
  204.         this.cube.rotX (-this.degrees);
  205.     }
  206.     if (Key.isDown(Key.RIGHT)) {
  207.         this.cube.rotY (this.degrees);
  208.     }
  209.     if (Key.isDown(Key.LEFT)) {
  210.         this.cube.rotY (-this.degrees);
  211.     }   
  212.     if (Key.isDown(Key.PGUP)) {
  213.         this.cube.rotZ (this.degrees);
  214.     }
  215.     if (Key.isDown(Key.PGDN)) {
  216.         this.cube.rotZ (-this.degrees);
  217.     }
  218.     this.clear();
  219.     this.lineStyle(1);
  220.     this.cube.drawAreas(this)
  221. };

Alternativ hier noch die Koordinaten für eine Pyramide

ActionScript:
  1. // Pyramide
  2. test_mc.a = new Point3D(0, 0, -50);
  3. test_mc.b = new Point3D(-100, -100, 50);
  4. test_mc.c = new Point3D(100, -100, 50);
  5. test_mc.d = new Point3D(100, 100, 50);
  6. test_mc.e = new Point3D(-100, 100, 50);
  7.  
  8. test_mc.cube = new Object3d();
  9. test_mc.cube.addArea (test_mc.a, test_mc.b, test_mc.c);
  10. test_mc.cube.addArea (test_mc.a, test_mc.c, test_mc.d);
  11. test_mc.cube.addArea (test_mc.a, test_mc.d, test_mc.e);
  12. test_mc.cube.addArea (test_mc.a, test_mc.e, test_mc.b);

SABAN
__________________
Saban Ünlü

netTrek GmbH & Co. KG
Softwareentwicklung, Design & Konzeption
www.netTrek.de
netTrek ist offline   Mit Zitat antworten
Alt 07-01-2003, 17:41   #2 (permalink)
[Matthias K.] - Moderator
 
Benutzerbild von Madokan
 
Registriert seit: Jun 2001
Ort: Berlin/Germany - and the hole World !
Beiträge: 9.971
Langweilen, wie das den?

Liebe Grüsse
Matze
Madokan ist offline   Mit Zitat antworten
Alt 07-01-2003, 19:51   #3 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
ja, ist mehr als nur nett, ich werds mir mal anschauen.

Hast du schon getestet wieviele punkte halbwegs flüssig darstellbar sind?
secp ist offline   Mit Zitat antworten
Alt 07-01-2003, 20:00   #4 (permalink)
Flashbattle.de
 
Benutzerbild von Sven G.
 
Registriert seit: Jul 2001
Ort: Bochum / NRW
Beiträge: 347
Zitat:
Geschrieben von Madokan
Langweilen, wie das den?

Liebe Grüsse
Matze
LOL das gleihe hab ich mir auch direkt gedacht! Ist echt gut geworden, werde da dann morgen auf der Arbeit erst mal etwas dran rumfrekeln bzw. das Coding mal genauer unter die Lupe nehmen

Gruss
__________________
Viele Grüße

Sven Gasser @ BountyKiller.de
Flashbattle.deGründer
webmaster@flashbattle.de
Flashbattle.de ActionScript Referenz
DELTA Agentur - Agentur für Werbung & Kommunikation

(Kein Support per eMail, PN oder ICQ)
Sven G. ist offline   Mit Zitat antworten
Alt 07-01-2003, 20:18   #5 (permalink)
netTrek
 
Benutzerbild von netTrek
 
Registriert seit: Jul 2001
Ort: 46282 Dorsten
Beiträge: 2.972
@ secp
ne Sorry... hab ich noch nicht ist aber ne gute Anregung!

@ Sven G. & madokan
Das freut mich

SABAN
__________________
Saban Ünlü

netTrek GmbH & Co. KG
Softwareentwicklung, Design & Konzeption
www.netTrek.de
netTrek ist offline   Mit Zitat antworten
Alt 12-01-2003, 18:43   #6 (permalink)
Hirnverbrannt
 
Benutzerbild von NastyFrog
 
Registriert seit: Aug 2001
Ort: AUSTRIA
Beiträge: 2.020
Sieht gut aus, aber 220 Zeilen. Das ist schon ganz schön heavy.
__________________
50 Seiten hardcore ActionScript von den Grundlagen bis zu 3D Darstellungen.... eben eine Abendlektüre.

Dogs fucked the Pope, no fault of mine. Watch out! ... Why money? My name is Brinks; I was born ... born? Get sheep over side ... women and children to armored car ... orders from Captain Zeep.(Hunter S. Thompson)
NastyFrog ist offline   Mit Zitat antworten
Alt 12-01-2003, 21:09   #7 (permalink)
◘ ◘
 
Benutzerbild von beachmeat
 
Registriert seit: Dec 2001
Ort: Amsterdam
Beiträge: 6.126
dann schreibs kürzer
__________________
jeden Tag frisch
beachmeat ist offline   Mit Zitat antworten
Alt 12-01-2003, 21:58   #8 (permalink)
nerdig working
 
Benutzerbild von michael
 
Registriert seit: Jul 2001
Ort: Hamburg
Beiträge: 5.832
nett?!?

HUT AB!!
Daumen hoch!

gruss
michael
michael ist offline   Mit Zitat antworten
Alt 13-01-2003, 12:11   #9 (permalink)
Wann ist endlich Sommer
 
Benutzerbild von cornholio
 
Registriert seit: Oct 2002
Ort: zone
Beiträge: 291
Mütze ab.

Noch ein Tip aus alten 386iger Tagen:

Bei 3d-Engines wurde damals niemals die Wirkliche Sin - Cos - Funktion genommen, weil die echt rechenintensiv ist. Bei einer hinreichenden Anzahl von Punkten macht das schon was aus.
Anstelle dessen bildete man die Funktion auf eine zuvor berechnete Liste von Winkel - Wert - Paaren (z.B. im 2° - Abstand) ab.

--> sin (37.7°) naja, kann man gleich 38° nehmen

Weiss natürlich nicht, inwieweit bei FMX noch relevant ist, wie schnell sin / cos sind.

mfg c
__________________
Hang the DJ!
cornholio ist offline   Mit Zitat antworten
Alt 13-01-2003, 12:32   #10 (permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
cornholio,
Deine Bildunterschrift ist Programm, was
(Spässchen)

in Flash bringt das nichts, im Gegenteil:
Arrays sind eine ziemlich lahme Sache, während die Math-Funktionen ziemlich schnell abgearbeitet werden.
Seit 486er Tagen (!) gehören mathematische Funktionen auch zum Inventar der CPU, deshalb bringen Lookup-Tables wahrscheinlich nicht mal in C++ was.

das einzige, was Sin/Cos etwas schneller macht sind Referenzen, wie z.B. var sin=Math.sin .

Die Umrechnung von Grad in Rad und der zusätzlich Funktionsaufruf im Beispiel von netTrek sind aber performancetechnisch ziemlich
ungünstig, aber für nen Würfel geht das schon.

Florian
__________________
www.planet-xaml.net

Geändert von flory (13-01-2003 um 13:27 Uhr)
flory ist offline   Mit Zitat antworten
Alt 13-01-2003, 12:37   #11 (permalink)
Wann ist endlich Sommer
 
Benutzerbild von cornholio
 
Registriert seit: Oct 2002
Ort: zone
Beiträge: 291
aaah, kapiert.

mfg c
__________________
Hang the DJ!
cornholio ist offline   Mit Zitat antworten
Alt 13-01-2003, 13:00   #12 (permalink)
Hirnverbrannt
 
Benutzerbild von NastyFrog
 
Registriert seit: Aug 2001
Ort: AUSTRIA
Beiträge: 2.020
Ich will ja nicht angeben, aber wenn du es willst:
NastyScape: NastyScape 3D
Knapp unter 300 Zeilen
__________________
50 Seiten hardcore ActionScript von den Grundlagen bis zu 3D Darstellungen.... eben eine Abendlektüre.

Dogs fucked the Pope, no fault of mine. Watch out! ... Why money? My name is Brinks; I was born ... born? Get sheep over side ... women and children to armored car ... orders from Captain Zeep.(Hunter S. Thompson)
NastyFrog ist offline   Mit Zitat antworten
Alt 13-01-2003, 13:02   #13 (permalink)
Hirnverbrannt
 
Benutzerbild von NastyFrog
 
Registriert seit: Aug 2001
Ort: AUSTRIA
Beiträge: 2.020
Achso, oder diesen hier:
http://www26.brinkster.com/nastyf/3D Geschafft 4.html
http://www26.brinkster.com/nastyf/3D Geschafft 5.html
__________________
50 Seiten hardcore ActionScript von den Grundlagen bis zu 3D Darstellungen.... eben eine Abendlektüre.

Dogs fucked the Pope, no fault of mine. Watch out! ... Why money? My name is Brinks; I was born ... born? Get sheep over side ... women and children to armored car ... orders from Captain Zeep.(Hunter S. Thompson)
NastyFrog ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele