Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 26-02-2004, 10:09   #1 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Beiträge: 89
drehender würfel - eckpunkte markieren

hallo in die runde,

letztens hatte ich schon viel hilfe bei der umwandlung eines drehenden würfels erhalten. es funktioniert bisher auch bestens.

nun habe ich aber noch ein (hoffentlich) abschließendes problem zu lösen:

während sich der würfel dreht, sollen ecken eine andere farbe oder einen punkt erhalten, um die drehung nachvollziehen zu können. es muss dabei natürlich immer die gleiche ecke sein, sich also mitdrehen. leider sind meine AS-kenntnisse in der hinsicht etwas bescheiden, so dass ich auf tips angewiesen bin. hier dazu nochmal der (wie ich glaube) entscheidende code:
ActionScript:
  1. //DATA
  2. //
  3. // you can change the data to create different objects
  4. //
  5. // cube vertex data
  6. points = new Array(new Array(-45, 60, 100),
  7. new Array(-125, 0, 0),
  8.  
  9. new Array(-45, 60, -100),
  10.  
  11. new Array(35, 120, 0),
  12.  
  13. new Array(45, -60, 100),
  14.  
  15. new Array(-35, -120, 0),
  16.  
  17. new Array(45, -60, -100),
  18.  
  19. new Array(125, 0, 0));
  20. // cube face data... first four values are indices into the vertex data,
  21. // 5th is the colour for the face, 6th is presently unused (will later hold
  22. // depth info to allow simple hidden line.)
  23. faces = new Array(new Array(0,1,2,3,0xFFFFFF,0),
  24.  
  25. new Array(4,5,6,7,0xFFFFFF,0),
  26.  
  27. new Array(0,1,5,4,0xFFFFFF,0),
  28.  
  29. new Array(1,2,6,5,0xFFFFFF,0),
  30.  
  31. new Array(2,3,7,6,0xFFFFFF,0),
  32.  
  33. new Array(3,0,4,7,0xFFFFFF,0));
  34. //FUNCTIONS
  35. //
  36. //draws a connected line from a list of points
  37. function draw_points(theArray) {
  38.     persp.clear();
  39.     persp.lineStyle(5);
  40.     persp.moveTo(theArray[0][0], theArray[0][1]);
  41.     for (i=1; i<theArray.length; i++) {
  42.         persp.lineTo(theArray[i][0], theArray[i][1]);
  43.     }
  44. }
  45. //draws solid faces based on vertex & face arrays
  46. function draw_solid(thePoints,theFaces, opacity){
  47.     persp.clear();
  48.     persp.lineStyle(6, 0x000000, 100);
  49.     for (i=0;i<theFaces.length;i++){
  50.         persp.beginFill(theFaces[i][4],opacity);
  51.         persp.moveTo(thePoints[ (theFaces[i][0]) ][0],thePoints[ (theFaces[i][0]) ][1]);
  52.         persp.lineTo(thePoints[ (theFaces[i][1]) ][0],thePoints[ (theFaces[i][1]) ][1]);
  53.         persp.lineTo(thePoints[ (theFaces[i][2]) ][0],thePoints[ (theFaces[i][2]) ][1]);
  54.         persp.lineTo(thePoints[ (theFaces[i][3]) ][0],thePoints[ (theFaces[i][3]) ][1]);
  55.         persp.endFill();
  56.     }
  57. }
  58. // rotation around x axis
  59. function xrot_points(theArray, angle) {
  60.     rangle = angle*Math.PI/180;
  61.     for (i=0; i<theArray.length; i++) {
  62.         y = theArray[i][1];
  63.         z = theArray[i][2];
  64.         theArray[i][1] = y*Math.cos(rangle)-z*Math.sin(rangle);
  65.         theArray[i][2] = z*Math.cos(rangle)+y*Math.sin(rangle);
  66.     }
  67. }
  68. // perspective projection   
  69. function project_points(theArray, pp) {
  70.    
  71.     for (i=0; i<theArray.length; i++) {
  72.     r=pp/(pp-theArray[i][2]);
  73.     theArray[i][0]*=r;
  74.     theArray[i][1]*=r;
  75.     }
  76. }
  77. // Initialise sliders
  78. _root.thefaderx.knob._y=_root.depth.knob._y=50;

außerdem hänge ich noch die ganze datei an, damit man sehen kann, wie es funktioniert.

das original ist unter http://www.cleverpig.com/flashstuff.htm
zu sehen.

vielen dank!
Angehängte Dateien
Dateityp: zip wuerfel-test.zip (6,2 KB, 27x aufgerufen)
oops ist offline   Mit Zitat antworten
Alt 26-02-2004, 11:23   #2 (permalink)
hmmmmm...
 
Benutzerbild von kenichi
 
Registriert seit: Feb 2004
Ort: deutschland
Beiträge: 112
hi,
obwohl ich im moment auch an einer 3d engine bastle, weiss ich nicht ganz was du meinst. du hast doch die koordinaten der eckpunkte des wuerfels in deinem array stehen...

wenn du die punkte umrechnest, um sie auf dem bildschirm darzustellen, dann hast du sogar noch die 2d punkte dazu...

ansich hast du also alles was du wissen musst. oder hab ich jetzt was falsch verstanden?
kenichi ist offline   Mit Zitat antworten
Alt 26-02-2004, 11:40   #3 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Beiträge: 89
hallo Kenichi,

sicher hast du recht, nur weiß ich nicht, wo ich in dem skript eingreifen soll.

die punkte werden ja gleich am anfang (points) festgelegt. nur wo kann ich diese dann nochmal abreifen, um ihnen einen anderen farbwert zuzuweisen. auch sind die anfangskoordinaten statisch und die bewegung kommt erst später hinzu. nun sollen sich die punkte ja auch gemäß der rotation mitdrehen.

wäre es jetzt einfach möglich, den punkten eine farbe zuzuweisen?
oops ist offline   Mit Zitat antworten
Alt 26-02-2004, 11:47   #4 (permalink)
hmmmmm...
 
Benutzerbild von kenichi
 
Registriert seit: Feb 2004
Ort: deutschland
Beiträge: 112
hi,

sagen wirs mal so, die punkte bleiben ja in dem array stehen, und sie stehen auch immernoch an der gleichen position im array. das einzige was sich an den punkten geaendert hat, ist die koordinate...
aber ich frage mich sowieso wie du den punkten eine farbe zuweisen willst.

willst du an die stelle der punkte dann einen kleinen kreis hinsetzen, oder wie hast du das vor?

gruss,
kenichi
kenichi ist offline   Mit Zitat antworten
Alt 26-02-2004, 12:02   #5 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Beiträge: 89
hi,

ja, z.b. einen punkt drauf setzen, oder einen kreis drum machen. alternativ wäre auch das einfärben einer seite möglich.

es geht halt darum, dass man beim drehen etwas durcheinanderkommt, was denn nun vorn und was hinten ist. deshalb soll der betrachter eine orientierungshilfe bekommen. wie gesagt, eine seite (nicht fläche) könnte man auch farbig verändern. im skript wird es aber für alle seiten zusammen festgelegt.
oops ist offline   Mit Zitat antworten
Alt 26-02-2004, 12:22   #6 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Beiträge: 89
bin gleich noch an einer weiteren stelle hängen geblieben:

im skript ist die linienfarbe definiert mit
ActionScript:
  1. function draw_solid(thePoints,theFaces, opacity){
  2.     persp.clear();
  3.     persp.lineStyle(3, 0x66FFCC, 100);

ist es nun möglich, von außen per button die farbe zu ändern? also z.b. so:
ActionScript:
  1. on (release) {
  2. _root.wuerfel.persp.lineStyle(3, 0x000000, 100);
  3. }

danke!
oops ist offline   Mit Zitat antworten
Alt 26-02-2004, 14:14   #7 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Beiträge: 89
ok,

hab mich im forum mal ein bischen weiter umgesehen. da schrieb jemand, dass linien, wie von mir gezeichnet, in echtzeit entstehen.

wenn ich das richtig verstehe, kann man da gar nicht so einfach mit einem button drauf zu greifen.

in meinem skript (s.o.) wird ja auch der slider initialisiert, wenn ich das richtig verstehe (man merkt jetzt, dass das skript nicht von mir stammt ;-))

müßte ich denn soetwas auch machen, um die farbe des würfels, also über lineStyle ändern zu können?

hat evtl. jemand eine lösung für meine 2 bescheidenen problemchen?
(1. farbige eckpunkte des würfels gestalten
2. würfel komplett per button anders färben)

danke
oops ist offline   Mit Zitat antworten
Alt 01-03-2004, 08:24   #8 (permalink)
Neuer User
 
Registriert seit: Feb 2003
Beiträge: 89
in der hoffnung, dass mir am anfang der woche jemand weiterhelfen kann, möchte ich noch einmal meine 2 kleinen probleme auf den tisch bringen:

1. wie kann ich einen oder mehrere eckpunkte per button farbig markieren? alternativ wäre auch eine farbänderung einer seite zur kenntlichmachung der rotation möglich.

2. wie kann ich den würfel komplett per button anders einfärben?

vielleicht würde es mir auch weiterhelfen, wenn mir jemand die funktionen des skriptes etwas näher erläutern könnte, so dass ich evtl. selbst in der lage bin, mit meinen bescheidenen kenntnissen die änderungen vorzunehmen. dazu hier nochmal der code der frames 1+2. die kommentare in deutsch sind von mir, aber richtig schlüssig ist das alles für mich noch nicht.
frame1:
ActionScript:
  1. //DATA
  2. // --> Wuerfel-Eckpunkte beim Start (Koordinaten x,y,z)
  3. points = new Array(new Array(-45, 60, 100),
  4. new Array(-125, 0, 0),
  5. new Array(-45, 60, -100),
  6. new Array(35, 120, 0),
  7. new Array(45, -60, 100),
  8. new Array(-35, -120, 0),
  9. new Array(45, -60, -100),
  10. new Array(125, 0, 0));
  11. // --> Wuerfel-Linien - ein Array = eine Seite von 0-7 Eckpunkten
  12. faces = new Array(new Array(0,1,2,3),
  13. new Array(4,5,6,7),
  14. new Array(0,1,5,4),
  15. new Array(1,2,6,5),
  16. new Array(2,3,7,6),
  17. new Array(3,0,4,7));
  18. //FUNCTIONS
  19. // --> Zeichnet Linie zwischen den Punkten
  20. function draw_points(theArray) {
  21.     persp.clear();
  22.     persp.lineStyle(5); // --> Angabe in lineStyle hat keine Auswirkung
  23.     persp.moveTo(theArray[0][0], theArray[0][1]);
  24.     for (i=1; i<theArray.length; i++) {
  25.         persp.lineTo(theArray[i][0], theArray[i][1]);
  26.     }
  27. }
  28. //draws solid faces based on vertex & face arrays
  29. function draw_solid(thePoints,theFaces, opacity){
  30.     persp.clear();
  31.     persp.lineStyle(6, 0x66FFCC, 100);
  32.     for (i=0;i<theFaces.length;i++){
  33.         persp.moveTo(thePoints[ (theFaces[i][0]) ][0],thePoints[ (theFaces[i][0]) ][1]);
  34.         persp.lineTo(thePoints[ (theFaces[i][1]) ][0],thePoints[ (theFaces[i][1]) ][1]);
  35.         persp.lineTo(thePoints[ (theFaces[i][2]) ][0],thePoints[ (theFaces[i][2]) ][1]);
  36.         persp.lineTo(thePoints[ (theFaces[i][3]) ][0],thePoints[ (theFaces[i][3]) ][1]);
  37.     }
  38. }
  39. // --> Rotation um die X-Achse
  40. function xrot_points(theArray, angle) {
  41.     rangle = angle*Math.PI/180;
  42.     for (i=0; i<theArray.length; i++) {
  43.         y = theArray[i][1];
  44.         z = theArray[i][2];
  45.         theArray[i][1] = y*Math.cos(rangle)-z*Math.sin(rangle);
  46.         theArray[i][2] = z*Math.cos(rangle)+y*Math.sin(rangle);
  47.     }
  48. }
  49. // --> Perspektivische Verzerrung
  50. function project_points(theArray, pp) { 
  51.     for (i=0; i<theArray.length; i++) {
  52.     r=pp/(pp-theArray[i][2]);
  53.     theArray[i][0]*=r;
  54.     theArray[i][1]*=r;
  55.     }
  56. }
  57. // Initialise sliders
  58. _root.thefaderx.knob._y=50;
frame2
ActionScript:
  1. //rotate & draw cube
  2. // --> rotationsgeschwindigkeit
  3. xrs += (_root.thefaderx.knob._y -50)/10;
  4.  
  5. //new copy of data (NB simply doing rot_points = points doesn't work!)
  6. rot_points = new Array(points.length)
  7. for (i = 0; i< rot_points.length;i++){
  8.     rot_points[i]=new Array(3);
  9.     for (j=0;j<3;j++){
  10.         rot_points[i][j]=points[i][j];
  11.     }
  12. }
  13. // --> Rotation um X-Achse
  14. xrot_points(rot_points,xrs);
  15. //project onto picture plane (pp dist calculated from depth slider)
  16. project_points(rot_points, _root.depth.knob._y*6+500);
  17. //draw cube (30% opaque)
  18. draw_solid(rot_points,faces,0);

vielen dank!
oops 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 04:12 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele