Single Surface, Texturen, Menschen - Fragen [erledigt]

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

onkelz89

Betreff: Single Surface, Texturen, Menschen - Fragen [erledigt]

BeitragDi, Jan 27, 2009 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich weiß kein besonders toller Titel, allerdings sind das die Punkte, die ich ansprechen werde.

Erst kurz wie es aussehen soll später:

Habe eine Map von ca. 1000x1000 Felder - in einer Dim gespeichert.
Jedes Feld ist ca. 15x15 Meter klein.
5x5 Felder werden immer geladen - das in der Mitte, ist das wo der Spieler sich aufhält.
Alle Objekte (Häuser, Menschen, Bäume, Sonstiges,...) wird geladen wenn es sich auf dem selben Feld befindet (eines von den 25)...

Das geht soweit.

------ Das Problem:

Ich kenne mich bisher nicht (gut) in Sachen Single Surface und UV-Koordinaten bei Texturen aus.

1.
Erstmal vorab habe ich das I-Net durchforstet, aber nur Tutorials von zB C4D gefunden, nirgends konnte mir einer sagen was das U, V und W genau aussagt, bzw wie man genaue Stellen von einer Textur "raus nimmt".

2.
Dann ein Mensch zB hat mehrere Teile (Kopf, Körper, Arme, Beine) diese nach möglichkeit in ein Objekt fassen und dann per UV die Textur so aufteilen... - möglich mit Blitz3D?

3.
Bäume - habe testweise (werden nie soviele auf einmal sein) 5000 Bäume á 52 Tris geladen, klappt mit 60 FPS super (sind per AddMesh verbunden)
Wollte dann einen Brush einfügen, es wird aber i-wie nur die "Grundfarbe" von der Textur angezeigt... warum?

Code: [AUSKLAPPEN]


Global O11_tex2=LoadTexture("DATA/11/tex2.bmp")


;# Vegetation - Daten
Type vege
 Field id
 Field x#
 Field y#
 Field z#
 Field obj
End Type


baum1=LoadMesh("DATA/11/baum1.B3D")
baeume=CreateMesh()
baeume1=CreateMesh()
baeume2=CreateMesh()
baeume3=CreateMesh()
baeume4=CreateMesh()

   

bruh=CreateBrush()
BrushTexture bruh,O11_tex2

For i=1 To 200
vege.vege = New vege
vege\obj = CopyMesh(baum1)

PaintMesh vege\obj,bruh

ScaleMesh vege\obj,.1,.1,.1
RotateMesh vege\obj,0,Rand(360),0
PositionMesh vege\obj,Rand(400)+200,153,Rand(400)+200
AddMesh vege\obj,baeume
FreeEntity vege\obj
Delete vege
Next



4.
Was kann ich wirklich zusammen fassen?

Ich dachte mir ich packe alle Bäume, alle Gräser, alle Steine pro Levelteil (1 Feld) zusammen...





Möchte halt möglichst wenig Performance verschwenden, da ich weiß wie schnell die FPS Raten in den Keller geht bei vielen Objekten... (soviel zu meiner alten Projektversion)...

Sind viele Sachen auf einmal, darum die Nr. davor wer speziell zu einer Sache was weiß.

Vielen Dank im Voraus
  • Zuletzt bearbeitet von onkelz89 am Di, Feb 03, 2009 8:32, insgesamt einmal bearbeitet

Jan_

Ehemaliger Admin

BeitragMi, Jan 28, 2009 9:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich gehe mal auf das mit den Mehrere Kopfe, pro Texture ein.

Klar kannste das machen.

Eine relativ einfache Sache ist das.

zuerst, bestimmst du mit texturewidth und textureheight die Texturgröße.
Dann musst du noch wissen, bei wievielen Pixeln dein Gesicht liegt, und wie lang das ist.
Dann hast du diene 4 Punkte: 1)Oben links, 2)oben rechts, 3)unten link, 4)unten rechts
1)
U#=Anfanggesichtx/Texturewidth
V#=Anfanggesichty/Textureheight
2)
U#=(Anfanggesichtx+gesichtwidth)/Texturewidth
V#=Anfanggesichty/Textureheight
3)
U#=Anfanggesichtx/Texturewidth
V#=(Anfanggesichty+gesichtheight)/Textureheight
4)
U#=(Anfanggesichtx+gesichtwidth)/Texturewidth
V#=(Anfanggesichty+gesichtheight)/Textureheight

Ich hoffe, das ich nciht u und V verwechselt habe.
Die anderen Probleme, verstand ich nicht...
between angels and insects
 

onkelz89

BeitragMi, Jan 28, 2009 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Das klingt doch schon einmal sehr gut und recht einfach Smile

Werde es heute Abend testen, bin mom auf der Arbeit und habe kein Blitz hier Razz

Danke!

Zu den Anderen Fragen - vllt weiß ja Jemand anders Rat

Jan_

Ehemaliger Admin

BeitragMi, Jan 28, 2009 12:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu 4.
Wirklich zusammen fassen kannste alles, mit der Selben Texture.
Ich würde es dann noch nach Feld unterscheiden, oder jeweils 4 nebeneinander liegende Felder.
between angels and insects
 

onkelz89

BeitragMi, Jan 28, 2009 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah genau, so dachte ich mir das auch, also für jedes Feld nur eine Gruppe.
Das klingt gut Smile

Noch was anderes...

Meine Überlegung war zb beim Menschen:

3 Layer
1 - Körperfarbe (Typ)
2 - Gesicht (Augen etc.)
3 - Kleidung
4 - Verletzungen / Schmutz etc.

Mit multitexturing hat man ja 7 Layer ... glaub sogar 8 wegen 0

Aber dann der Gedanke...
Die UV Koords kann ich ja nur "einmal" vergeben...

Heißt, wenn ich andere Augen setzten will, hätte ich vllt auch ne Schnittwunde oder ein anderes T-Shirt an...

Ich hoffe ihr versteht das was ich meine...
 

Ava

Gast

BeitragMi, Jan 28, 2009 16:05
Antworten mit Zitat
Ist jetzt vielleicht eine blöde Idee... Rolling Eyes
...aber bei B3D kann man doch auf Texturen rendern. Also warum nicht die einzelnen Parts aus einer Quelle heraus kopieren und an der entsprechenden Stelle auf der Körper-Textur platzieren? Rolling Eyes
 

onkelz89

BeitragMi, Jan 28, 2009 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Klingt erst einmal nicht schlecht, aber ich dachte, wenn ich viele Menschen habe ... auch wenn es "nur" 30 aktuell sichtbare wären. Dann wären es auch 30 Texture oder?

Ich weiß nicht in wie weit da eine schwächere Grafikkarte mitmacht... Aber wenn das geht - das wäre ja super Smile

Auf jeden Fall danke ich für die Idee Wink
Werde es definitiv testen!
 

onkelz89

BeitragDo, Jan 29, 2009 8:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal sorry wegen doppelpost, aber sonst müsste ich en neues Thema auf machen, weil keiner weiß das sich hier nochmal was getan hat Wink

So... habe mich erstmal voll gefreut, die Erleuterung UV hat super geklappt:

Code: [AUSKLAPPEN]

uvw#=TextureWidth (uv)
uvh#=TextureHeight (uv)
fx=5
fy=0
fx=fx*16+1
fy=fy*16+1
AddVertex uvsurf,220,170,200,fx/uvw,fy/uvh
AddVertex uvsurf,200,170,200,(fx+13)/uvw,fy/uvh
AddVertex uvsurf,220,150,200,fx/uvw,(fy+13)/uvh
AddVertex uvsurf,200,150,200,(fx+13)/uvw,(fy+13)/uvh

AddTriangle uvsurf,0,1,2
AddTriangle uvsurf,3,2,1



Meine Textur besteht aus vielen kleinen Quadraten wo eine Zahl steht...

user posted image

http://www.bilder-space.de/upl...qttjvE.JPG

(*eigentlich bmp, aber das wird von der Uploadseite nicht genommen)

Geht alles!

jetzt dachte ich... Was ist wenn das Surface 6 Punkte hat und ich die Textur "lang" ziehen will...



Code: [AUSKLAPPEN]
uvw#=TextureWidth (uv)
uvh#=TextureHeight (uv)
fx=5
fy=0
fx=fx*16+1
fy=fy*16+1
AddVertex uvsurf,220,170,200,fx/uvw,fy/uvh
AddVertex uvsurf,200,170,200,(fx+13)/uvw,fy/uvh
AddVertex uvsurf,220,150,200,fx/uvw,(fy+13)/uvh
AddVertex uvsurf,200,150,200,(fx+13)/uvw,(fy+13)/uvh

AddVertex uvsurf,220,190,200,fx/uvw,fy/uvh
AddVertex uvsurf,200,190,200,(fx+13)/uvw,fy/uvh

AddTriangle uvsurf,0,1,2
AddTriangle uvsurf,3,2,1

AddTriangle uvsurf,4,1,0
AddTriangle uvsurf,1,4,5


Wenn ich das so machen, dann ist im unteren Rechteck das gleich wie zuvor - eine 6 (logo ist ja auch nichts verändert worden)... und das obere ist einfach schwarz, ohne alles...

Jetzt habe ich aber das Problem das ich quasi bei 2 (Vertexen?) einmal oben links / oben rechts & unten links / unten rechts habe...

Wie soll ich das dann machen? Wenn ich einfach die "mittleren" Vertexe auslasse
Erstmal sorry wegen doppelpost, aber sonst müsste ich en neues Thema auf machen, weil keiner weiß das sich hier nochmal was getan hat Wink


Code: [AUSKLAPPEN]
uvw#=TextureWidth (uv)
uvh#=TextureHeight (uv)
fx=5
fy=0
fx=fx*16+1
fy=fy*16+1
AddVertex uvsurf,220,170,200
AddVertex uvsurf,200,170,200
AddVertex uvsurf,220,150,200,fx/uvw,(fy+13)/uvh
AddVertex uvsurf,200,150,200,(fx+13)/uvw,(fy+13)/uvh

AddVertex uvsurf,220,190,200,fx/uvw,fy/uvh
AddVertex uvsurf,200,190,200,(fx+13)/uvw,fy/uvh

AddTriangle uvsurf,0,1,2
AddTriangle uvsurf,3,2,1

AddTriangle uvsurf,4,1,0
AddTriangle uvsurf,1,4,5


... bekomme ich nur schwarz / weiß gestreift... horizontal


ich weiß nicht wie das gehen soll Sad

So ein Gesicht besteht ja aus ... vielen Vertexen... kann ich keine "Flächen" deklarieren?

Habe sowas gefunden:

TextureCoords textur%, koordinate%
koordinate%
0=UV-Koordinaten sind vom ersten UV-Set (Standard)
1=UV-Koordinaten sind vom zweiten UV-Set

Aber... wie schalte ich um - beim erstellen..

Jan_

Ehemaliger Admin

BeitragMo, Feb 02, 2009 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Verpacke es bitte nochmal, in ein Komplettes Ausführbares Beispiel,
und genau, wie du es haben willst, und was das Problem ist.
between angels and insects
 

onkelz89

BeitragDi, Feb 03, 2009 8:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

also erstmal ein lauffähiger Code:

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

cam=CreateCamera()
MoveEntity cam,7,4,13
TurnEntity cam,0,180,0

uv=LoadTexture("UV.JPG")

uvtest=CreateMesh()
uvbrush=CreateBrush()
BrushTexture uvbrush,uv
uvsurf=CreateSurface(uvtest,uvbrush)


uvw#=TextureWidth (uv)
uvh#=TextureHeight (uv)
fx=5
fy=1
fx=fx*16+1
fy=fy*16+1
AddVertex uvsurf,10,5,5,fx/uvw,fy/uvh
AddVertex uvsurf,5,5,5,(fx+13)/uvw,fy/uvh
AddVertex uvsurf,10,0,5,fx/uvw,(fy+13)/uvh
AddVertex uvsurf,5,0,5,(fx+13)/uvw,(fy+13)/uvh
AddTriangle uvsurf,0,1,2
AddTriangle uvsurf,3,2,1



timer=CreateTimer(60)
While Not KeyHit(1)

RenderWorld
WaitTimer(timer)
Flip
Wend



Mit der Textur die ich oben gepostet habe... man sollte eine 14 erkennen.

Jetzt mein Problem:

Ich habe nach folgendem System gearbeitet:
Code: [AUSKLAPPEN]
;Dann hast du diene 4 Punkte: 1)Oben links, 2)oben rechts, 3)unten link, 4)unten rechts
;1)
;U#=Anfanggesichtx/TextureWidth
;V#=Anfanggesichty/TextureHeight
;2)
;U#=(Anfanggesichtx+gesichtwidth)/TextureWidth
;V#=Anfanggesichty/TextureHeight
;3)
;U#=Anfanggesichtx/TextureWidth
;V#=(Anfanggesichty+gesichtheight)/TextureHeight
;4)
;U#=(Anfanggesichtx+gesichtwidth)/TextureWidth
;V#=(Anfanggesichty+gesichtheight)/TextureHeight



Zitat:
Dann hast du diene 4 Punkte: 1)Oben links, 2)oben rechts, 3)unten link, 4)unten rechts


Das ist soweit klar... nur wenn ich 6 Eckpunkte auf einer Fläche habe, oder mehr... wie setze ich dann die U und V Werte?
Ich möchte zB ein Gesicht erstellen (nicht in einem Editor) und habe als Beispiel 20 Punkte... ich möchte dann die 4 "Ecken" für meine 4 Punkte nehmen.

EDIT:

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

cam=CreateCamera()
MoveEntity cam,7,5,13
TurnEntity cam,0,180,0

uv=LoadTexture("UV.JPG")

uvtest=CreateMesh()
uvbrush=CreateBrush()
BrushTexture uvbrush,uv
uvsurf=CreateSurface(uvtest,uvbrush)


uvw#=TextureWidth (uv)
uvh#=TextureHeight (uv)


;################
fx=5                               ;##
fy=1                               ;## Hier zum Test andere Werte probieren!
;################


fx=fx*16+1
fy=fy*16+1
AddVertex uvsurf,10,5,5,fx/uvw,fy/uvh
AddVertex uvsurf,5,5,5,(fx+13)/uvw,fy/uvh
AddVertex uvsurf,10,0,5,fx/uvw,(fy+13)/uvh
AddVertex uvsurf,5,0,5,(fx+13)/uvw,(fy+13)/uvh

AddVertex uvsurf,10,10,5,fx/uvw,fy/uvh
AddVertex uvsurf,5,10,5,(fx+13)/uvw,fy/uvh

AddTriangle uvsurf,0,1,2
AddTriangle uvsurf,3,2,1

AddTriangle uvsurf,4,1,0
AddTriangle uvsurf,1,4,5


timer=CreateTimer(60)
While Not KeyHit(1)

RenderWorld
WaitTimer(timer)
Flip
Wend


Wenn ich nun diese oben angesprochenen 2 weiteren Punkte haben will, weiß ich nicht wie ich U & V setzen muss damit der Teil von der Textur einfach lang gezogen wird...


EDIT2:

Ehm,... jetzt geht es doch...

Code: [AUSKLAPPEN]
AddVertex uvsurf,10,5,5,fx/uvw,(fy+8)/uvh
AddVertex uvsurf,5,5,5,(fx+13)/uvw,(fy+8)/uvh


=> für die Teiltextur in der Mitte zu "spalten"... geht einwandfrei...

War mein Fehler, sorry Rolling Eyes

Jan_

Ehemaliger Admin

BeitragDi, Feb 03, 2009 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho, habe es mir nochmal angeschaut
kleienr Tip:
Code: [AUSKLAPPEN]
CameraClsColor(cam,128,128,128)

damit siehste deine Modells besser.
Beschreibung: Cameraclscolor
Also, Texturieren ist ganz einfach.

Code: [AUSKLAPPEN]

1-------############---2
|..####.............#..|
|.#.................#..|
|#..................#..|
#...................#..|
|#..................#..|
|.#.................####
|..#...................#
3----##################4


Hier zum Beispiel, hast du ganz ganz viele Polygone und diese alle sollen die Texture komplett wiedergeben.
1,2,3,4 sind die Eckpunkte Also 1) Oben links, 2) obenrechts, 3) unten links und 4) unten rechts
und musst du nur noch die maximale Entfernung der Punkte messen
Pythagoras im 3D raum:
Code: [AUSKLAPPEN]
weg=sqr( (x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2  )


Besser aber, du berechnest es in 2d, wenn du nur X und Y nimmst, dann ist das recht einfach.
Wir Brauchen DeltaX und DeltaY (Z lässt du ja gleich)
Delta setzt sich aus dem max und den Min zusammen Max-min = delta

Code: [AUSKLAPPEN]

xmin#=vertexx(surface,0)
xmax#=vertexx(surface,0)
ymax#=vertexy(surface,0)
ymin#=vertexy(surface,0)
for n = 0 to AnzahlVertex
  if  xmin#>vertexx(surface,n) then xmin# = vertexx(surface,n)
  if  xmax#<vertexx(surface,n) then xmax# = vertexx(surface,n)
  if  ymin#>vertexy(surface,n) then ymin# = vertexy(surface,n)
  if  ymax#<vertexy(surface,n) then ymax# = vertexy(surface,n)
next

Aber in besser ist es mit allen Werten zu rechnen

dann kannst du unsere bekannte Formel erweitern:

Code: [AUSKLAPPEN]

;Wir setzten den Ortsvektor für x = 0 Also OX=X-Xmin
OX#=X#-xmin#
OY#=Y#-ymin#
;Wir nehmen den Vektor von Xmin zu Xmax (DeltaX)
DeltaX#=Xmax#-Xmin#
DeltaY#=ymax#-ymin#
;Jetzt entspricht DeltaX=1 für unsere Texture und X liegt zwischen Xmin und Xmin + deltaX
;Also lieg OX zwischen 0 und DeltaX
;Daraus schlussfolgern wir OX/DeltaX liegt zwischen 0 und 1 --> Texturposition
PosX#=OX#/deltax#
Posy#=Oy#/deltay#
;das ganze dann noch auf unsere Gesichtsbreite in Pixeln anpassen
realgesichtspositionx = gesichtwidth*posx#
realgesichtspositiony = gesichtwidth*posy#
;nun noch die U und V werte setzten
U#=(Anfanggesichtx+realgesichtspositionx)/TextureWidth
V#=(Anfanggesichty+realgesichtspositiony)/TextureHeight



P.S.: Code kann Fehler beinhalten.
between angels and insects

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group