Zurück   Flashforum > Flash > Flash Fortgeschritten > Flash 8

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 29-05-2007, 20:04   #1 (permalink)
Neuer User
 
Benutzerbild von deejayy
 
Registriert seit: Nov 2005
Ort: Bayern
Beiträge: 225
z-achsen rotation eines mc (sinus)

So, ich zerbrech mir seit mehreren Stunden den Kopf wegen folgendem Effekt:

ich möchte eine "stehende Welle" über AS programmieren.
Eine "stehende Welle" ist eine Sinuskurve, die sich im Prinzip um die z-Achse dreht (so ungefähr kann man den visuellen Effekt beschreiben).

nun habe ich über AS eine Sinuskurve erstellt:
HTML-Code:
var xWert :Number = 0;
var yWert :Number = 0;
var pi = Math.PI;
var amp :Number = -49;

function sinus(amplitude) {
	for (i=0; i<=720; i++) {
	xWert = i * 2.68
	yWert = 100 +(amplitude * (Math.sin(pi*2/360*i)));
	sinus_mc.lineTo(xWert, yWert);
	}
}
		
this.createEmptyMovieClip("sinus_mc", 1);
sinus_mc.lineStyle(2, 0xFF00FF, 100);
sinus_mc.moveTo(0, 100);

sinus (amp);
Die Sinuskurve wird auch ausgegeben einwandfrei :-)

Nun meine Frage: hat jemand einen Ansatz, wie ich den MC mit der Sinuskurve "um die z-Achse rotieren" kann?
Die Rotationsbewegung könnte man wieder über den Sinus berechnen.

Aber wie kann ich die Pixel eines MC´s ansteuern und ihnen sagen, wo hin sie sich bewegen sollen.

Jemand eine Idee?
deejayy ist offline   Mit Zitat antworten
Alt 30-05-2007, 01:05   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
http://www.seibsprogrammladen.de/fra...ispiele/flash6
-> Zeichnen
... Sinuswelle
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 30-05-2007, 08:48   #3 (permalink)
Neuer User
 
Benutzerbild von deejayy
 
Registriert seit: Nov 2005
Ort: Bayern
Beiträge: 225
danke seib

habs aber doch noch selbst hinbekommen mit der stehenden Welle

hier mal mein Script : (für verbesserungsvorschläge an dem Script bin ich gerne dankbar... )
ActionScript:
  1. function sinus(amplitude, deph, nr) {
  2.     var xWert :Number = 0;
  3.     var yWert :Number = 0;
  4.     var pi = Math.PI;
  5.     this.createEmptyMovieClip("sinus_mc" + nr, deph);
  6.     this["sinus_mc"+nr].lineStyle(2, 0xFF00FF, 100);
  7.     this["sinus_mc"+nr].moveTo(0, 100);
  8.     for (i=0; i<=720; i++) {
  9.         xWert = i * 2.68
  10.         yWert = 100 +(amplitude * (Math.sin(pi*2/360*i)));
  11.         this["sinus_mc"+nr].lineTo(xWert, yWert);
  12.     }
  13. }
  14.  
  15. var countersinus :Number = 1;
  16. var counteramp :Number = -50;
  17. sinus (counteramp, 1, countersinus);
  18. //sinus_mc1.removeMovieClip();
  19.  
  20. var amparray = new Array();
  21. for (i=0 ; i<= 20; i++) {
  22.     amparray[i] = -50 + 5*i;
  23. }
  24. var z :Number = 0;
  25. var test :Boolean = true;
  26. this.onEnterFrame = function() {
  27.     this["sinus_mc"+countersinus].removeMovieClip();
  28.     countersinus = countersinus + 1;
  29.     counteramp = amparray[z];
  30.     if (test == true) {
  31.         z = z +1;
  32.     }
  33.     if (test == false) {
  34.         z = z -1;
  35.     }
  36.     if (z == 20) {
  37.         test = false;
  38.     }
  39.     if (z == 0) {
  40.         test = true;
  41.     }
  42.            
  43.     sinus (counteramp, 1, countersinus)
  44. }
deejayy ist offline   Mit Zitat antworten
Alt 30-05-2007, 12:05   #4 (permalink)
Neuer User
 
Benutzerbild von deejayy
 
Registriert seit: Nov 2005
Ort: Bayern
Beiträge: 225
nochmals eine Verbesserung in meinem Script.

Jetzt "dreht" sich welle richtig um die x_Achse in z-Richtung :-)

ActionScript:
  1. //Sinuskurve Funktion
  2. function sinus(amplitude, deph, nr) {
  3.     var xWert :Number = 0;
  4.     var yWert :Number = 0;
  5.     var pi = Math.PI;
  6.     this.createEmptyMovieClip("sinus_mc" + nr, deph);
  7.     this["sinus_mc"+nr].lineStyle(2, 0xFF00FF, 100);
  8.     this["sinus_mc"+nr].moveTo(0, 100);
  9.     for (i=0; i<=720; i++) {
  10.         xWert = i * 2.68
  11.         yWert = 100 +(amplitude * (Math.sin(pi*2/360*i)));
  12.         this["sinus_mc"+nr].lineTo(xWert, yWert);
  13.     }
  14. }
  15.  
  16. //Ampliutenberechnung für fiktive Drehung um Z-Achse:
  17. var PI = Math.PI;
  18. var bogen :Number = 1*PI/60;
  19. var gesamtbogen :Number = 1*PI;
  20. var amparray = new Array();
  21. for (i=0 ; i<= 60; i++) {
  22.     amparray[i] = -50 * Math.sin(gesamtbogen + i*bogen)
  23. }
  24. for (j=0 ; j<= 60; j++) {
  25.     amparray[j+61] = 50 * Math.sin(gesamtbogen + j*bogen)
  26. }
  27.  
  28. //Grafische Darstellung
  29. var countersinus :Number = 1;
  30. var counteramp :Number = -50;
  31. sinus (counteramp, 1, countersinus);
  32.  
  33. var z :Number = 0;
  34. var test :Boolean = true;
  35. this.onEnterFrame = function() {
  36.     this["sinus_mc"+countersinus].removeMovieClip();
  37.     countersinus = countersinus + 1;
  38.     counteramp = amparray[z];
  39.     if (test == true) {
  40.         z = z +1;
  41.     }
  42.     if (test == false) {
  43.         z = 0;
  44.     }
  45.     if (z == 120) {
  46.         test = false;
  47.     }
  48.     if (z == 0) {
  49.         test = true;
  50.     }
  51.            
  52.     sinus (counteramp, 1, countersinus)
  53. }
deejayy ist offline   Mit Zitat antworten
Alt 30-05-2007, 13:15   #5 (permalink)
Neuer User
 
Benutzerbild von deejayy
 
Registriert seit: Nov 2005
Ort: Bayern
Beiträge: 225
also mein wissen ist nun erschöpft

Die Welle funktioniert zwar einwandfrei, aber die Rechenleistung ist einfach zu derb (ab 3 Wellen geht mein Rechner in die Knie...)

folgende ähnliche Wellenanimation möchte ich erstellen:
http://www.flashintro.de/templates2.html?flash_intro
(4te Reite mitte -> aufs image klicken und dann das preview anschauen)

mit meiner Variante habe ich einfach viel zu viele Rechenoperationen.
30 Funktionsaufrufe pro Sekunde / pro Funktion 1x Movieclip erstllen / alten löschen / 720 sinus-berechnungen + if-abfragen
macht circa 22000 Operationen pro Sekunde pro Welle...

das ist einfach nicht wirklich gut programmiert. Hat jemand eine Idee, wie ich das noch lösen könnte???
deejayy ist offline   Mit Zitat antworten
Alt 31-05-2007, 03:00   #6 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
Zitat:
Zitat von deejayy Beitrag anzeigen
aber die Rechenleistung ist einfach zu derb (ab 3 Wellen geht mein Rechner in die Knie...)
- nicht jeden punkt berechnen! anstatt
for (i=0; i<=720; i++) { <== 720 linien
for (i=0; i<=720; i+=10) { <== 72 linien
langt. da ist kaum ein qualitätsunterschied zu erkennen; aber 90% gespahrt!

- nicht jedesmal ein neues mc erzeugen, sondern die grafik mit clear löschen und neu zeichnen.

- zwei wellen lang zeichnen und dann nur noch das mc hin- und her bewegen; anstatt das immer wieder neu zu berechnen.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 31-05-2007, 10:19   #7 (permalink)
Neuer User
 
Benutzerbild von deejayy
 
Registriert seit: Nov 2005
Ort: Bayern
Beiträge: 225
Also habe das Script nun umgeändert auf jeden 10ten Punkt und mit Clear.
Du hast Recht, man sieht Qualitativ keinen Unterschied und wirklich 90% Einsparung rechnerisch...

Auf die Idee bin ich nicht gekommen

Hier mein geändertes Script:
ActionScript:
  1. //Sinuskurve Funktion
  2. function sinus(amplitude) {
  3.     var xWert :Number = 0;
  4.     var yWert :Number = 0;
  5.     var pi = Math.PI;
  6.     this.sinus_mc.lineStyle(2, 0xCCCCCC, 100);
  7.     this.sinus_mc.moveTo(0, 100);
  8.     for (i=0; i<=720; i+=10) {
  9.         xWert = i * 2.68
  10.         yWert = 100 +(amplitude * (Math.sin(pi*2/360*i)));
  11.         this.sinus_mc.lineTo(xWert, yWert);
  12.     }
  13. }
  14.  
  15. //Ampliutenberechnung für fiktive Drehung um Z-Achse:
  16. var amp :Number = 50;
  17.  
  18. var PI = Math.PI;
  19. var bogen :Number = 1*PI/60;
  20. var gesamtbogen :Number = 1*PI;
  21. var amparray = new Array();
  22. for (i=0 ; i<= 60; i++) {
  23.     amparray[i] = -1* amp * Math.sin(gesamtbogen + i*bogen)
  24. }
  25. for (j=0 ; j<= 60; j++) {
  26.     amparray[j+61] = amp * Math.sin(gesamtbogen + j*bogen)
  27. }
  28.  
  29. //Grafische Darstellung
  30. var counteramp :Number = -1 * amp;
  31.  
  32. this.createEmptyMovieClip("sinus_mc", 1);
  33.  
  34. sinus (counteramp);
  35.  
  36. var z :Number = 0;
  37. var test :Boolean = true;
  38. this.onEnterFrame = function() {
  39.     this.sinus_mc.clear();
  40.     counteramp = amparray[z];
  41.     if (test == true) {
  42.         z = z +1;
  43.     }
  44.     if (test == false) {
  45.         z = 0;
  46.     }
  47.     if (z == 120) {
  48.         test = false;
  49.     }
  50.     if (z == 0) {
  51.         test = true;
  52.     }
  53.            
  54.     sinus (counteramp)
  55. }

Zitat:
- zwei wellen lang zeichnen und dann nur noch das mc hin- und her bewegen; anstatt das immer wieder neu zu berechnen.
Das habe ich nicht so ganz verstanden, was du damit meinst.
Ich zeichne die Kurve ja 2 Wellen lang mit 720 (1 Welle =360); Danach stopfe ich den MC in einen neuen MC und tweene den.
Aber was meinst du damit, dass nicht immer wieder neu zu berechnen?

Geändert von deejayy (31-05-2007 um 14:49 Uhr)
deejayy ist offline   Mit Zitat antworten
Alt 01-06-2007, 13:27   #8 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
Zitat:
Zitat von deejayy Beitrag anzeigen
was meinst du damit, dass nicht immer wieder neu zu berechnen?
die welle wellt ;-)
zeichne die welle einmal doppelt so lange (das was du jetzt hast nochmal hinten drann hängen) und dann das mc nur noch in x-richtung bewegen. das wellt genauso.
wenn du das mc um eine ganze welle weit geschoben hast, dann um die komplette welle zurück und wieder langsam vorschieben.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (01-06-2007 um 13:29 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 01-06-2007, 14:07   #9 (permalink)
Neuer User
 
Benutzerbild von deejayy
 
Registriert seit: Nov 2005
Ort: Bayern
Beiträge: 225
ja, das ist mir klar

mach ich ja momentan eigentlich auch schon da ich die welle für 1900 Pixel länge berechne (2 Wellen) und nur 950 Pixel breite habe... somit kann ichs verschieben und die welle wellt

Aber ich verändere ja neben der Bewegung in x-Richtung (durch den Tween) auch nocht die Amplitude entsprechend, um eine "optische" Drehung um die x-Achse in Z-Richtung zu erzeugen.
Und diese "Drehung" wird ja durch das Script erzeugt (jeweils neu zeichen). Somit muss ich ja gezwungenermaßen bei jedem Frame die Welle neu zeichnen lassen.

Alternativ könnte ich einmal 120 MC´S erzeugen (je ein Wellenzustand) und diese MC´s pro Frame der reihe nach auf visible schalten (die anderen alle unsichtbar), dann hätte ich das selbe ergebniss... aber ich glaube nicht, dass das recht sinnvoll wäre
deejayy 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 18:16 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele