texturieren von createmesh()

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

darth

Betreff: texturieren von createmesh()

BeitragDo, Feb 08, 2007 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
hi,
ich kreiere eine mesh, schön mit
Code: [AUSKLAPPEN]
mesh=createmesh()
brush=createbrush()
surface=createsurface(mesh,brush)

dann füge ich mit addvertex() punkte und mit addtriangle() trigs hinzu.
danach lade ich eine textur, schön mit
Code: [AUSKLAPPEN]
tex=loadtexture("tex.jpg")

dann möchte ich die mesh texturieren damit, also
Code: [AUSKLAPPEN]
entitytexture mesh,tex

aber das geht nicht. die mesh nimmt zwar eine andere farbe an, sonst passiert aber nichts => keine textur.
als nächstes habe ich das hier probiert:
Code: [AUSKLAPPEN]
brush=loadbrush("tex.jpg"
paintmesh mesh,brush

aber auch das hat leider nicht funktioniert.
nun stellt sich die frage: ist es überhaupt möglich, selbst erstellte objekte (die eine brush haben, haben müssen - für das surface) "ordentlich" (mit verzerrungen halt, falls) zu texturieren?
die meshs sind auf entityfx 16
ANM: farben gehen ohne problem, also entitycolor mesh,r,g,b
Diese Signatur ist leer.
 

Dreamora

BeitragDo, Feb 08, 2007 0:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mesh ist sauber texturiert.
Das Problem ist das du keine UV koordinaten angeben hast, also haben alle Vertices die UV Koordinate 0,0, was dem pixel links oben auf der Textur entspricht.
Musst dir überlegen welche Texturteile wo auf dem Mesh zu liegen kommen sollen und die entsprechenden Werte bei addVertex mit einfügen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Do, Feb 08, 2007 0:53, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Feb 08, 2007 0:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei ql:AddVertex gibt es weitere Parameter [u],[v] damit machst du dir dein eigenes UV-Maping für jedes Vertice einzelnd. Zufuss sozusagen. Wink

Standardmässig ist u=0,v=0 links/oben eines Images und u=1,v=1 rechts/unten. Ausserdem empfielt sich LoadBrush() da ich mir jetzt nicht sicher bin, ob mit LoadTexture eigenes UV-Maping erlaubt?
 

Problemchen

BeitragDo, Feb 08, 2007 10:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, LoadTexture ist kein Problem in Verbindung mit Brushes, das funktioniert ganz gut. Hab's in etwa so eingesetzt:
Code: [AUSKLAPPEN]
gtex_wand=LoadTexture ("textiles/wand/wand001.bmp")
BrushTexture gtex_wand_brush,gtex_wand
[..]
PaintSurface tempsurfacewand,gtex_wand_brush

Problemchen

darth

BeitragDo, Feb 08, 2007 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
@dremora,hectic:
also einfach die mappingmethode wählen (zylindermap z.b) und dann bei den addvertexen einfügen? und der triangle wird dann automat. ergänzt?
angenommen also
Code: [AUSKLAPPEN]
addvertex(surf,0,0,0,0,1)
addvertex(surf,25,0,0,1,1)
addvertex(surf,25,25,0,1,0)

und dann wird alles dazwischen stetig ergänzt? (der punkt neben dem vertex hat dann die u von 0+1/breite usw.)

@problemchen:
geht nicht :/
Diese Signatur ist leer.
 

Problemchen

BeitragDo, Feb 08, 2007 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
@darth gamer: Natürlich geht es, nur musst du auch wie oben schon beschrieben die Texturkoordinaten setzen, das hatte ich nicht extra nochmal erwähnen wollen.
Code: [AUSKLAPPEN]
Const xscr=1024
Const yscr=768
Const dscr=32

Graphics3D xscr,yscr,dscr,0
SetBuffer BackBuffer()
SeedRnd MilliSecs()
HWMultiTex True
WBuffer enable
camera=CreateCamera()
PositionEntity camera,0,0,-25
CameraRange camera,.1,65535
light=CreateLight()
PositionEntity light, 50,50,-10

;Daten vorbereiten
  einetextur=LoadTexture ("1.bmp")
  einbrush=CreateBrush()
  BrushTexture einbrush,einetextur
  einmesh=CreateMesh()
  einesurface=CreateSurface(einmesh)

;Texturkoordinaten definieren (Hier mal Werte durchprobieren)
  t0u#=1   :   t0v#=1
  t1u#=0   :   t1v#=1
  t2u#=0   :   t2v#=0
  t3u#=1   :   t3v#=0

;Punkte zur Surface hinzufügen
  v0 = AddVertex (einesurface,0,   0,   0,   t0u#,t0v#)
  v1 = AddVertex (einesurface,10,   0,   0,   t1u#,t1v#)
  v2 = AddVertex (einesurface,10,   10,   0,   t2u#,t2v#)
  v3 = AddVertex (einesurface,0,   10,   0,   t3u#,t3v#)

;2 Dreiecke bilden
  AddTriangle(einesurface,v3,v2,v0)   
  AddTriangle(einesurface,v2,v1,v0)

;Die Surface (eben die beiden Dreiecke) einfärben
  PaintSurface einesurface,einbrush

;Positionieren
  PositionEntity einmesh,0,0,0


;Mainloop
While Not KeyDown( 1 )
   RenderWorld
   Flip
Wend
End


Nimm eine beliebige Textur, gut wäre eine mit Schrift um Spiegelungen zu erkennen und spiele ein bischen mit den Werten bei t0u#/t0v# bis t3u#/t3v#, dann erkennst du den Zusammenhang Wink
Problemchen
 

Dreamora

BeitragDo, Feb 08, 2007 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
darth gamer hat Folgendes geschrieben:
@dremora,hectic:
also einfach die mappingmethode wählen (zylindermap z.b) und dann bei den addvertexen einfügen? und der triangle wird dann automat. ergänzt?
angenommen also
Code: [AUSKLAPPEN]
addvertex(surf,0,0,0,0,1)
addvertex(surf,25,0,0,1,1)
addvertex(surf,25,25,0,1,0)

und dann wird alles dazwischen stetig ergänzt? (der punkt neben dem vertex hat dann die u von 0+1/breite usw.)


Ja, die Texturkoordinate auf einem Dreckeck wird zwischen den UV Koordinaten der Vertices interpoliert.

Allerdings hat die Textur nur koordinaten von 0,0 bis 1,0. Alles was drüber ist, kommt links wieder rein. (sag ich nur weil dein Satz in klammern den ich fett gemacht, nicht umbedingt sinn macht)
Wenn du also zb ein Gitter machst, das 1x mit der Textur belegt sein soll, so musst du die UVs entsprechend berechnen (U / V Schritt ist 1.0 / AnzahlUnterteilungen = 1.0 / (AnzahlVerticesProSeite - 1) )
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

darth

BeitragDo, Feb 08, 2007 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
macht er doch :O
wenn man annimmt dass die breite des trigs dem abstand der beiden punkte entspricht (also nur eine koordinate verschieden) dann ist der bei einer stetigen unterteilung die verschiebung 1/breite also 1/abs(x2-x1). das war damit gemeint...
gut, wenn das so ist werd ich wohl tippen müssen,
thx
Diese Signatur ist leer.
 

Dreamora

BeitragDo, Feb 08, 2007 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
In einem Dreieck gibt es keine Unterteilung. Und du sagtest das es von 0 - 1 geht in den UV. Deswegen machte die Formel da 0 Sinn, denn die UV Koordinate 1 ist bereits das Ende der Textur (sie geht nicht von 0 bis Texturbreite, sondern 0 bis 1).

Aber wenn du damit ein Gitter / QuadStreifen gemeint hast wo an einem Ende U = 0 und am anderen U = 1, dann machts Sinn.
Auch wenn die Formel dann immer noch falsch ist Razz
Denn es wäre (x2 - x1) / gesamtBreiteStreifen
Es müssen definitiv die beiden x und die Gesamtbreite vorkommen, wenn etwas davon fehlt kann sie nicht stimmen da die Relation nicht existiert von "Teil zum Ganzen = U zu 1" (einfach ausgedrückt)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Feb 08, 2007 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Darth Gamer, weil deine Überschrift 'texturieren von createmesh()' heisst, will ich noch was hinzufügen. Wenn du zB LoadBursh bei den Parametern [,SkalU] und [,SkalV] jeweils die Texturbreite und Höhe angibst, dann brauchst du nichts umrechnen, da es dann BB für dich macht. Als Beispiel eine bild.png mit einer Kantenlänge von 256 Pixel geladen mit LoadBrush("bild.png",3,256,256) erlaubt dir dann das Angeben der UV-Koordinaten pixelweise. Lediglich muß beachtet werde, dass ein Pixel erst ab Position 0.5,0.5 beginnt.

darth

BeitragDo, Feb 08, 2007 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
das umrechnen ist kein problem :/ das schaff ich. was mich nervt ist das doofe tippen... naja Sad ich werds wohl schaffen glaub ich. (oder ich lass es weg :O)

[edit]
gut, ich habs geschafft. allerdings sieht es zT abartig doof aus Very Happy
ich arbeite mit zylindermapping. d.h die u koordinate ist ein winkel und v die höhe. für u multipliziere ich (skalarprodukt) den vektor (0/0/-1) mit dem vektor (xpunkt-entityx()/0/zpunkt-entityz()). das gibt einen wert zwischen -1 und 1.
im code:
Code: [AUSKLAPPEN]
    uk#=(EntityZ(o\mesh)-v\koo[3])/Sqr((v\koo[1]-EntityX(o\mesh))^2+(v\koo[3]-EntityZ(o\mesh))^2)+.5
 If uk#>1 Then uk#=uk#-1
 If uk#<0 Then uk#=1+uk#
vk#=(EntityY(o\mesh)-v\koo[2])/MeshHeight(o\mesh)+.5
 If vk#>1 Then vk#=vk#-1
 If vk#<0 Then vk#=1+vk#[quote]
im raytracer nachher sieht es eigentlich ganz iO aus, aber hier mit den "schrägen" dreiecken und der stetigen ergänzung gibt es seltsame resultate.
mache ich irgendwo ein fehler in der rechnung?[/quote]
Diese Signatur ist leer.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group