Textur auf einem Mesh ermitteln[3D]
Übersicht

![]() |
DottakopfBetreff: Textur auf einem Mesh ermitteln[3D] |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Ansonsten: Dieser Post existiert nicht. ![]() |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() Danke für eure schnelle Hilfe! Gruß Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
SYSThern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mit TextureName$ kriegt man dann auch den Namen der Textur... | ||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() Gruß Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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... ![]() Gruß Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm suchs dir aus:
PickedSurface ![]() ![]() je nachdem mit welcher Technik du arbeitest |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah danke Silver !
so jetzt funtz das ganze, allerdings ziemlich ungenau ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm kannste ja mit LoadAnimMesh laden. Dann sind alle offiziell als "unterobjekte" markierten dinge nicht nur surfaces sondern meshes. | ||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
ö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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja also bin jetzt nicht wirklich der giles crack ![]() 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 : ![]() ![]() ![]() ![]() 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 ![]() ![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group