Single Surface, Texturen, Menschen - Fragen [erledigt]
Übersicht

onkelz89Betreff: Single Surface, Texturen, Menschen - Fragen [erledigt] |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das klingt doch schon einmal sehr gut und recht einfach ![]() Werde es heute Abend testen, bin mom auf der Arbeit und habe kein Blitz hier ![]() Danke! Zu den Anderen Fragen - vllt weiß ja Jemand anders Rat |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ah genau, so dachte ich mir das auch, also für jedes Feld nur eine Gruppe.
Das klingt gut ![]() 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... |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Ist jetzt vielleicht eine blöde Idee... ![]() ...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? ![]() |
||
onkelz89 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Auf jeden Fall danke ich für die Idee ![]() Werde es definitiv testen! |
||
onkelz89 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstmal sorry wegen doppelpost, aber sonst müsste ich en neues Thema auf machen, weil keiner weiß das sich hier nochmal was getan hat ![]() 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... 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 ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group