Geosphere Texturieren

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Haubitze

Betreff: Geosphere Texturieren

BeitragSa, Okt 03, 2009 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo ich bins wieder.

ich code ja noch immer an meinem kleinen planeten. nun will ich diesen texturieren und wie der titel schon
sagt is besagter planet eine geosphere.

nun habe ich im netz eine formel gefunden womit es moeglich sein soll die uv-coordinaten ueber die
xyz-coordinaten zu errechnen.

soweit klappt das auch nur habe ich da noch so kleine problemchen.

hier mal 2 screens(ersterer von einem pol aus gesehen zweiterer naehe aequator.

planet pol
user posted image

planet aequator
user posted image

ich benutze diese funktionen um die uv's zu errechnen.

Code: [AUSKLAPPEN]
Function GetTextureU#(cx#,cy#,cz#,x#,y#,z#) ;c-xyz=centrum, xyz=vertexcoordinaten
tmp#=(ATan2(Abs(x#-cx#),Abs(y#-cy#)))
Return tmp#
End function

Function GetTextureV#(cx#,cy#,cz#,x#,y#,z#)
tmp#=(ATan2(Sqr(Abs(x#-cx#)+Abs(y#-cy#)),Abs(z#-cz)))
Return tmp#
End function


wie man an den bildern sieht giebt es da noch so fehler wie zb das die texture "gekachelt" ist und
gerade an den polen und "nahtstellen", so schein mir, stark verzogen.

falls jemand eine idee hatt was in den funktionen geaendert werden muss bitte ich um seine meinung.

gruesse euer anfaenger Haubitze Smile

ps: ich benutze eine geosphere aus 3dmax(3ds) welche ich dann subdividiere und "berge" setze.
 

Haubitze

BeitragSa, Okt 03, 2009 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
nun habe ich doch noch mal ne frage zu den texturcoordinaten.

kann aus einem minimalen mesh die uv nehmen und diese dann fuer einen subdividierten
mesh interpolieren?

naja eigendlich ne doofe frage aber ich hab da noch nich so den plan.

danke schon mal fuer eure antworten.

gruesse

Nicdel

BeitragSa, Okt 03, 2009 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Keine Doppelposts. Dafür gibt es einen Edit-Button. Mit 3dsMax kenne ich mich aber nicht aus Wink
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Noobody

BeitragSa, Okt 03, 2009 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das kannst du durchaus.

Allerdings wäre es wohl um einiges einfacher, wenn du den Planeten direkt in B3D mittels CreateSphere erstellst und die Berge nachher durch Verändern der Vertexkoordinaten erstellst.

Damit du das nicht hardcoden musst, erstellst du im vornherein eine Heightmap. Dann gehst du jeden Vertex der Kugel durch, bestimmst seine Texturkoordinaten durch VertexU und VertexV und bestimmst so den Höhenwert, der an der Position in der Heightmap gespeichert ist. Den Vertex verschiebst du dann einfach auf dem Vektor von Kugelmittelpunkt zu Vertex. Der Kugelmittelpunkt ist im Vertexkoordinatenraum ja sowieso null, also wird die Berechnung noch ein bischen einfacher. Das Ganze könnte dann so aussehen Code: [AUSKLAPPEN]
Const HEIGHT_SCALE# = 0.1

Local Heightmap = LoadImage( "Heightmap.png" )

Local Planet = CreateSphere( 16 ) ;Oder 8, 32, etc.

Local Surface = GetSurface( Planet, 1 )

Local VertexCount = CountVertices( Surface )

For I = 0 To VertexCount - 1
   Local U# = VertexU( Surface, I )
   Local V# = VertexV( Surface, I )
   
   ;Im folgenden wird der Pixel ausgelesen und der Blauwert herausgefiltert
   Local Blue = ReadPixel( U#*ImageWidth( Heightmap ), V#*ImageWidth( Heightmap ), ImageBuffer( Heightmap ) ) And 255
   
   ;Ich setze jetzt einfach mal voraus, dass ein Blauwert von 128 die Höhe 0 bedeutet
   Local Height# = HEIGHT_SCALE#*( Blue - 128 )/255.
   
   ;Ich berechne den Vektor von Kugelmittelpunkt (hier 0|0|0) zum Vertex und normalisiere ihn per TFormNormal
   ;TFormNormal ist eine schnellere und kürzere Variante, als einfach die Vektorkomponenten durch dessen Länge zu teilen
   TFormNormal VertexX( Surface, I ), VertexY( Surface, I ), VertexZ( Surface, I ), 0, 0
   
   ;Den Vertex auf dem vorher normalisierten Vektor bewegen, und zwar um die berechnete Verschiebung Height#
   VertexCoords Surface, I, VertexX( Surface, I ) + TFormedX()*Height#, VertexY( Surface, I ) + TFormedY()*Height#, VertexZ( Surface, I ) + TFormedZ()*Height#
Next

Der Code ist weder direkt lauffähig noch ist er optimiert - er dient rein zur Illustration (bevor jemand kommt und schreibt "Mit LockBuffer geht das viel schneller blah!" Razz ).

Passende Heightmaps bekommst du überall im Internet - einfach mal googeln.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

Haubitze

BeitragSa, Okt 03, 2009 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
oh man das ja komplizierter als ich dachte :/

naja werds mal probieren und danke fuer den "pseudo code" Wink

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group