3D Tilemap

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Inso

Betreff: 3D Tilemap

BeitragFr, Nov 25, 2011 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu.. da alle meine versuche bisher fehlschlugen hab ich mir überlegt das mapping in etwa wie bei minecraft umzusetzen(wobei das spielprinzip ein anderes sein wird).

nun hab ich mich mal eben drüber gemacht und probiert das ganze über ein array zu lösen..
doch leider ist das ganze seeeehr seeeehr langsam, und das selbst bei einer vergleichsweise kleinen map
ist alles sehr sehr laggy, und die texturen flackern hart.

vielleicht weiß jemand eine bessere lösung als meine, hier im anhang der code:
edit: hab mal die camerarange drastisch reduziert auf 160,
läuft flüssiger, aber die texutren flackern immernoch, und richtig flüssig isses immernoch nicht =(



Code: [AUSKLAPPEN]

AppTitle "3D Funktionalitätstest"

Graphics3D 1024,768,16,2


KEY_ESCAPE=1
KEY_A=30
KEY_D=32
KEY_S=31
KEY_W=17
KEY_E=18
KEY_Q=16
;Umgebung erstellen, angefangen mit Kamera und Licht

Global camera=CreateCamera() ; Spieler cam laden
Local light2=CreateLight() ; Globales Licht laden
RotateEntity light2,0,90,0 ; Licht umdrehen
LightRange light2,1000 ;Lichtweite einstellen
 
CameraRange camera,0.1,5000 ;Camerasichtweite
MoveEntity camera,0,150,0
EntityType camera,1 ; Collisionstyp der Camera(spieler)auf 1 setzen!

loadingvar = 0
loadprogress = 0
Dim Map(30,20,30,3)
Global texture = LoadTexture("data/textures/myGrasTex1.jpg")


For Tx= 0 To 29
For Ty = 0 To 19
For Tz = 0 To 29
loadingvar = loadingvar + 1
If loadingvar =  180
loadingvar = 0
loadprogress = loadprogress +1
Print loadprogress
EndIf

map(Tx,Ty,Tz,1) = CreateCube()
ScaleEntity map(Tx,Ty,Tz,1),16,16,16
If map(Tx,Ty,Tz,2) = 0 Then EntityTexture map(tx,ty,tz,1),texture
PositionEntity map(tx,ty,tz,1),-272+(tx*16),-240+(ty*16),-272+(tz*16)
Next
Next
Next




While Not KeyHit(KEY_ESCAPE)
If KeyDown(KEY_A) TurnEntity camera,0,-5,0
If KeyDown(KEY_D) TurnEntity camera,0,5,0
If KeyDown(KEY_S) MoveEntity camera,0,0,-2
If KeyDown(KEY_W) MoveEntity camera,0,0,2

If KeyDown(KEY_Q) TurnEntity camera,10,0,0
If KeyDown(KEY_E) TurnEntity camera,-10,0,0


UpdateWorld
RenderWorld
Flip
Wend











  • Zuletzt bearbeitet von Inso am Fr, Nov 25, 2011 0:23, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragFr, Nov 25, 2011 0:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit jedem Würfel per CreateCube() muss die Grafikkarte ein Surface bearbeiten, das dauert. Du müsstest die Geometrie mit einer Single-Surfaceengine selbst erstellen und verwalten. Einem Anfänger würd ich's nicht empfehlen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Inso

BeitragFr, Nov 25, 2011 0:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, ich lern schnell Wink

Versuch mir das mal genauer zu erklären.
Quasi alle gleichen Würfel zu einer Mesh zusammenfassen?
Aber wie lös ich das ganze wieder auf, um einen block/tile zu ändern/zulöschen? (Soll ein 3d mapeditor werden)
 

bjh

BeitragFr, Nov 25, 2011 0:55
Antworten mit Zitat
Benutzer-Profile anzeigen
du musst die ecken und triangles selber erstellen mit
BlitzBasic: [AUSKLAPPEN]
mesh=CreateMesh()

BlitzBasic: [AUSKLAPPEN]
surface=CreateSurface(mesh)

BlitzBasic: [AUSKLAPPEN]
vertex=AddVertex(surface,x,y,z,u,v)

BlitzBasic: [AUSKLAPPEN]
AddTriangle surface,vertex1,vertex2,vertex3

usw.

du brauchst also eine funktion, die dir das zeug anstatt den würfeln erstellt.
 

Inso

BeitragFr, Nov 25, 2011 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
also die einzelnen würfel per surface erstellen ja?
aber wie entscheid ich welche flächen des würfels nun erstellt werden?


hab mir auch noch ne 2. möglichkeit überlegt.

dass die map auf der der spieler läuft nichts weiter als die reichweite der sichti st.
also ich hab eine map (100,100,100)
und eine sichtweite(20,20,20)
also kann ich quasi 20 blöcke weit sehen, in alle richtungen, alle andern blöcke werden nicht gezeichnet würde das funktionieren? und wie könnte ich das am besten realisieren?
bzw wärs ja noch besser wenn nur die blöcke da sind, die der spieler auch sehen kann... aber wie mach ich das?
wäre das nich unheimlich rechenaufwendig in echtzeit ständig die meshes zu löschen und neue zu erstellen?

skey-z

BeitragFr, Nov 25, 2011 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du alles aus Würfeln machen möchtest, muss du jedes Polygon bei der Single-Surface-Technik selbst erstellen.

1 Würfel = 6 Flächen = 12 Polygone = 8 oder 36 Vertices

Zuerst erstellst du das Mesh also das Gitterobjekt, dann kannst du (fast) beliebig viele Surfaces(Oberflächen)
erstellen, ein Surface kann nur eine Textur(oder auch Multitextur aber auch eine animierte Textur) annehmen.
Nun kannst du dem Surface beliebig viele Vertices hinzufügen, diese musst du mit AddTriangle verbinden um ein Polygon zu erhalten.

Du siehst also, dass es dann doch nicht ganz so einfach ist.

Schau dir mal die Befehle, die dir bjh schon geschrieben hat an, verstehe was passiert und spiele damit rum, um im Endeffekt einen Würfel zu erstellen.
Danach kannst du dich daran machen, mehrere Würfel zu erstellen.

[Edit]Ach ja, die UV-Koordinaten der Textur musst du auch noch selber setzen, damit diese anständig angezeigt werden[/Edit]
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

Inso

BeitragFr, Nov 25, 2011 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, hab mich auch schon bissl weiter in das Thema eingelesen, was ich grad nicht verstehe,.. wie kann ein würfel aus 8 bzw 36 vertices bestehen?
8 versteh ich, aber 36 nicht, 8 weil sich die flächen ja die vertices teilen, und ich diese vertices nur verbinden muss
aber das mit den 36 versteh ich nicht, warum für jede fläche des würfels komplett neue vertices verwenden? hat das vorteile?

ich kann mir das ganze schon ein wenig zusammen reimen, was ich allerdings nicht ganz raffe ist folgendes
ich hab mal ein bild angehängt:
ich hab jetzt einen soliden(texturierten) würfel da stehen, bestehend aus 8 vertices, daneben rechts ist ein leerer würfel, der also nicht mit gezeichnet wird, daneben links ist nocheinmal der selbe würfel, auch texturiert.
jetzt sag ich meinem programm ein block-X weiter ist ein fester block, also zeichne die rechte seite nicht.
beim nächsten block die selbe abfrage, aber weil ein block-x weiter kein fester block ist: zeichne die rechte seite
aber wie überprüf ich am besten welche seiten gezeichnet werden sollen?
und angenommen, ich kille jetzt einen block, wie update ich das ganze? also jetzt sind ja bis zu 6 neue seiten sichtbar, wie mach ich das in echtzeit? bzw wie krieg ich überhaupt erst den block gekillt in echtzeit? ohne die ganze map neu zu laden?


http://www.xup.in/dl,11472001/cubes.png/

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group