Zurück   Flashforum > Software > 3D

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-10-2009, 10:56   #1 (permalink)
Neuer User
 
Registriert seit: Apr 2005
Ort: Augsburg
Beiträge: 51
Sphere und Objekte darauf anordnen

Hallo,
ich habe eine Sphere als Weltkugel.. schaut schonmal ganz toll aus. Jetzt möchte ich auf der Weltkugel zu bestimmten Ländern Objekte draufsetzen, also zB. nen Plane an eine bestimmte Position auf der Weltkarte.

Ich hab schon etwas recherchiert und man kann wohl Objekte auf die Vertices der Sphere ausrichten, bei mir funktioniert das allerdings nicht.
Sobald ich die Kugel drehe, ändern sich die Vertices nicht, die blieben immer gleich. Woran könnte das liegen?

Und noch ne Frage:
ich benutze ein MovieAssetMaterial als Textur. Kann ich innerhalb des MovieClips weitere Punkte (auch als MovieClips) anlegen, und dann deren Texturkoordinaten auf die Raumkoordinaten übertragen??
Dann könnte ich z.B. in Deutschland nen Punkt setzen, die Koordinaten auf der Kugel berechnen und dann dort wieder nen 3D-Sprite oder ein Objekt draufsetzen.
Ist sowas überhaupt möglich?

Danke schonmal,
Martin
theforceismine ist offline   Mit Zitat antworten
Alt 13-10-2009, 11:55   #2 (permalink)
Neuer User
 
Registriert seit: May 2009
Beiträge: 192
najo ich hab das mit positionen auf ner sphere mit longitude latitude gemacht

ActionScript:
  1. //x,y und z position im objectspace: (lat=latitude/lng=longitude)
  2. x = radius * Math.sin(lat) * Math.sin(lng);
  3. y = radius * Math.cos(lat)
  4. z = radius * Math.sin(lat) * Math.cos(lng);

packst du nun die sphere und die planes oder was auch immer in einen ObjectContainer3D und drehst den bleiben auch die planes/etc an der richtigen stelle

beachte bitte das deine Textur entsprechend beim nullmeridian anfangen muss also textur X=0 ungefähr bei London - andernfalls muss du den versatz abziehen von ähm.. lng wars
Plopsi ist offline   Mit Zitat antworten
Alt 13-10-2009, 16:23   #3 (permalink)
Neuer User
 
Registriert seit: Apr 2005
Ort: Augsburg
Beiträge: 51
hi,
danke für die infos, wo finde ich denn heraus, wie ich aus ner x/y Koordinate die entsprechende Lat/Longitude berechnen kann?

Danke und Gruß
theforceismine ist offline   Mit Zitat antworten
Alt 13-10-2009, 17:55   #4 (permalink)
Neuer User
 
Registriert seit: May 2009
Beiträge: 192
ich bin zwar kein mathegenie aber würde mal sagen so:

Code:
lng = 360/texturbreite * x - 180
lat = 180/texturhöhe *y - 90
ach noch ne anmerkung, vergesses selbst oft, sin cos etc. verlangen radianten keine gradwerte also:

ActionScript:
  1. deg2rad(degAngle :Number):Number{
  2. return ((degAngle * Math.PI) / 180);
  3. }

alternativ kannste aber auch bei googleearth nachschauen wo ein ort liegt

Geändert von Plopsi (13-10-2009 um 17:57 Uhr)
Plopsi ist offline   Mit Zitat antworten
Alt 15-10-2009, 09:49   #5 (permalink)
Neuer User
 
Registriert seit: Apr 2005
Ort: Augsburg
Beiträge: 51
Hi,

danke für die Formeln... nur irgendwie hauts nicht so ganz hin:
Link zum Flash

auf der Erde sind kleine rote Punkte zu sehen. Z.B. bei London. Das sind MovieClips auf meiner Textur. Ich berechne die Längen/Breitengrade dieser MovieClips und übertrage die Position dann auf eine Position im 3D-Raum über diese Funktion:

Code:
var l = 360 / w2 * (MovieClip( MovieAssetMaterial( CompositeMaterial(earthNew.material).materials[1] ).movie )["point"+i].y) - 90;
var lo = 180 / h2 * (MovieClip( MovieAssetMaterial( CompositeMaterial(earthNew.material).materials[1] ).movie )["point"+i].x) - 180;	

...

var coords:Number3D = sphericalToCartesian( radius, l, lo );
p.x = coords.x;
p.y = coords.y;
p.z = coords.z;
...

private function sphericalToCartesian (radius:Number, theta:Number, phi:Number):Number3D
{
     var x:Number = radius * Math.cos(theta) * Math.sin(phi);
     var y:Number = radius * Math.sin(theta) * Math.sin(phi);
     var z:Number = radius * Math.cos(phi);
            
     x = radius * Math.sin(theta) * Math.sin(phi);
     y = radius * Math.cos(theta); 
     z = radius * Math.sin(theta) * Math.cos(phi);       		

     return new Number3D(x, y, z);
}
...aber wie man sieht, passen zwar die Abstände der roten Planes verhältnismässig mit denen der Texturpunkte überein, nur die Koordinaten sind falsch.
Woran könnte das liegen?

Geändert von theforceismine (15-10-2009 um 09:51 Uhr)
theforceismine ist offline   Mit Zitat antworten
Alt 15-10-2009, 12:29   #6 (permalink)
Neuer User
 
Registriert seit: May 2009
Beiträge: 192
ich glaub du hast l und lo vertauscht

ActionScript:
  1. var lo = 360 / w2 * (MovieClip( MovieAssetMaterial( CompositeMaterial(earthNew.material).materials[1] ).movie )["point"+i].y) - 180;
  2. var l = (180 / h2 * (MovieClip( MovieAssetMaterial( CompositeMaterial(earthNew.material).materials[1] ).movie )["point"+i].x) - 90) * -1;

denk dran das london in der der textur auf X=0 liegen muss

Geändert von Plopsi (15-10-2009 um 12:32 Uhr)
Plopsi ist offline   Mit Zitat antworten
Alt 15-10-2009, 13:13   #7 (permalink)
Neuer User
 
Registriert seit: Apr 2005
Ort: Augsburg
Beiträge: 51
Hi,

ich habe jetzt folgenden Code.. rein logisch müsste das alles stimmen, praktisch funktionierts noch nicht ganz:

Diesen kryptischen Code mit der CompositeTextur hab ich jetzt ersetzt, einfach durch den "pointsMc" also den MovieClip, der die roten Punkte enthält.
Außerdem hab ich die Textur so geändet, dass sie bei London beginnt, hab da auch ne rote Linie als Meridian eingebaut.

Die "sphericalToCartesian" Funktion hab ich auch nochmal von ner Formelsammlung aus dem Netz überprüft und zur besseren Verständlichkeit die long und lat Parameter eingebaut. Außerdem hatte ich vergessen die Grad in Rad umzuwandeln.
Es haut jetzt fast hin.. nur irgendwie schauts jetzt so aus, als wären die Punkte von den Koordinaten am Äquator nach unten gespiegelt... zumindest liegen sie schonmal auf den korrekten Längengraden. Also wir sind fast am Ziel!

PHP-Code:
...
var 
w2:Number pointsMc.width;
var 
h2:Number pointsMc.height;
var 
radius:Number SIZE_EARTH_DIAMETER_KM 0.5;

for (var 
i:int=1i<4i++) 
{
    
lat pointsMc["point"+i].w2 360 180;
    
long pointsMc["point"+i].h2 180 90 * -1;              
        
    var 
p:Plane = new PlaneplaneMat500050004);
    
p.useOwnContainer true;
    
view3d.scene.addChild);
    
planes.push);
                 
    var 
coords:Number3D sphericalToCartesianradiuslatlong );
    
p.coords.x;
    
p.coords.y;
    
p.coords.z;
}        

private function 
sphericalToCartesianradius:Numberlatitude:Numberlongitude:Number ):Number3D
{
    
latitude deg2radlatitude );
    
longitude deg2radlongitude );
            
    var 
x:Number radius Math.cos(latitude) * Math.cos(longitude);
    var 
y:Number radius Math.cos(latitude) * Math.sin(longitude);
    var 
z:Number radius Math.sin(latitude);
            
    return new 
Number3D(xyz);
}

private function 
deg2raddegAngle:Number ):Number 
{
    return ((
degAngle Math.PI) / 180);

hier nochmal der Link, so wie's jetzt ausschaut:
Erde
theforceismine ist offline   Mit Zitat antworten
Alt 15-10-2009, 14:56   #8 (permalink)
Neuer User
 
Registriert seit: May 2009
Beiträge: 192
was zu hölle rechnest du denn da probier mal das:

ActionScript:
  1. long = (w2/360*pointsMc["point"+i].x - 180);
  2. lat = (h2 / 180 *pointsMc["point"+i].y - 90) * -1;

ok bei den achsen wiess ich nicht genau aber für away3d siehts so aus:

ActionScript:
  1. private function sphericalToCartesian( radius:Number, latitude:Number, longitude:Number ):Number3D
  2. {
  3.     latitude = deg2rad( latitude );
  4.     longitude = deg2rad( longitude );
  5.            
  6.     var x:Number = radius * Math.sin(latitude) * Math.sin(longitude);
  7. var y:Number = radius * Math.cos(latitude);   
  8. var z:Number = radius * Math.sin(latitude) * Math.cos(longitude);
  9.    
  10.            
  11.     return new Number3D(x, y, z);
  12. }

Geändert von Plopsi (15-10-2009 um 15:00 Uhr) Grund: achsen
Plopsi ist offline   Mit Zitat antworten
Alt 15-10-2009, 15:34   #9 (permalink)
Neuer User
 
Registriert seit: Apr 2005
Ort: Augsburg
Beiträge: 51
du, meine Formel macht nichts anderes als deine
Rechne mal durch... gibt das gleiche Ergebnis.

Ich habs jetzt gelöst... es funktioniert!!!
So wie oben bereits beschrieben, man muss nur eine Kleinigkeit ändern.
Da das Papervision Koordinatensystem eine umgekehrte Y-Achse hat muss man schreiben:

PHP-Code:
    p.= -coords.y
that's it! Yeah!
theforceismine ist offline   Mit Zitat antworten
Alt 15-10-2009, 16:07   #10 (permalink)
Neuer User
 
Registriert seit: May 2009
Beiträge: 192
ah ok
Plopsi ist offline   Mit Zitat antworten
Alt 20-10-2009, 13:54   #11 (permalink)
Neuer User
 
Registriert seit: Apr 2005
Ort: Augsburg
Beiträge: 51
ach ich verzweifel noch.. irgendwie funzt das doch nicht so, wie ich mir das vorgestellt hab.

Solange die Punkte noch relativ nahe am Null-Meridian sind, also ca. in der Nähe von London hauts hin.. aber sobald die sich weiterwegbewegen, z.B. Nord- oder Südamerika, dann verschiebts die wieder an andere Stellen, wo sie eigentlich nicht sein dürften.

Ich verstehs nicht... sicher dass die Umwandlung von x/y nach lat/long so passt?
theforceismine ist offline   Mit Zitat antworten
Alt 20-10-2009, 14:00   #12 (permalink)
Neuer User
 
Registriert seit: May 2009
Beiträge: 192
öhm ehrlich gesagt nein aber probier doch einfach mal n paar bekannte werte einzugeben:

hier n link zu ner tabelle Tabellen der Astronomie: Geogr.Koordinaten von Städten in aller Welt
Plopsi ist offline   Mit Zitat antworten
Alt 20-10-2009, 15:52   #13 (permalink)
Neuer User
 
Registriert seit: Apr 2005
Ort: Augsburg
Beiträge: 51
so.. jetzt passts 1:1.... da war ja alles verdreht - habs gerade herausgefunden, indem ich über den Globus verteilt 4 Punkteachsen angelegt hab und geschaut hab, an welchen Punkten die zusammenlaufen. Und nachdem der Schnittpunkt irgendwo im Pazifik anstatt am Nordpol war, konnte dann doch irgendwas nicht so ganz stimmen.

Ich dokumentiere das jetzt mal, gibt ja bestimmt noch mehr Leute, die so etwas ähnliches bauen möchten - folgendes muss man ändern:

PHP-Code:
var p:Point = new PointpointsMc["point"+i].xpointsMc["point"+i].);
lat = ((p.h2 180) - 90) * -1;
long = (p.w2 360);

// "a" ist mein Objekt im 3D-Raum
var coords:Number3D sphericalToCartesianradiuslatlong );
a.coords.x;
a.coords.y;
a.coords.z;


....

private function 
sphericalToCartesianradius:Numberlatitude:Numberlongitude:Number ):Number3D
{
     
latitude deg2radlatitude );
     
longitude deg2radlongitude );
            
     var 
x:Number radius Math.cos(latitude) * Math.cos(longitude);
     var 
y:Number radius Math.sin(latitude);
     var 
z:Number radius Math.cos(latitude) * Math.sin(longitude);  

     return new 
Number3Dxy);

... bei der sphericalToCartesian Funktion waren die Berechnungen für y und z-Achse vertauscht, deswegen hats alles verhauen. So wie's oben steht stimmts jetzt für Papervision... bei anderen 3D-Engines kann sich das sicherlich auch ändern, je nach Achsen-Anordnung.


Viele Grüße,
Martin

Geändert von theforceismine (20-10-2009 um 15:56 Uhr)
theforceismine ist offline   Mit Zitat antworten
Alt 10-11-2009, 21:18   #14 (permalink)
Neuer User
 
Registriert seit: May 2009
Beiträge: 192
ja dieses achsenvertauschen kenn ich von meinem projekt hat mich fast alle haare gekostet bis ich damals bei away3d drauf gekommen bin
Plopsi 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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Objekte Kreisförmig anordnen enky Flash Einsteiger 4 04-09-2007 10:25
Objekte rechts anordnen? Samuel HTML und CSS 3 15-02-2006 15:20
Objekte per ActionScript anordnen manna76 ActionScript 1 1 21-06-2004 11:04
Objekte anordnen court ActionScript 1 4 10-06-2003 18:17
objekte im 3D anordnen Mick Softwarearchitektur und Entwurfsmuster 1 24-11-2001 07:44


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele