Textur auf einem Mesh ermitteln[3D]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Dottakopf

Betreff: Textur auf einem Mesh ermitteln[3D]

BeitragMi, Dez 09, 2009 18:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Blitzer!

ich hantiere seit einigen Tagen mit den 3D Befehlen von Blitz herrum. Ich habe ein MeshTerrain erstellt und es in Gile[S] mit Objekten bestückt und beleuchtet. =1 komplettes "Level Mesh".

Jetzt wüsste ich aber ganz gerne,im Spiel, auf was für einer Textur sich gerade der Spieler befindet bzw. Kollidiert(Stein, Gras) etc... Leider kann ich keinen Befehl/Möglichkeit finden, wie das ermitteln kann.


Könnte mir da jemand weiterhelfen?


Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!
  • Zuletzt bearbeitet von Dottakopf am Fr, Dez 11, 2009 17:36, insgesamt einmal bearbeitet

ToeB

BeitragMi, Dez 09, 2009 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Du müsstest einen Editor schreiben wo man "Zonen" setzt, also wie ein Array auf dem MeshTerrain, das bei x/z Koordinten speichert welchen unergrund es hat.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Dottakopf

BeitragMi, Dez 09, 2009 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deine Schnelle hilfe

das wäre aber doch recht zeitaufwändig nochmal die map mit "Zones" zu belegen und vorallem trotzdem irgendwie ungenau .. z.B. Bei eliptischen bzw. koplexen formen.


Evt. gibts ja noch eine andere Lösung ? evt. *.bsp maps, gemacht mit "Hammer" von source sdk. (sofern mit Blitz kompatiebel)

Man muss doch irgendwie abfragen können welche Textur gerade an dieser Position auf dem Mesh liegt, schließlich würde es ja irgendwann auch mal von Blitz an diesen Koordinaten Textuiert.

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

skey-z

BeitragMi, Dez 09, 2009 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest zumindest die Farbe herausfinden, die gerade unter dem Spieler ist.

Dazu musst du die Position des Spielers ermitteln, dadurch kannst du die nahen Vertices herausfinden und deren VertexRed/Green/Blue-Anteil herausfinden.

Das könntest du auch beim laden der Map machen und in ein Array eintragen, somit hättest du die Zonen, wie zuvor beschrieben und könntest in einem 2D-Array die verschiedenen Untergründe darstellen und sie immer wieder abfragen ohne während der laufzeit große berechnungen durchzuführen.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

NightPhoenix

BeitragMi, Dez 09, 2009 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Willst du "Laufsounds" den Unterboden angepasst abspielen?
Also für Gras ein anderer Sound beim laufen als auf Stein?

Falls ja:
Ich hab das immer über Kollision verschiedener EntityTypes gemacht. Such mal über FindChild die entsprechenden Bodenteile und weise ihnen unterschiedliche EntityTypes zu. Dann EntityCollided auf die Böden und entsprechend den Sound wiedergeben.

Ansonsten:
Dieser Post existiert nicht. Wink

Dottakopf

BeitragDo, Dez 10, 2009 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bräuchte diese info für verschiedene sachen, Beispiel: Trifft ein schuss eine Holzkiste, dann sollen "braune" partikel fliegen wird Gras getroffen sollen "grüne" partikel fliegen...

Und natürlich die Laufsounds.

NightPhoenix: "FindChild" ja sowas in der Art habe ich mir schon gedacht, aber kann ich hier noch ein Child finden ? im endeffekt lade ich ja nur 1 Mesh. Hier sind schon alle objekte "fest verbaut"(kisten,fässer+Terrain mit mehreren Layern).

Skey-z
Zitat:

Dazu musst du die Position des Spielers ermitteln, dadurch kannst du die nahen Vertices herausfinden und deren VertexRed/Green/Blue-Anteil herausfinden.


sehr gute Idee! Ich werde mir gleich morgen mal die Notwendigen Befehle dafür ansehen und gucken wie weit ich komme. Klingt aber nach einer eleganten lösung. Surprised

Danke für eure schnelle Hilfe!

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

SYSThern

BeitragDo, Dez 10, 2009 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

;***** GetTexture  *****

Function GetTexture(entity,blend,flag,entity_tex)
   
   Local surf= GetSurface(entity, 1)
   Local entity_brush = GetSurfaceBrush(surf)
   entity_tex = GetBrushTexture(entity_brush, 0)
   TextureFilter entity_tex,flag
   TextureBlend entity_tex,blend
End Function


dieser code funktioniert nur bei einer texture...

also nicht surface abhängig ich denke aber das das prinzip verständlich ist

mfg SYSThern
Tools and Programms
--------------------
www.systhern.de
 

BIG BUG

BeitragDo, Dez 10, 2009 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit TextureName$ kriegt man dann auch den Namen der Textur...
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Dottakopf

BeitragFr, Dez 11, 2009 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
hm irgendwas mache ich noch falsch...

ich ermittele mithilfe von "EntityPick" das mesh auf dem ich mich befinde. Und lese die Farben der Vertexe aus auf denen sich der Spieler befindet. Nur irgendwie bekomme ich immer als Farbwert "255,255,255" raus.


~EDIT~ Mir ist gerade aufgefallen, das man dem Mesh mit vertexcolor erst eine Farbe zuweisen muss Shocked
aber das kanns doch nicht sein oder ???

Code: [AUSKLAPPEN]


For i = 0 To CountVertices(boden_surface) - 1
VertexColor(boden_surface, i, Rand(0, 255), Rand(0, 255), Rand(0, 255))
Next




hier ein kleiner code der meinen Fehler kurz und bündig veranschaulicht:
Code: [AUSKLAPPEN]

Graphics3D 800,600,16,2
SetBuffer BackBuffer()


;---------------------------start up---------------------
;globals
Global boden_surface

;arrys
Dim vert_r(3)
Dim vert_g(3)
Dim vert_b(3)


;light
AmbientLight(127,127,127)
l=CreateLight()
RotateEntity l,90,0,0
;cam
cam=CreateCamera()
MoveEntity cam,0,2,-2
;---------------------------------------------------------




;boden
boden=CreateCube()
MoveEntity boden,0,0,5
ScaleEntity boden,2,0.5,2
EntityPickMode boden,2
EntityColor boden,10,255,10
boden_surface=GetSurface(boden,1)


;check cube
ccube=CreateCube()
PositionEntity ccube,0,3,5
ScaleEntity ccube,.5,.5,.5
TurnEntity ccube,90,0,0 ;<- nach unten drehen für entitypick!







While Not KeyHit(1)





     EntityPick(ccube,10) ;entity auswählen
      triangle = PickedTriangle() ;triangle ermitteln
      For i = 1 To 3
         vertex = TriangleVertex(boden_surface, triangle, i) ;farbe ermitteln
         vert_r(i) = VertexRed(boden_surface, vertex)
         vert_g(i) = VertexGreen(boden_surface, vertex)
         vert_b(i) = VertexBlue(boden_surface, vertex)
      Next

   
   
   
   


UpdateWorld
RenderWorld



    ;ermittelte farben ausgeben
   For i = 1 To 3
      Text i * 100, 25, "Vertex " + i
      Text i * 100, 40, "Red :" + vert_r(i)
      Text i * 100, 55, "Green:" + vert_g(i)
      Text i * 100, 70, "Blue :" + vert_b(i)
   Next
   
   
   ;restliche infos...
   Text 0,400,"Picked mesh "+ EntityPick(ccube,10)
   Text 0,420,"Picked triangle " +PickedTriangle()

Flip

Wend
End


Rein theoretisch müsste doch jetzt alles klappen. Ich bin jetzt erhlich gesagt etwas überfragt Confused

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

mpmxyz

BeitragFr, Dez 11, 2009 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Vertices sind standardmäßig mit der Farbe $FFFFFFFF gefärbt... Das ist ganz normal.
Die Farben, die du siehst kommen erst von den Texturen des Meshes.
Wenn du nicht sowieso die Position und Umgebung des Spielers anhand der Farbe des nächsten Vertexes herausfinden möchtest, warum machst du das nicht über das "gepickte" Dreieck?

Vielleicht ist es auch effektiver anhand der Position des Spielers die Umgebung zu bestimmen.
Dann müsstest du bei einer Spielfläche, die die dritte Dimension eher wenig nutzt, nur eine zweidimensionale Karte, anhand der du die Spielerumgebung bestimmst, erstellen.
Und selbst bei einer dreidimensionalen Umgebung lässen sich dann entsprechende "Umgebungsboxen" aufstellen.

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Dottakopf

BeitragFr, Dez 11, 2009 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deinen Tipp

allerdings habe ich es auch schon mit einem Texuriertem Mesh Terrain versucht, aber auch hier bekomme ich nur die Standart Farbe(255,255,255)
Muss man die Farbe den einzelnen Vertexen erst zuweisen ?

Zitat:

Wenn du nicht sowieso die Position und Umgebung des Spielers anhand der Farbe des nächsten Vertexes herausfinden möchtest, warum machst du das nicht über das "gepickte" Dreieck?


Tut mir leid aber ich weis nicht was du meinst Embarassed


ich habe gerade noch etwas rumgetüftelt und dabei ist mir folgendes Aufgefallen:

->für jede Texture die auf meinem Mesh liegt, wird ein Surface erstellt welches mit countsurfaces() abgefragt werden kann

-> Mit Getsurfacebush und anschließend mit GetBrushTexture kann ich die jeweilige Texture auf diesem Surface abfragen(Mit Texturename dann auch noch die genaue Texturbezeichnung).

-> Problem: Mir fehlt eine Methode um zu ermitteln auf welchem der Surfaces ich mich(abhängig von der Spielerposition) befinde. Sprich ich brauch diesen index.

-> Nächstes Problem: scheinbar werden nur 8 surfaces(index0-7) unterstützt was mich dann auch auf 8 Texturen beschränkt... = ganz schön doof


Man das nervt am Proggen, scheinbar ein ganz simples Problem.. und dann wirds gigantisch komplex... Mad

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Silver_Knee

BeitragFr, Dez 11, 2009 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm suchs dir aus:

PickedSurface oder CollisionSurface

je nachdem mit welcher Technik du arbeitest

Dottakopf

BeitragSa, Dez 12, 2009 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah danke Silver !


so jetzt funtz das ganze, allerdings ziemlich ungenau Smile!
Irgendwie beschleicht mich auch langsam das Gefühl, das ich die ganze sache total falsch angehe.

Momentan klatsche ich einfach alles zu einem Kompletten Mesh level zusammen(Terrain,Kisten,Fässer..)
Und das mache ich nur aus einem Grund, den lightmaps...

Am liebsten würde ich das Terrain als Meshterrain anfertigen(wegen Texturübergängen) und anschließend die Objekte(Kisten..) mit einem Editor "hineindroppen".

Problem: wie bekomme ich das jetzt realistisch beleuchtet? Blitzlichter kann ich ja Vergessen, da gehen ja nur 8 oder 7...

Wie würdet Ihr es umsetzen? bzw. wo/wie könnte ich mich über diese Thematik genauer einarbeiten/einlesen?

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Silver_Knee

BeitragSa, Dez 12, 2009 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm kannste ja mit LoadAnimMesh laden. Dann sind alle offiziell als "unterobjekte" markierten dinge nicht nur surfaces sondern meshes.

Dottakopf

BeitragSa, Dez 12, 2009 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
öhm also meinst du so ?

meshterrain erstellen, in giles alles zusammenklicken(terrain und kisten usw..) , beleuchten , als ein mesh speichern, mit loadanimmesh laden, und nun kann ich die Kisten und co. mit z.b. findchild ansprechen ?


Könnte ich eigentlich auch die devil shadow energie nutzen um Terrain und Objekte zu "beleuchten" ?
Angeblich soll die ja nicht so flott bei vielen Polys sein (und ich denk mal die ganze map zu bleuchten sind viele viele Polys)

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Silver_Knee

BeitragSa, Dez 12, 2009 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
nene Lightmaps sind nicht ohne grund in vielen spielen vorberechnet. Wenn sich die Lichtverhältnisse nciht ändern, warum dann alles per laufzeit berechnen.

Dein weg hört sich gut an. Wenn giles diese "Gruppen" Kiste etc auchnoch bennen kann kannste die auch über deren namen wieder in blitz finden.

Dottakopf

BeitragSa, Dez 12, 2009 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
ja also bin jetzt nicht wirklich der giles crack Smile
Aber man konnte jedem Objekt das geladen wurde einen namen geben. Wie das dan weiter behandelt wird ka...

Ich tüftele mal dran rum..

~Edit~ Hat wunderbar funktioniert!

für interesierte, so wurde es gemacht :

Arrow Komplettes Meshlevel in Giles zusammensetzen(objekte,kisten,beleuchten) +sinnvolle Namensvergabe!
Arrow Level mesh mit loadanimmesh laden
Arrow Achtung.. damit die kollisionen nun wieder richtig funzen, muss Entitytype als rekrusiv gesetzt werden: "Entitytype level, 2 , 1
Arrow Mit dieser Funktion kann man sämliche Childs(also alle objekte auf der map) einen Pickmode zuweisen. Somit kann man diese dan auch ganz easy mit Entitypick abfragen

Code: [AUSKLAPPEN]

;allen childs eines animierten objektes den pickmode zuweiden
Function EntityPickModeRec(Entity,geometrie,verdecken=1)
   If Not Entity Then Return

   
   EntityPickMode Entity,geometrie,verdecken     

   For i = 0 To CountChildren(Entity)
      ent = GetChild(Entity,i)
      EntityPickModeRec(ent,geometrie,verdecken)
   Next

End Function



Arrow Einfach beim laden der Map statt "Entitypickmode" diese funktion aufrufen
Arrow Fertig, nun kann man auf dem Level abfragen was man möchte.



Achja.. mit dieser Funktion hier kann man abfragen welche Texture auf einem Gepickten Surface liegt.


Code: [AUSKLAPPEN]

Function get_player_groundinfo(mesh%,distance%)
robo_onground=0:robo_onmesh=0:robo_ontexture=""


          If EntityPick(mesh,distance)<>0 Then 
         
            entity_brush = GetSurfaceBrush(PickedSurface())
            entity_tex = GetBrushTexture(entity_brush, 0)
         
             robo_ontexture=TextureName(entity_tex)
             robo_onmesh = EntityName(EntityPick(mesh,distance))
             robo_onground=1
         End If
         
         
End Function



Danke!
Gurß
Dottakopf

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group