Minecraft Umsetzung... wie macht man so etwas?
Übersicht

onkelz89Betreff: Minecraft Umsetzung... wie macht man so etwas? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also in BB würde es ja reichen, mit EntityPick oder LinePick zu arbeiten, dann kann man sich das organisieren der Daten sparen ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja genau so wäre es.
Aber das ist letzendlich nur eine Umrechnerei. |
||
onkelz89 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dann erst einmal herzlichen Dank für die schnellen Antworten und Tipps von euch.
Ich werde dann mal etwas basteln ![]() 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 ![]() |
||
![]() |
biggicekey |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
grafeBetreff: Langsam |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) ![]() 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() Dies läuft schon um einiges Schneller doch immer noch nicht schnell genug (30 - 45 FPS) ![]() Hier einmal der ganze Code BlitzBasic: [AUSKLAPPEN]
Weiss jemand wie man das ganze beschleunigen könnte? mfg Grafe |
||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Starfare: Worklog, Website (download) |
![]() |
grafeBetreff: löschen? |
![]() Antworten mit Zitat ![]() |
---|---|---|
wie löscht man dann die einzelnen Würfel wenn alles ein surface ist?
bin eben noch ein anfänger in diesem bereich. |
||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() ![]() Wenn du das getan hast, sollte es auch ein Leichtes für dich sein, das mit den Texturen etc. zu erweitern ![]() lg Chrise, hier der Code: BlitzBasic: [AUSKLAPPEN]
|
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sind die Mine_CreateCube VertexNormal-Aufrufe nicht überflüssig? | ||
![]() |
Chrise |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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) ![]() |
||
- Zuletzt bearbeitet von BIG BUG am So, Sep 26, 2010 22:55, insgesamt einmal bearbeitet
![]() |
grafe |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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]
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group