Frage zum logischen Aufbau eines 3D-Spieles

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

JPD

Betreff: Frage zum logischen Aufbau eines 3D-Spieles

BeitragFr, März 17, 2006 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ... Confused ...

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 ... Wink

mfg Jan
 

Dreamora

BeitragFr, März 17, 2006 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, März 17, 2006 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Wink
 

Dreamora

BeitragFr, März 17, 2006 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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 !!!

BeitragFr, März 17, 2006 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, März 17, 2006 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Wink

?? 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 ??

Shocked Jan
 

antome

!!! gesperrt !!!

BeitragFr, März 17, 2006 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, März 17, 2006 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok ... wenn das Grundprinzip mal steht melde ich mich wieder Wink

Grüße Jan

JPD

BeitragSa, März 18, 2006 3:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok. Ich weiß jetzt was das Problem ist. Mein Grundwissen. Also ich habe mal 2 - 3 Grundlegende Fragen: Confused

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 ... Rolling Eyes Kann mir da mal jemand auf die Sprünge helfen.

mfg Jan
 

Dreamora

BeitragSa, März 18, 2006 3:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, März 18, 2006 3:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok. Und! In einem Mesh können mehrere Surfaces sein? Glaub ja? Dann währe das Problem gelößt Wink

Jan Smile
 

Dreamora

BeitragSa, März 18, 2006 3:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja können Smile
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

BeitragSa, März 18, 2006 3:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok. Das hat mir schonmal viel geholfen. Danke, Cool

JPD

BeitragSa, März 18, 2006 3:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Shocked - Muss ich nun für A2 nochmal 2 Vertexe erstellen, welche auf ein anderes Surface verweißen?

mfg Jan

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 18, 2006 4:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ä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
| a1 /| b1 /|
|  /  |  /  |
|/ a2 |/ b2 |
4-----5-----6
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 Very Happy Man muß halt nur bei AddVertex(Surface,0,0,0,U,V) das Positionieren den U/V (X/Y) -Koordinaten dann richtig machen. Als Beispiel: Würde die Bilddatei 256x256 groß sein und 16 (4x4) Texturen beeinhalten, dann währe die erste Textur im Bereich von U=0 bis 63, V=0 bis 63*, Zweite Textur U=64 bis 127, V=0 bis 63 und das ganze Zeilenweise. Man kann dadurch auch unterschiedlich große Texturen in die Bilddatei einbringen. Allerdings gibt generell ein Problem, das es immer einen kleinen 'Überlauf' der Texturen zur nächsten gibt. Daher würde ich erstmal das ganze nur so anwenden, wenn die Textur nicht gekachelt werden soll, oder ganz viel Mühe dabei geben.

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

BeitragSa, März 18, 2006 9:08
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragSa, März 18, 2006 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, März 18, 2006 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
2000 Surfaces??? Shocked
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

BeitragSa, März 18, 2006 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hilfe! Nein, nein, nein Shocked Kein Wunder, daß die Framerate in den Keller sinkt. Man sollte Surfaces sparen, wo es nur geht -denn gerade DAS zieht die Performance in den Keller. Du ballerst aber mit Surfaces nur noch so in der Gegend herum.

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

BeitragSa, März 18, 2006 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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 .... Shocked

Wie soll ich das denn sonst machen?

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group