Frage zum logischen Aufbau eines 3D-Spieles
Übersicht

![]() |
JPDBetreff: Frage zum logischen Aufbau eines 3D-Spieles |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
ich habe ein Labyrinth, welches ca 100x100 Quadrate hat. also pro Zeile 101 Wände (Außenwand dazu gezählt) ... dies werden ja ziehmlich viele. Wie realisiert man sowas. Mein erster Versuch war, das ganze als 1 Objekt zu bauen -> FPS unter 10 ... ![]() Sollte man mit TYPE's arbeiten? ... Sollte jede Wand einzeln erstellt werden ... und dann wieder gelöscht? ... Ich komme nicht dahinter ... währe um jede Hilfe dankbar ... ![]() mfg Jan |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Würde es in "Zonen" aufteilen, 10x10 blöcke oder so. Da Blitz3D dann jene Zonen einfach ignorieren kann die nicht im Sichtbereich sind, sollte sich das sehr positiv auf die Performance auswirken.
Dann kannst du später alle anderen Objekte die du erzeugst gleich auch über EntityParent an diese Blöcke binden. Dadurch muss Blitz diese Objekte nicht einzeln testen ob sie sichtbar sind, wenn die Zone ausserhalb des sichtbereiches ist. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
JPD |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok ... 10x10er Blöcke. Währe ne Überlegung wert.
Ich hab mir inzwischen folgendes überlegt: Für das Spiel reicht es, wenn man die nächsten 3-4 Wände um sich sieht. Das währen dann ca 30-40 Wände. Wie bekommt man etwas ähnliches hin, wie den Bildschirmschoner von Win95 (3d Maze) ... also ich wollte sowas erst mal als Basis nehmen. Da wird ja jede Wand einzeln ausgeblendet und wieder eingeblendet. Sind das alles einzelne Meshes? Oder wie kann ich das vertehen? ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Der Bildschirmschoner ist 2D, die Wände die du siehst werden einfach "hingemalt" aber nicht in 3D gerendert.
Von daher wird dort einfach etwas nicht durch die CPU gezeichnet, wenns nicht gebraucht wird, kein hiden oder so. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
antome!!! gesperrt !!! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Schau dir auch mal den Befehl an:
ENTITYAUTOFADE Entity, Start#, Ende# und mit etwas Nebel in der richtigen Distanz sieht man dann die Wände nicht aufpoppen. |
||
antome |
![]() |
JPD |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok ... habe ich das nun richtig verstanden:
ich erstelle 2 Arten von Wänden. eine | und eine -- ... diese kann ich dann mit CopyEntity einen Type zuweißen. jeh nach dem ob sich die Wand im Sichtbereich befindet oder nicht, Entity ein / ausblenden ... . Autofade zur Schönheitskorrektur. Richtig? Oder totaler Schwachsinn? ![]() ?? Ausgeblendete Wände - wirken sich dann nicht mehr auf die FPS aus ?? ?? EntityAutofade verändert ja nur den Blendwert. Nicht die Sichtbarkeit, also wird diese immer noch von der Grafikkarte "unsichtbar" gezeichnet ?? ![]() |
||
antome!!! gesperrt !!! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das kannst du ja testen, wenn ich sie ausblende steigt bei mir die FPS-Rate
also nehme ich stark an sie werden dann nicht berechnet. Edit: Ist nehme an es funktioniert wie EntityAlpha Entity,0 das wird auch nicht berechnet. |
||
antome |
![]() |
JPD |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok ... wenn das Grundprinzip mal steht melde ich mich wieder ![]() Grüße Jan |
||
![]() |
JPD |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok. Ich weiß jetzt was das Problem ist. Mein Grundwissen. Also ich habe mal 2 - 3 Grundlegende Fragen: ![]() Ich bekomm keine Logik bei meinem Aufbau zusammen, Wie issen das jetzt? Liege ich hier richtig? - Ein Mesh besteht aus einem Surface und einem Brush ... - Ein Surface beschreibt X Y Z, und U V W ... - Das Brush ist die Textur, welche das Surface verwendet ... ---- Ich frage mich immernoch. Wie bekomme ich verschiedene Texturen auf 1 Mesh. Oder soll ich pro "Quadrat" 1 Mesh erstellen. Wieviel Mesh's kann Blitz3d verwalten. Isch blicks irgendwie ned ... ![]() mfg Jan |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Eine Surface beschreibt Vertices (Positionen im Raum) und Triangles (Dreiecke die vorher angegebene Punkte verbinden). Eine Textur ist nur auf einem Triangle sichtbar und nur auf der richtigen Seite.
Wie du das ganze machst, liegt bei dir. Eine Möglichkeit wäre alles mit CreateCube machen. Aber du kannst auch manuell alles der Surface hinzufügen (wär jedoch fortgeschrittene Programmierung) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
JPD |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok. Und! In einem Mesh können mehrere Surfaces sein? Glaub ja? Dann währe das Problem gelößt ![]() Jan ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja können ![]() Kannst mit CreateSurface(mesh) eine neue hinzufügen |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
JPD |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok. Das hat mir schonmal viel geholfen. Danke, ![]() |
||
![]() |
JPD |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah noch ne kleine Frage:
Das hier hab ich: Code: [AUSKLAPPEN] x----x----x | | | | A1 | A2 | | | | x----x----x Mein Problem was ich letztens hab: Ich hab 6 Vertex'e ... Möchte aber, dass A1 ne andere Textur hat wie A2 ![]() mfg Jan |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ähm, man, das wird schwierig sein zu erklären. Hätte ich mal ein bischen Webspace um Zeichnungen hochladen zu können... Nehmen wir mal dein Beispiel und ändern das ein bischen um.Code: [AUSKLAPPEN] 1-----2-----3
Hier hast du 6 Vertices und 4 Triangles. Jetzt willst du im 'Quader A' (Triangles a1, a2) eine andere textur als im Quader B. Du kannst es zB so lösen: Du lädst ein Brush zB so Global brush=LoadBrush("bild.png",4,256,256). Die letzten beiden Zahlen geben die X/Y-Auflösung des Bildes wieder (ist Sinnvoll, sonst wird die U/V-Positionierung schwierig). In der Bilddatei kann dann alles mögliche an Texturen und anderen schönen Dingen eingezeichnet werden | a1 /| b1 /| | / | / | |/ a2 |/ b2 | 4-----5-----6 ![]() Eine wesentlich einfachere Möglichkeit ist, man erstellt soviele Surfaces wieviele Texturen (sollten nicht zu viele werden) man im Spielfeld anwenden möchte, und packt das ganze dann in ein Mesh. Mit AddVertex wird dann halt die Textur schon im vorwege ausgesucht. *Hier ein Code-Beispiel des ersten Beispieles im text:Code: [AUSKLAPPEN] v1=AddVertex(Surface,-1,+1,0, 0,0)
v2=AddVertex(Surface,+1,+1,0, 63,0) v5=AddVertex(Surface,+1,-1,0, 63,63) v4=AddVertex(Surface,-1,-1,0, 0,63) AddTriangle(Surface,v1,v2,v5) AddTriangle(Surface,v2,v5,v4) |
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
@hectic: Was erzählst du dem armen Kerl da? Seit wann gibt man UV-Koordinaten denn in Pixel an? Eine UV-Koordinate ist ein Wert zwischen 0.0 und 1.0, also quasi prozentual (was ja auch ein riesiger Vorteil ist, wenn man sich entschliesst, mal eine Textur in einer anderen Größe zu benutzen).
@JPD: Bei deinem Beispiel müsstest du für die zwei Punkte, die von BEIDEN Quadraten benutzt werden, vier Punkte benutzen, so das jedes Quadrat seine eigenen zwei Punkte hat. Nur so kannst du in beiden Quadraten wirklich völlig unabhängige Bereiche einer Textur anzeigen. |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
JPD |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, ich habe das nun so gelöst:
1) Schleife welche ein Brush erstellt und zwar so: Code: [AUSKLAPPEN] MeineTextur = LoadAnimTexture("texturen.bmp",256,256,0,31) dim MeinBrush(30) For i = 0 to 30 MeinBrush(i) = CreateBrush() BrushTexture MeinBrush(i), MeineTextur, i Next Nun verwende ich bei jedem Mesh so viele Surfaces wieviel ich brauche, welche allle auf das gleiche Brush verweißen. 1 Mesh enthält einen Block von 5x5 Bodenstücken, also 50 Triangeln. Habe mal zu Testzwecken einen Boden aus 50x50 Elemten aufgebaut. Das wären: 50x50x50 = 125000 Triangeln. Die FPS ist dabei von 700 auf 150 gesunken. Allerdings mach ich das so, dass ich wie gesagt die einzelnen Meshes aus- und einblende. Somit komm ich dann wieder auf ca 300-400 fps. Mal schauen. Heute Abend werd ich mich mal an die Wände machen. Im Endeffekt habe ich dann ca 10 Surfaces pro Mesh. Und ca 200 Meshes im Spiel. D.h. 2000 Surfaces, welche auf 31 Brushes verweißen. Anders hab ichs ned hinbekommen. Was meint ihr dazu? |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
2000 Surfaces??? ![]() Du brauchst doch pro Mesh nur ein einziges! Les dir die beiden Posts über deinem nochmal durch... |
||
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans! Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hilfe! Nein, nein, nein ![]() Ausserdem erstellst du in deinem Beispiel massig Brushes, ohne sie wieder zu löschen. Nach dem Auftragen eines Brushes solltest du diesen wieder befreien. Ein Brush ist kein Mesh, sondern nur eine Sammlung von Eigenschaften. Und es ist auch gar nicht nötig, jedesmal einen neuen Brush zu erstellen, da in deinem Beispiel ja eh alle gleich sind. Also nur EINMAL erstellen und damit alles anpinseln, danach den Brush wieder löschen. Wenn du für dein ganzes Labyrinth nur eine Textur (z.B. Stein) benutzt, könntest du alles in einer einzigen Surface eines einzigen Meshes unterbringen. Das wäre aber wiederrum schlecht, weil dann IMMER das ganze Labyrinth gezeichnet wird, egal ob man nur zwei Mauern davon sieht und die anderen verdeckt sind. Eine Lösung wäre hier, das Labyrinth-Mesh immer wieder neuzuzeichnen, z.B. nur mit den Mauern darin, die der Spieler auch sieht. Aber alle eben, soweit möglich, in einer einzigen Surface. Oder eben in Sektoren aufteilen, wie Dreamora schon sagte. |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
JPD |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nunja:
Mein Programmablauf: 1) Schleife um Brushes zu erstellen 2) Kreieren der Meshes (Zugriff auf die Brushes von 1 mittels Surfaces) 3) Löschen der Brushes ... weiterer ablauf ... Zu der UV-Map: Eine Textur ist weiß, die nächste Schwarz. So. ich habe dann eine weiße Fläche. an den Rändern, bzw. Kacheln sieht man die Schwarzen ränder der nebenstehenden Textur ... deshalb mehrere Surfaces .... ![]() Wie soll ich das denn sonst machen? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group