Minecraft Umsetzung... wie macht man so etwas?

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

 

onkelz89

Betreff: Minecraft Umsetzung... wie macht man so etwas?

BeitragSa, Sep 25, 2010 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

habe heute einen Link von meinem Kumpel gesendet bekommen:

http://www.wired.com/gamelife/2010/09/minecraft/

Mich haben folgende Dinge fasziniert:

- die Weitsicht
- die möglichkeit jeden "Block" anzusprechen und neues zu bauen oder altes zu "entfernen"
- mit einem solchen System eigene Ideen umzusetzen

Wie macht man so etwas?
Ist das eine 3 Dimensionale Dim wo einfach die Art gespeichert wird, zb Holz, Rasen, Nichts???

Man kann ja nicht alle Blöcke einfach laden, dann würde es zu einer Ruckelparty, aber ist das Single Surface ??? Weiß Einer eine Antwort auf diese Fragen Smile

ToeB

BeitragSa, Sep 25, 2010 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das Video hab ich auch schon gesehen und mir da gleich gedanken gemacht. Als erstes muss wirklich ein 3D-Array her, bei dem gespeichert wird Nichts, Rasen oder Holz (und stein). Dann brauchst du einen Algoryhtmus, welcher jedes Feld durchgeht und nur da Würfelseiten erstellt, wo welche gesehen werden. Das heißt, wenn man einen Block zertört hat, muss man diesen Algo erneut ausführen, allerdings nur für die 24 Umliegenden Felder.

Welche eigentschaften ein Feld hat, das würde ich mit Types lösen, also ein Array , auf dem ein Type gespeichert ist, also so :
Code: [AUSKLAPPEN]
Type Feld
   Field x, y
   Field feldwert
   Field ressaucen
   Field anzahl
End Type

Dim Felder.Feld( 100, 100, 100 )

For x = 0 To 100
   For y = 0 To 100
      For z = 0 To 100
         Felder( x, y, z ) = New Feld
         Felder( x, y, z )\feldwert = Rand( 0, 2 )
         Felder( x, y, z )\ressacuen = Rand( 0, 2 )
         Felder( x, y, z )\anzahl = 1
      Next
   Next
Next


Wobei du jetzt beachten musst, das du nur für die Felder, die auch einen block haben sollen, einen Type besitzen, heißt
Code: [AUSKLAPPEN]
If Felder( x, y, z ) = Null then ... ;Kein Block
If Felder( x, y, z ) <> Null then ... ;Ein Block



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!

ZaP

BeitragSa, Sep 25, 2010 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Also in BB würde es ja reichen, mit EntityPick oder LinePick zu arbeiten, dann kann man sich das organisieren der Daten sparen Wink
Wenn man das Single-Surface machen will (und das macht hierbei Sinn) dann hat man das Problem aber wieder. Ich würde zu Types tendieren.
Starfare: Worklog, Website (download)
 

onkelz89

BeitragSa, Sep 25, 2010 15:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhm, mich würde jedoch noch interessieren, wie ich bei der Nutzung von Single Surface noch eine gute Performance hin bekomme.

Beispiel Video auf Youtube:
http://www.youtube.com/watch?v=p7TnBCrCrYc

So etwas ist ja bei Minecraft allen Anschein nach ohne Hänge realisierbar.

Da hat man ja doch schon einige "Blocks" die Sichtbar sind - also müsste man ja diese Blocks zusammenfassen, da sonst die Anzahl der Entitys viel zu hoch wäre, oder?

Wenn man nun aber zB. einen Teil weg löschen will - nicht nur einen Block sondern in einem bestimmten Radius alle - dann müsste man ja dem entsprechend alle umliegenden Felder durchlaufen lassen.

Ist so etwas mit Blitz3D machbar? Also denkt Ihr mit DX7 bekommt man das flüssig laufend hin?
 

Matthias

BeitragSa, Sep 25, 2010 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja es ist möglich. Aber mit viel aufwand.

Dafür bräuchte mann ein Texturentielemap. Zb mit 16Texturen a 256x256 (1024gerTextur)

Dann kann mann auch die einzelnen Blöcke in einem einzigen Surface unterbringen.
Drozdem kann mann nicht alle Blöcke auf einem Surface machen sondent, das Map muß in Quadranten aufgeteilt werden. Zb 16x16x16 Blöcke groß. Alle diese Blöcke werden nun mit AddMesh zusammen gefügt.

Ambesten wäre natürlich wenn mann sie nicht mit AddMesh zusammen fügt sondent mit AddVertex AddTriangles usw. Weil dann kann mann sich die verdeckten fläschen sparen beim erstellen.

Immer wenn so ein 3DMapQuadrant in den Sichtbereich der Camera gelangt wird er neu erstellt.
Solte der 3DMapQuadrant aus dem Sichtbereich verschwinden wird er gelöcht oder als ungenutzt makiert.

Um die Weitsicht irgendwie hin zu bekommen wäre ein Mipmapping nötig.
3Stufen. Dazu müstet mann das Texturentilemap in 3 größen haben 1024, 512, 256 Und sie abhängig der Entfernung zur Camera, auf dem 3DMapQuadrant-Mesh legen.

Edit. Mann kann natürlich auch mehrere Textursetz benutzen zb für Landschaft, Gebäude Fahrzeuge usw.
 

onkelz89

BeitragSa, Sep 25, 2010 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein letzter Punkt schwebt mir noch vor - die Kollision mit den Spielern und der Map - man kann ja nicht auf die Blitz eigene Kollisionen zurück greifen, da diese ja keine Meshs unterstützen, sondern nur "Kugeln und Blöcke".

Würde man hier, direkt über die Dim / den Array schauen wo die Spieler sind und wo sie kollidieren?
 

Matthias

BeitragSa, Sep 25, 2010 16:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja genau so wäre es.

Aber das ist letzendlich nur eine Umrechnerei.
 

onkelz89

BeitragSa, Sep 25, 2010 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann erst einmal herzlichen Dank für die schnellen Antworten und Tipps von euch.

Ich werde dann mal etwas basteln Wink

Da es keine Sache ist die man in 2 Tagen hin bekommt, wird es etwas dauern, aber bei Erfolg zeig ich gerne was daraus geworden ist Smile

biggicekey

BeitragSa, Sep 25, 2010 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
onkelz89 hat Folgendes geschrieben:
da diese ja keine Meshs unterstützen, sondern nur "Kugeln und Blöcke".


wer erzählt denn so einen Mist? Collisions

onkelz89 hat Folgendes geschrieben:
Mhm, mich würde jedoch noch interessieren, wie ich bei der Nutzung von Single Surface noch eine gute Performance hin bekomme.


Die "Nutzung" von "Sinle Surface" sorgt doch für die gute Performance!


Und sonst alles so wie Toeb das schon schrieb. Würfel sinnvoll zusammenfassen und nur anzeigen was auch sichtbar ist. Bei Veränderungen nur im kleinen Umkreis prüfen was im Mesh neu gebaut werden muss.

Übrigens ist es oft nicht langsamer das gesamte Surface neu zu erstellen statt darin Änderungen vorzunehmen.
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]
  • Zuletzt bearbeitet von biggicekey am Sa, Sep 25, 2010 16:37, insgesamt einmal bearbeitet
 

onkelz89

BeitragSa, Sep 25, 2010 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, stimmt...

Das Kugel zu Poly habe ich völlig vergessen...

Dann geht es natürlich auch mit Blitz, aber mal sehen was schneller läuft.

Ihr hört wieder von mir.

Danke

grafe

Betreff: Langsam

BeitragSo, Sep 26, 2010 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo miteinander,

Ich habe jetzt einmal den Vorschlag von ToeB ausprobiert und mir ist aufgefallen, dass bei mir schon bei 300*300 Würfeln nichts mehr läuft (5 FPS) Sad

Da habe ich eine kleine Funktion gebastelt die nur die Würfel anzeigt (Hide und ShowEntity) die bei mir in der Nähe sind.

BlitzBasic: [AUSKLAPPEN]
Function World_UpdateCube()
Local PlayerXMin=EntityX(Player)/2-11
Local PlayerXMax=EntityX(Player)/2+11
Local PlayerZMin=EntityZ(Player)/2-11
Local PlayerZMax=EntityZ(Player)/2+11

If PlayerXMin<0 Then PlayerXMin=0
If PlayerZMin<0 Then PlayerZMin=0

If PlayerXMax>300 Then PlayerXMax=300
If PlayerZMax>300 Then PlayerZMax=300


DebugLog PlayerXMin+" "+PlayerXMax

For x=PlayerXMin To PlayerXMax
For y=0 To 100
For z=PlayerZMin To PlayerZMax
If World (X, Y, Z)<>Null
If EntityDistance(World (X, Y, Z)\Mesh,Player)<20
If World(X, Y, Z)\Hide=0
If EntityVisible(Player,World (X, Y, Z)\Mesh)
ShowEntity (World (X, Y, Z)\Mesh)
; EntityAlpha World (X, Y, Z),1
World(X, Y, Z)\Hide=1
EndIf
EndIf
Else
If World(X, Y, Z)\Hide=1
HideEntity (World (X, Y, Z)\Mesh)
World(X, Y, Z)\Hide=0
EndIf
; EntityAlpha World (X, Y, Z),0
EndIf
EndIf
Next
Next
Next
End Function


Dies läuft schon um einiges Schneller doch immer noch nicht schnell genug (30 - 45 FPS) Shocked

Hier einmal der ganze Code
BlitzBasic: [AUSKLAPPEN]


Graphics3D 800,600,32,2

SetBuffer BackBuffer()

Local Timer=CreateTimer(60)


;World-----------------------------

Dim WorldHide(301,301,301)
Dim WorldName$(301,301,301)

;Camera----------------------------
Global Player=CreatePivot()
EntityRadius Player,10
Global Camera=CreateCamera(Player)
EntityType Player,1

Sys_CreateCube("Stone","")

Type Cube
Field Name$
Field Mesh
Field Hide
Field Id
End Type

Dim World.Cube(301,301,301)

For x=1 To 300
For z=1 To 300
World_CreateCube("Stone",x,1,z)
Next
Next

CameraFogMode Camera,0

CameraFogRange Camera,20,25

Collisions 1,2,2,2

Global Tick

WireFrame 1

Repeat



If KeyHit(1) Then End

Local Laufen=0

If KeyDown(17)
MoveEntity Player,0,0,0.3
Laufen=1
EndIf


If KeyDown(31)
MoveEntity Player,0,0,-0.3
Laufen=1
EndIf

If KeyDown(32)
MoveEntity Player,0.3,0,0
Laufen=1
EndIf

If KeyDown(30)
MoveEntity Player,-0.3,0,0
Laufen=1
EndIf

If CountCollisions(Player)=0
Laufen=1
EndIf

TurnEntity Player,0,-MouseXSpeed(),0
TurnEntity Camera,MouseYSpeed(),0,0

TranslateEntity Player,0,-0.1,0

UpdateWorld
RenderWorld

If Laufen=1
Tick=Tick+1
If Tick>5
Tick=0
World_UpdateCube()
EndIf
EndIf


Text 0,0,FPS()

Flip 0
WaitTimer Timer
Forever

;Types

Type Sys_Cube
Field Name$ , Tex$

End Type



;Functions

Function Sys_CreateCube(Name$, Texture$)
c.Sys_Cube=New Sys_Cube

c\Name$ = Name

c\Tex = Texture
End Function

Function World_CreateCube(Name$, X, Y, Z)
World(X, Y, Z) = New Cube
World(X, Y, Z)\Name = Name$
If World(X, Y, Z)=Null Then End
World_SearchCube(X,Y,Z)
End Function

Function World_SearchCube(X,Y,Z)
Local Test=0

If World( X+1, Y, Z )=Null
Test=1
ElseIf World (X-1, Y, Z)=Null
Test=1
ElseIf World (X, Y+1, Z)=Null
Test=1
ElseIf World (X, Y-1, Z)=Null
Test=1
ElseIf World (X, Y, Z+1)=Null
Test=1
ElseIf World (X, Y, Z-1)=Null
Test=1
EndIf

If Test = 1
World (X, Y, Z)\Mesh=CreateCube()
PositionEntity World (X, Y, Z)\Mesh,X*2,Y*2-50,Z*2
; ScaleEntity World (X, Y, Z),0.5,0.5,0.5
EntityType World(X, Y, Z)\Mesh,2
HideEntity World(X, Y, Z)\Mesh
EndIf


End Function

Function World_UpdateCube()
Local PlayerXMin=EntityX(Player)/2-11
Local PlayerXMax=EntityX(Player)/2+11
Local PlayerZMin=EntityZ(Player)/2-11
Local PlayerZMax=EntityZ(Player)/2+11

If PlayerXMin<0 Then PlayerXMin=0
If PlayerZMin<0 Then PlayerZMin=0

If PlayerXMax>300 Then PlayerXMax=300
If PlayerZMax>300 Then PlayerZMax=300


DebugLog PlayerXMin+" "+PlayerXMax

For x=PlayerXMin To PlayerXMax
For y=0 To 100
For z=PlayerZMin To PlayerZMax
If World (X, Y, Z)<>Null
If EntityDistance(World (X, Y, Z)\Mesh,Player)<20
If World(X, Y, Z)\Hide=0
If EntityVisible(Player,World (X, Y, Z)\Mesh)
ShowEntity (World (X, Y, Z)\Mesh)
; EntityAlpha World (X, Y, Z),1
World(X, Y, Z)\Hide=1
EndIf
EndIf
Else
If World(X, Y, Z)\Hide=1
HideEntity (World (X, Y, Z)\Mesh)
World(X, Y, Z)\Hide=0
EndIf
; EntityAlpha World (X, Y, Z),0
EndIf
EndIf
Next
Next
Next
End Function


Global FPSCount = 0
Global FPSCountTemp = 0
Global FPSTime = 0
Function FPS()
If (MilliSecs()-FPSTime)>=1000 Then
FPSTime = MilliSecs()
FPSCount = FPSCountTemp
FPSCountTemp = 0
EndIf
FPSCountTemp = FPSCountTemp + 1
Return FPSCount
End Function


Weiss jemand wie man das ganze beschleunigen könnte?

mfg Grafe

ZaP

BeitragSo, Sep 26, 2010 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Durch CreateCube() wird für jeden Würfel ein neues Surface erstellt, man könnte alle Würfel mit gleicher Textur in einem Surface zusammenfassen, oder sogar alle in ein Surface einordnen, wenn man eine Texturtilemap verwendet, wie Matthias schon sagte.
EntityVisible kann das Programm auch unglaublich verlangsamen.
Starfare: Worklog, Website (download)

grafe

Betreff: löschen?

BeitragSo, Sep 26, 2010 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
wie löscht man dann die einzelnen Würfel wenn alles ein surface ist?
bin eben noch ein anfänger in diesem bereich.

ZaP

BeitragSo, Sep 26, 2010 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest z.B. für jeden Würfel die Vertexnummern in Dims oder Types speichern, und das gesamte Surface neu aufbauen, natürlich ohne den gelöschten Würfel.
Starfare: Worklog, Website (download)

Chrise

BeitragSo, Sep 26, 2010 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Das was jetzt kommt, hab ich nur gemacht, weil es mich selbst interessiert hat, onkelz89
Wenn dich das Thema wirklich interessiert und du ein Projekt machen willst, dann sieh das nicht als einen Gefallen sondern wirklich nur als eine Hilfestellung. Meine Lösung ist bestimmt nicht die edelste, aber vielleicht ein Ansatz. Schau es dir in Ruhe an und kopier es nicht einfach in dein Projekt, sonst wirst du nie lernen wie sowas in der Art funktioniert Very HappyVery Happy

Wenn du das getan hast, sollte es auch ein Leichtes für dich sein, das mit den Texturen etc. zu erweitern Wink

lg Chrise,

hier der Code:

BlitzBasic: [AUSKLAPPEN]

SeedRnd MilliSecs()
Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

;########################################################################
;# MINECRAFT-SKRIPT #
;########################################################################
Type Mine_Cube

Field x#[23],y#[23],z#[23],tu[23],tv[23],V[23]

End Type
Global Mine_World%,Mine_Surface%
Global Mine_Texture%
Function Mine_Init(Parent%=0)

Mine_World=CreateMesh(Parent)
Mine_Surface=CreateSurface(Mine_World)

End Function
Function Mine_CreateCube(X#=0,Y#=0,Z#=0)

;============================================
Local M_Cube.Mine_Cube=New Mine_Cube,V[23],i
;============================================TOP
V[00]=AddVertex(Mine_Surface,X#-1,Y#+1,Z#+1,0,1)
V[01]=AddVertex(Mine_Surface,X#+1,Y#+1,Z#+1,1,1)
V[02]=AddVertex(Mine_Surface,X#+1,Y#+1,Z#-1,1,0)
V[03]=AddVertex(Mine_Surface,X#-1,Y#+1,Z#-1,0,0)
;============================================BOTTOM
V[04]=AddVertex(Mine_Surface,X#-1,Y#-1,Z#-1,0,1)
V[05]=AddVertex(Mine_Surface,X#+1,Y#-1,Z#-1,1,1)
V[06]=AddVertex(Mine_Surface,X#+1,Y#-1,Z#+1,1,0)
V[07]=AddVertex(Mine_Surface,X#-1,Y#-1,Z#+1,0,0)
;============================================FRONT
V[08]=AddVertex(Mine_Surface,X#-1,Y#+1,Z#-1,0,0)
V[09]=AddVertex(Mine_Surface,X#+1,Y#+1,Z#-1,1,0)
V[10]=AddVertex(Mine_Surface,X#+1,Y#-1,Z#-1,1,1)
V[11]=AddVertex(Mine_Surface,X#-1,Y#-1,Z#-1,0,1)
;============================================BACK
V[12]=AddVertex(Mine_Surface,X#+1,Y#+1,Z#+1,0,0)
V[13]=AddVertex(Mine_Surface,X#-1,Y#+1,Z#+1,1,0)
V[14]=AddVertex(Mine_Surface,X#-1,Y#-1,Z#+1,1,1)
V[15]=AddVertex(Mine_Surface,X#+1,Y#-1,Z#+1,0,1)
;============================================LEFT
V[16]=AddVertex(Mine_Surface,X#-1,Y#+1,Z#+1,0,0)
V[17]=AddVertex(Mine_Surface,X#-1,Y#+1,Z#-1,1,0)
V[18]=AddVertex(Mine_Surface,X#-1,Y#-1,Z#-1,1,1)
V[19]=AddVertex(Mine_Surface,X#-1,Y#-1,Z#+1,0,1)
;============================================RIGHT
V[20]=AddVertex(Mine_Surface,X#+1,Y#+1,Z#-1,0,0)
V[21]=AddVertex(Mine_Surface,X#+1,Y#+1,Z#+1,1,0)
V[22]=AddVertex(Mine_Surface,X#+1,Y#-1,Z#+1,1,1)
V[23]=AddVertex(Mine_Surface,X#+1,Y#-1,Z#-1,0,1)
;============================================
VertexNormal (Mine_Surface,V[00],0,+1,0)
VertexNormal (Mine_Surface,V[01],0,+1,0)
VertexNormal (Mine_Surface,V[02],0,+1,0)
VertexNormal (Mine_Surface,V[03],0,+1,0)
VertexNormal (Mine_Surface,V[04],0,-1,0)
VertexNormal (Mine_Surface,V[05],0,-1,0)
VertexNormal (Mine_Surface,V[06],0,-1,0)
VertexNormal (Mine_Surface,V[07],0,-1,0)
VertexNormal (Mine_Surface,V[08],0,0,-1)
VertexNormal (Mine_Surface,V[09],0,0,-1)
VertexNormal (Mine_Surface,V[10],0,0,-1)
VertexNormal (Mine_Surface,V[11],0,0,-1)
VertexNormal (Mine_Surface,V[12],0,0,+1)
VertexNormal (Mine_Surface,V[13],0,0,+1)
VertexNormal (Mine_Surface,V[14],0,0,+1)
VertexNormal (Mine_Surface,V[15],0,0,+1)
VertexNormal (Mine_Surface,V[16],-1,0,0)
VertexNormal (Mine_Surface,V[17],-1,0,0)
VertexNormal (Mine_Surface,V[18],-1,0,0)
VertexNormal (Mine_Surface,V[19],-1,0,0)
VertexNormal (Mine_Surface,V[20],+1,0,0)
VertexNormal (Mine_Surface,V[21],+1,0,0)
VertexNormal (Mine_Surface,V[22],+1,0,0)
VertexNormal (Mine_Surface,V[23],+1,0,0)
;============================================
AddTriangle(Mine_Surface,V[00],V[01],V[03]);TOP
AddTriangle(Mine_Surface,V[01],V[02],V[03]);TOP
AddTriangle(Mine_Surface,V[04],V[05],V[07]);BOTTOM
AddTriangle(Mine_Surface,V[05],V[06],V[07]);BOTTOM
AddTriangle(Mine_Surface,V[08],V[09],V[11]);FRONT
AddTriangle(Mine_Surface,V[09],V[10],V[11]);FRONT
AddTriangle(Mine_Surface,V[12],V[13],V[15]);BACK
AddTriangle(Mine_Surface,V[13],V[14],V[15]);BACK
AddTriangle(Mine_Surface,V[16],V[17],V[19]);LEFT
AddTriangle(Mine_Surface,V[17],V[18],V[19]);LEFT
AddTriangle(Mine_Surface,V[20],V[21],V[23]);RIGHT
AddTriangle(Mine_Surface,V[21],V[22],V[23]);RIGHT
;============================================
For i=0 To 23
M_Cube\x[i]=VertexX(Mine_Surface,V[i])
M_Cube\y[i]=VertexY(Mine_Surface,V[i])
M_Cube\z[i]=VertexZ(Mine_Surface,V[i])
M_Cube\tu[i]=VertexU(Mine_Surface,V[i])
M_Cube\tv[i]=VertexV(Mine_Surface,V[i])
M_Cube\V[i]=V[i]
Next
;============================================
Return Handle(M_Cube)

End Function
Function Mine_FreeCube(Cube)

Local M_Cube.Mine_Cube=Object.Mine_Cube(Cube)
If M_Cube<>Null Then
;============================================
Delete M_Cube
;============================================
EndIf

End Function
Function Mine_Rebuild()

Local M_Cube.Mine_Cube,V[23],i
ClearSurface(Mine_Surface)
;===========================
For M_Cube=Each Mine_Cube
;============================================
For i=0 To 23
V[i]=AddVertex(Mine_Surface,M_Cube\x[i],M_Cube\y[i],M_Cube\z[i],M_Cube\tu[i],M_Cube\tv[i])
Next
;============================================
VertexNormal (Mine_Surface,V[00],0,+1,0)
VertexNormal (Mine_Surface,V[01],0,+1,0)
VertexNormal (Mine_Surface,V[02],0,+1,0)
VertexNormal (Mine_Surface,V[03],0,+1,0)
VertexNormal (Mine_Surface,V[04],0,-1,0)
VertexNormal (Mine_Surface,V[05],0,-1,0)
VertexNormal (Mine_Surface,V[06],0,-1,0)
VertexNormal (Mine_Surface,V[07],0,-1,0)
VertexNormal (Mine_Surface,V[08],0,0,-1)
VertexNormal (Mine_Surface,V[09],0,0,-1)
VertexNormal (Mine_Surface,V[10],0,0,-1)
VertexNormal (Mine_Surface,V[11],0,0,-1)
VertexNormal (Mine_Surface,V[12],0,0,+1)
VertexNormal (Mine_Surface,V[13],0,0,+1)
VertexNormal (Mine_Surface,V[14],0,0,+1)
VertexNormal (Mine_Surface,V[15],0,0,+1)
VertexNormal (Mine_Surface,V[16],-1,0,0)
VertexNormal (Mine_Surface,V[17],-1,0,0)
VertexNormal (Mine_Surface,V[18],-1,0,0)
VertexNormal (Mine_Surface,V[19],-1,0,0)
VertexNormal (Mine_Surface,V[20],+1,0,0)
VertexNormal (Mine_Surface,V[21],+1,0,0)
VertexNormal (Mine_Surface,V[22],+1,0,0)
VertexNormal (Mine_Surface,V[23],+1,0,0)
;============================================
AddTriangle(Mine_Surface,V[00],V[01],V[03]);TOP
AddTriangle(Mine_Surface,V[01],V[02],V[03]);TOP
AddTriangle(Mine_Surface,V[04],V[05],V[07]);BOTTOM
AddTriangle(Mine_Surface,V[05],V[06],V[07]);BOTTOM
AddTriangle(Mine_Surface,V[08],V[09],V[11]);FRONT
AddTriangle(Mine_Surface,V[09],V[10],V[11]);FRONT
AddTriangle(Mine_Surface,V[12],V[13],V[15]);BACK
AddTriangle(Mine_Surface,V[13],V[14],V[15]);BACK
AddTriangle(Mine_Surface,V[16],V[17],V[19]);LEFT
AddTriangle(Mine_Surface,V[17],V[18],V[19]);LEFT
AddTriangle(Mine_Surface,V[20],V[21],V[23]);RIGHT
AddTriangle(Mine_Surface,V[21],V[22],V[23]);RIGHT
;============================================
Next
;===========================

End Function
;########################################################################

Mine_Init()
Global mapx=14,mapy=14,mapz=14
Dim Cube(mapx,mapy,mapz)
Local x=0,y=0,z=0
For x=0 To mapx
For y=0 To mapy
For z=0 To mapz
Cube(x,y,z) = Mine_CreateCube(x*2-mapx,y*2-mapy,z*2-mapz)
Next
Next
Next
;TESTZWECKE-GINGE-AUCH-UM-EINIGES-EINFACHER :P
For x=0 To mapx
For y=0 To mapy
For z=0 To mapz
If Rand(0,1) Then Mine_FreeCube(Cube(x,y,z))
Next
Next
Next
Mine_Rebuild();WIEDER-NEUAUFBAUEN-WICHTIG
;########################################################################
;# MINECRAFT-SKRIPT-ENDE #
;########################################################################
Function Mine_Tex()

Local Texture=CreateTexture(16,16,4)
;======================================
Local U,V
For U=0 To 15
For V=0 To 15
If Rand(0,1) Then
WritePixel(U,V,$FFFFFFFF,TextureBuffer(Texture))
Else
WritePixel(U,V,$FF000000,TextureBuffer(Texture))
EndIf
Next
Next
;======================================
Return Texture

End Function
Local Texture=Mine_Tex()
TextureBlend Texture,2
EntityTexture Mine_World,Texture,0,0

Local Camera=CreateCamera()
PositionEntity Camera,0,0,-40
Local Light=CreateLight()
RotateEntity Light,60,30,10

Local Timer=CreateTimer(60)
While Not KeyHit(1)

TurnEntity Mine_World,0.1,0.1,0.1

RenderWorld()

Text 50,50,TrisRendered()

WaitTimer Timer
Flip 0
Wend
End
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.
 

PacMani

BeitragSo, Sep 26, 2010 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Sind die Mine_CreateCube VertexNormal-Aufrufe nicht überflüssig?

Chrise

BeitragSo, Sep 26, 2010 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja anfangs hatte ich sie nicht, dann wurde das Objekt nicht beleuchtet. Ich habe aber im Nachhinein nochmal etwas daran geändert, kann also gut sein...

EDIT: ne, habs grad ausprobiert, sollte schon drin bleiben. In CreateCube sowie bei Mine_Rebuild
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.
 

BIG BUG

BeitragSo, Sep 26, 2010 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hatte damals auch mal selbst überlegt so was in die Richtung zu machen. Anstatt eines riesigen Arrays hatte ich mir überlegt Octrees zu benutzen. Hier ist die Struktur zwar komplizierter, dafür ist diese dann aber auch nicht so speicher-/Polygonintensiv und man könnte ein schnelleres Occlusion Culling implementieren.(Hier würde die Welt hinter einem Berg z.B. nicht gerendert)
Könnte aber auch sein, dass MineCraft einen stinknormalen Array anstatt eines Octrees benutzt.

https://www.blitzforum.de/foru...hp?t=23968 (Sehr rudimentär, unsichtbare cubes/faces werden hier auch nicht entfernt)

user posted image
  • Zuletzt bearbeitet von BIG BUG am So, Sep 26, 2010 22:55, insgesamt einmal bearbeitet

grafe

BeitragSo, Sep 26, 2010 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
@Chrise: Danke für deine Hilfe aber ich bin selber schon recht weit

Ich stehe im Moment nur vor folgendem Problem:
Ich erstelle 512 * 512 * 40 Würfel (Was in einem Minecraft ähnlichem Spiel möglich sein sollte) und kriege einen Mav bei AddVertex

Wer mein Code mal ausprobieren will, um das Problem zu verdeutlichen
BlitzBasic: [AUSKLAPPEN]


Graphics3D 800,600,32,2

SetBuffer BackBuffer()

Local Timer=CreateTimer(60)


;World-----------------------------

Dim WorldHide(301,301,301)
Dim WorldName$(301,301,301)

;Camera----------------------------
Global Player=CreatePivot()
EntityRadius Player,10
Global Camera=CreateCamera(Player)
EntityType Player,1

Sys_CreateCube("Stone","")



Type Cube
Field Name$
Field Mesh
Field Hide
Field Id
End Type

Dim World.Cube(512,128,512)

Global Tickerli=2

For x=0 To 512
For y=0 To 40
For z=0 To 512
Tickerli=Tickerli+1
World_CreateCube("Stone",X,Y,Z)
Next
Next
Next

;LoadHighlandMap("GFx\Map1.png")

cube=CreateCube()

World_CreateWorld

CameraFogMode Camera,1

CameraFogRange Camera,20,340

CameraRange Camera,1,100000

Collisions 1,2,2,2

Global Tick

WireFrame 1

Repeat


If KeyHit(1) Then End

Local Laufen=0

If KeyDown(17)
MoveEntity Player,0,0,3
Laufen=1
EndIf


If KeyDown(31)
MoveEntity Player,0,0,-0.3
Laufen=1
EndIf

If KeyDown(32)
MoveEntity Player,0.3,0,0
Laufen=1
EndIf

If KeyDown(30)
MoveEntity Player,-0.3,0,0
Laufen=1
EndIf

If CountCollisions(Player)=0
Laufen=1
EndIf

TurnEntity Player,0,-MouseXSpeed(),0
TurnEntity Camera,MouseYSpeed(),0,0

TranslateEntity Player,0,-0.1,0

UpdateWorld
RenderWorld

If Laufen=1
Tick=Tick+1
If Tick>5
Tick=0
World_UpdateCube()
EndIf
EndIf


Text 0,0,FPS()
Text 0,20,TrisRendered()

Flip 0
WaitTimer Timer
Forever

;Types

Type Sys_Cube
Field Name$ , Tex$

End Type

Type World_CubeSektor
Field Mesh,Id
Field Surface
Field X,Y,Z
;Field Vertex[32768]
End Type

;Functions

Function LoadHighlandMap(Map$)
Local HighMap=LoadImage(Map)

FaktorY#=(127-60)/255

SetBuffer ImageBuffer(HighMap)
LockBuffer ImageBuffer(HighMap)
For x=0 To 512
For z= 0 To 512





rgb = ReadPixel(x, z)
a = (rgb And $FF000000)/$1000000 -48


ToY=48+a*FaktorY

For y= 0 To ToY
World_CreateCube("Stone",X,Y,Z)
Next
Next
Next


End Function


Function Sys_CreateCube(Name$, Texture$)
c.Sys_Cube=New Sys_Cube

c\Name$ = Name

c\Tex = Texture
End Function

Function World_CreateCube(Name$, X, Y, Z)
World(X, Y, Z) = New Cube
World(X, Y, Z)\Name = Name$
If World(X, Y, Z)=Null Then End
;World_SearchCube(X,Y,Z)
End Function

Function World_CreateWorld()

For x=0 To 511 Step 16
For y=0 To 127 Step 16
For z=0 To 511 Step 16
;DebugLog X+","+Y+","+Z+"-------------------------------------------------"
CubeSektor=World_CreateSektor(X,Y-3,Z)
Ticker=Ticker+1

CubeTick=0
For xx=x To x+15
For yy=y To y+15
For zz=z To z+15
If World(Xx,Yy,Zz)<>Null

CubeTick=CubeTick+1
AddCubetoSektor((Xx Mod 16)*2, (Yy Mod 16)*2, (Zz Mod 16)*2, 1, 1, 1, CubeSektor)
EndIf
Next
Next
Next
DebugLog CubeTick
Next
Next
DebugLog X
Next


End Function

Global World_SektorID

Function World_CreateSektor(X,Y,Z)
s.World_CubeSektor=New World_CubeSektor

s\Mesh=CreateMesh()
PositionEntity s\Mesh,X*2,Y*2,Z*2
s\Surface=CreateSurface(s\Mesh)
EntityType s\Mesh,2
s\X=X
s\Y=Y
s\Z=Z
s\Id=World_SektorID
World_SektorID=World_SektorID+1

Return Handle(s.World_CubeSektor)
End Function


Function AddCubetoSektor(X#, Y#, Z#, ScaleX#, ScaleY#, ScaleZ#,CubeSektor)
s.World_CubeSektor=Object.World_CubeSektor(CubeSektor)

X=X-16
Z=Z-16
Y=Y-16

V1% = AddVertex(s\Surface, X - ScaleX, Y + ScaleY, Z - ScaleZ)
V2% = AddVertex(s\Surface, X + ScaleX, Y + ScaleY, Z - ScaleZ)
V3% = AddVertex(s\Surface, X + ScaleX, Y - ScaleY, Z - ScaleZ)
V4% = AddVertex(s\Surface, X - ScaleX, Y - ScaleY, Z - ScaleZ)
V5% = AddVertex(s\Surface, X - ScaleX, Y + ScaleY, Z + ScaleZ)
V6% = AddVertex(s\Surface, X + ScaleX, Y + ScaleY, Z + ScaleZ)
V7% = AddVertex(s\Surface, X + ScaleX, Y - ScaleY, Z + ScaleZ)
V8% = AddVertex(s\Surface, X - ScaleX, Y - ScaleY, Z + ScaleZ)


AddTriangle(s\Surface, V1, V2, V3)
AddTriangle(s\Surface, V1, V3, V4)
AddTriangle(s\Surface, V2, V7, V3)
AddTriangle(s\Surface, V6, V7, V2)
AddTriangle(s\Surface, V1, V4, V8)
AddTriangle(s\Surface, V5, V1, V8)
AddTriangle(s\Surface, V5, V2, V1)
AddTriangle(s\Surface, V5, V6, V2)
AddTriangle(s\Surface, V4, V3, V7)
AddTriangle(s\Surface, V7, V8, V4)


; DebugLog X+","+Y+","+Z
;tuiv=CountVertices (s\Surface)
If CubeSektor>24 Then DebugLog CountVertices (s\Surface)
; DebugLog s\X+","+s\Y+","+s\Z
; DebugLog "-------------"
End Function


Function World_SearchCube(X,Y,Z)
Local Test=0

If World( X+1, Y, Z )=Null
Test=1
ElseIf World (X-1, Y, Z)=Null
Test=1
ElseIf World (X, Y+1, Z)=Null
Test=1
ElseIf World (X, Y-1, Z)=Null
Test=1
ElseIf World (X, Y, Z+1)=Null
Test=1
ElseIf World (X, Y, Z-1)=Null
Test=1
EndIf

If Test = 1
World (X, Y, Z)\Mesh=CreateCube()
PositionEntity World (X, Y, Z)\Mesh,X*2,Y*2-50,Z*2
; ScaleEntity World (X, Y, Z),0.5,0.5,0.5
EntityType World(X, Y, Z)\Mesh,2
HideEntity World(X, Y, Z)\Mesh
EndIf


End Function

Function World_UpdateCube()
For s.World_CubeSektor=Each World_CubeSektor

If EntityDistance(Player,s\Mesh)<200
DebugLog CountVertices (s\Surface)
ShowEntity s\Mesh
Else
HideEntity s\Mesh
EndIf
Next
End Function


Global FPSCount = 0
Global FPSCountTemp = 0
Global FPSTime = 0
Function FPS()
If (MilliSecs()-FPSTime)>=1000 Then
FPSTime = MilliSecs()
FPSCount = FPSCountTemp
FPSCountTemp = 0
EndIf
FPSCountTemp = FPSCountTemp + 1
Return FPSCount
End Function


Bei 512 * 512 * 2 startet das Programm und läuft flüssig mit konstanten 60 Fps

mfg Grafe
  • Zuletzt bearbeitet von grafe am So, Sep 26, 2010 23:03, insgesamt einmal bearbeitet
 

BIG BUG

BeitragSo, Sep 26, 2010 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist, dass ein Surface nur maximal 32.000 Vertices beinhalten kann. Du musst hier also dann aufteilen. Siehe mein obiger Post...
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group