2 registered members (NnamueN, 1 invisible),
1,489
guests, and 6
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Re: Voxel fürs 3d Gamestudio
[Re: ratz]
#429254
09/10/13 13:26
09/10/13 13:26
|
Joined: Jun 2009
Posts: 2,210 Bavaria, Germany
Kartoffel
Expert
|
Expert
Joined: Jun 2009
Posts: 2,210
Bavaria, Germany
|
gut, dass es jetzt funktioniert. aber du überschreitest in der for schleife immernoch den array (x < 18)!
wenn das ganze überhaupt startet, wird es in dem fall jede menge speicher fehler & random crashes geben sobald das projekt komplexer wird.
(...mist, jetzt hab ich auch bock, was in die richtung zu coden ._.)
POTATO-MAN saves the day! - Random
|
|
|
Re: Voxel fürs 3d Gamestudio
[Re: Kartoffel]
#429266
09/10/13 15:08
09/10/13 15:08
|
Joined: Nov 2008
Posts: 946
the_clown
User
|
User
Joined: Nov 2008
Posts: 946
|
(...mist, jetzt hab ich auch bock, was in die richtung zu coden ._.)
haha ja voxel sind ein interessantes thema du hast allerdings recht was die performance bei diesem ansatz angeht, ich hab auch gerade mal einen kleinen ansatz probiert und mit einem feld von 1024 voxeln bekomme ich mit einem netbook nur noch um die 15 fps (amd c40 dual core prozessor, 4 gigabyte RAM). Zusätzlich zu 6 sprite-entities pro voxel liegt auch noch eine bitmap für jeden voxel im speicher (um per bmap_for_enity auf dem voxel rumzumalen). Die hardware auf der ich grad arbeite ist zwar eh nicht spieltauglich, aber die voxelzahl ist nun wirklich nicht hoch. selbst wenn man die hardwareleistung um faktor 10 bis 20 hochschraubt, die voxelzahlen die mir so vorschweben liegen eher im hunderttausenderberreich, und das KANN mit dem ansatz einfach nicht flüssig genug sein, schon gar nicht mit laufendem spielcode und -objekten obendrauf... deswegen würde mich dein anderer ansatz mal interessieren, Kartoffel, der mit der einen entity...?
|
|
|
Re: Voxel fürs 3d Gamestudio
[Re: the_clown]
#429269
09/10/13 15:42
09/10/13 15:42
|
Joined: Jun 2009
Posts: 2,210 Bavaria, Germany
Kartoffel
Expert
|
Expert
Joined: Jun 2009
Posts: 2,210
Bavaria, Germany
|
der mit der einen entity...? eine entity wird nicht möglich sein (irgendwo zwischen 2700 und 3000 nicht aneinanderliegenden blöcken hat man die max-polys-pro-model-grenze erreicht) einfach wie minecraft: 1 Model == 1 Chunk == 16³ Blöcke damit überschreitet man die poly grenze nie und hat sehr gute performance. Achso auserdem muss man alle nicht sichbaren seiten erst garnicht meshen, weil sonst geschätzt ~90% leistung umsonst verbraten wird (kann gut sein, dass es noch mehr ist).
Last edited by Kartoffel; 09/10/13 15:44.
POTATO-MAN saves the day! - Random
|
|
|
Re: Voxel fürs 3d Gamestudio
[Re: Kartoffel]
#429314
09/11/13 11:45
09/11/13 11:45
|
Joined: Oct 2008
Posts: 341
ratz
OP
Senior Member
|
OP
Senior Member
Joined: Oct 2008
Posts: 341
|
ich bin heute mal aus spaß in die 3te dimension gegangen und habe jetzt mal eine 2x2 pixel bmp benutzt das ergebniss: level lädt ... 6 sec später erscheint der cube
#include <acknex.h>
#include <default.c>
//
var voxel_size = 4; // hier für den abstand ;)
typedef struct VOXEL
{
ENTITY * front; // x-
ENTITY * back; // x+
ENTITY * left; // y+
ENTITY * right; // y-
ENTITY * top; // z+
ENTITY * bottom; // z-
} VOXEL;
VOXEL * VoxelStructure[20][20][20]; // 2D array
void create_voxel()
{
int x, y, z;
for(x = 0; x < 12; x++)
{
for(y = 0; y < 12; y++)
{
for(z = 0; z < 12; z++)
{
VoxelStructure[x][y][z] = sys_malloc(sizeof(VOXEL));
VoxelStructure[x][y][z].front = ent_create("atom.bmp" , vector(voxel_size * x+2, voxel_size * y, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].front.pan = 180;// winkel setzen
VoxelStructure[x][y][z].back = ent_create("atom.bmp" , vector(voxel_size * x-0.001, voxel_size * y, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].back.pan = -180; // winkel setzen
VoxelStructure[x][y][z].left = ent_create( "atom.bmp" , vector(voxel_size * x+1, voxel_size * y+1, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].left.pan = 90; // winkel setzen
VoxelStructure[x][y][z].right = ent_create( "atom.bmp", vector(voxel_size * x+1, voxel_size * y-1, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].right.pan = -90; // winkel setzen
VoxelStructure[x][y][z].top = ent_create( "atom.bmp", vector(voxel_size * x +1, voxel_size * y, voxel_size * z+1), NULL); // seite erstellen
VoxelStructure[x][y][z].top.tilt = 90; // winkel setzen
//VoxelStructure[x][y].bottom = ent_create( "test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
//VoxelStructure[x][y].bottom.xxx = ; // winkel setzen
}
}
}
}
void main()
{
wait(1);
video_set(sys_metrics(0) * 0.75, sys_metrics(1) * 0.75, 0, 2);
fps_max = 60;
max_entities = 48000;
level_load("test.WMB");
wait(1); // warten bis der level geladen ist, kann sonst probleme auf langsamen rechnern / großen leveln geben
create_voxel();
}
wie rechnet sich denn die max_entity zusammen , ich hab die jetzt mal auf sage und schreibe: 48000 gesetzt
Last edited by ratz; 09/11/13 11:45.
|
|
|
Re: Voxel fürs 3d Gamestudio
[Re: ratz]
#429315
09/11/13 11:59
09/11/13 11:59
|
Joined: May 2009
Posts: 5,370 Caucasus
3run
Senior Expert
|
Senior Expert
Joined: May 2009
Posts: 5,370
Caucasus
|
I can't understand German, but there is something wrong going on with your texture size (it's size should be power of 2). Here is how it should looks like, with proper code and proper texture size (64x64): Code:
#include <acknex.h>
#include <default.c>
//
var voxel_size = 64; // hier fur den abstand ;)
typedef struct VOXEL
{
ENTITY * front; // x-
ENTITY * back; // x+
ENTITY * left; // y+
ENTITY * right; // y-
ENTITY * top; // z+
ENTITY * bottom; // z-
} VOXEL;
VOXEL * VoxelStructure[20][20][20]; // 2D array
void create_voxel()
{
int x, y, z;
for(x = 0; x < 6; x++)
{
for(y = 0; y < 6; y++)
{
for(z = 0; z < 6; z++)
{
VoxelStructure[x][y][z] = sys_malloc(sizeof(VOXEL));
VoxelStructure[x][y][z].front = ent_create("brick02.pcx" , vector(voxel_size * x + 32, voxel_size * y, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].front.pan = 180;// winkel setzen
VoxelStructure[x][y][z].back = ent_create("brick02.pcx" , vector(voxel_size * x - 32, voxel_size * y, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].back.pan = -180; // winkel setzen
VoxelStructure[x][y][z].left = ent_create( "brick02.pcx" , vector(voxel_size * x, voxel_size * y + 32, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].left.pan = 90; // winkel setzen
VoxelStructure[x][y][z].right = ent_create( "brick02.pcx", vector(voxel_size * x, voxel_size * y - 32, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].right.pan = -90; // winkel setzen
VoxelStructure[x][y][z].top = ent_create( "brick02.pcx", vector(voxel_size * x, voxel_size * y, voxel_size * z + 32), NULL); // seite erstellen
VoxelStructure[x][y][z].top.tilt = 90; // winkel setzen
VoxelStructure[x][y][z].bottom = ent_create( "brick02.pcx", vector(voxel_size * x, voxel_size * y, voxel_size * z - 32), NULL); // seite erstellen
VoxelStructure[x][y][z].bottom.tilt = 270; // winkel setzen
}
}
}
}
void main()
{
wait(1);
video_set(sys_metrics(0) * 0.75, sys_metrics(1) * 0.75, 0, 2);
fps_max = 60;
max_entities = 48000;
level_load("");
wait(1); // warten bis der level geladen ist, kann sonst probleme auf langsamen rechnern / gro?en leveln geben
create_voxel();
}
Anyway, good luck. Greets
|
|
|
Re: Voxel fürs 3d Gamestudio
[Re: 3run]
#429319
09/11/13 12:35
09/11/13 12:35
|
Joined: Jun 2009
Posts: 2,210 Bavaria, Germany
Kartoffel
Expert
|
Expert
Joined: Jun 2009
Posts: 2,210
Bavaria, Germany
|
@3run: he wanted to have a spaces between them @ratz: max entities? sorry aber so schwer ist das doch nicht... maximales entity-limit. (in deinem fall verwendest du pro block ja 5 entities)
POTATO-MAN saves the day! - Random
|
|
|
Re: Voxel fürs 3d Gamestudio
[Re: Kartoffel]
#429321
09/11/13 12:45
09/11/13 12:45
|
Joined: Oct 2008
Posts: 341
ratz
OP
Senior Member
|
OP
Senior Member
Joined: Oct 2008
Posts: 341
|
wie bekommt man das den hin , dass nicht alle sichtbar sind , wovon du immer redes -> kartoffel ? -> ich habe jetzt den code so bearbeitet, dass wenn man die a taste drückt ein neuer block hinter dem nächten erzeugt wird -> komischer weise kann ich so mehr blöcke (voxel) erzeugen, als wenn ich das mithilfe der for-schleife versuche
#include <acknex.h>
#include <default.c>
//
var voxel_size = 2; // hier 35 für den abstand ;)
var i = 0;
var coord_x = 0;
var coord_y = 0;
var coord_z = 0;
typedef struct VOXEL
{
ENTITY* front; // x-
ENTITY* back; // x+
ENTITY* left; // y+
ENTITY* right; // y-
ENTITY* top; // z+
ENTITY* bottom; // z-
} VOXEL;
VOXEL * VoxelStructure[16][16][16]; // 2D array
void create_atom(i)
{
int x, y, z;
for(x = 0; x < 6; x++)
{
for(y = 0; y < 6; y++)
{
for(z = 0; z < 6; z++)
{
VoxelStructure[x][y][z] = sys_malloc(sizeof(VOXEL));
VoxelStructure[x][y][z].front = ent_create("atom.bmp" , vector(voxel_size *x*coord_x+2, voxel_size * y, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].front.pan = 180;// winkel setzen
VoxelStructure[x][y][z].back = ent_create("atom.bmp" , vector(voxel_size *x*coord_x-0.001, voxel_size * y, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].back.pan = -180; // winkel setzen
VoxelStructure[x][y][z].left = ent_create( "atom.bmp" , vector(voxel_size * x *coord_x+1, voxel_size * y+1, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].left.pan = 90; // winkel setzen
VoxelStructure[x][y][z].right = ent_create( "atom.bmp", vector(voxel_size * x *coord_x+1, voxel_size * y -1, voxel_size * z), NULL); // seite erstellen
VoxelStructure[x][y][z].right.pan = -90; // winkel setzen
VoxelStructure[x][y][z].top = ent_create( "atom.bmp", vector(voxel_size * x *coord_x+1, voxel_size * y , voxel_size * z+1), NULL); // seite erstellen
VoxelStructure[x][y][z].top.tilt = 90; // winkel setzen
//VoxelStructure[x][y].bottom = ent_create( "test1.bmp" , vector(voxel_size * x, voxel_size * y, 0), NULL); // seite erstellen
//VoxelStructure[x][y].bottom.xxx = ; // winkel setzen
}
}
}
}
void main()
{
wait(1);
video_set(sys_metrics(0) * 0.75, sys_metrics(1) * 0.75, 0, 2);
fps_max = 60;
max_entities = 48000;
level_load("test.WMB");
wait(1); // warten bis der level geladen ist, kann sonst probleme auf langsamen rechnern / großen leveln geben
create_atom(i);
while(1)
{
if(key_a == 1)
{
create_atom(i);
i+=1;
coord_x +=5;
}
wait(1);
}
}
Last edited by ratz; 09/11/13 12:51.
|
|
|
Re: Voxel fürs 3d Gamestudio
[Re: ratz]
#429322
09/11/13 12:56
09/11/13 12:56
|
Joined: Jun 2009
Posts: 2,210 Bavaria, Germany
Kartoffel
Expert
|
Expert
Joined: Jun 2009
Posts: 2,210
Bavaria, Germany
|
-> komischer weise kann ich so mehr blöcke (voxel) erzeugen, als wenn ich das mithilfe der for-schleife versuche weil immer wieder speicher allokiert wird, und die vorherigen pointer dabei neugesetzt werden -> du kommst nichtmehr an die entitys ran + memory leak. das mit den seiten ist schwieriger. am besten du machst einen struct für einen chunk, in den du speicherst, wo blöcke sind und wo nicht. dazu brauchst du noch ne funktion zum erstellen der blöcke. in der funktion musst du den chunk durchgehen und für jeden block checken, ob die jeweilige seite erstellt werden soll, oder nicht.
POTATO-MAN saves the day! - Random
|
|
|
Re: Voxel fürs 3d Gamestudio
[Re: Kartoffel]
#429326
09/11/13 13:50
09/11/13 13:50
|
Joined: Oct 2008
Posts: 341
ratz
OP
Senior Member
|
OP
Senior Member
Joined: Oct 2008
Posts: 341
|
ich hab mich mal hingesetzt und folgede formel erfunden , die vtl functionieren könnte:
voxel[i](16,16,16) -> create_chunk[i](1,1,1) // ein voxel von 16³ wird zu ein chunk
reset(create_chunk[i]) -> create_voxel[i] = pos.chunk[i] // wird der chunk gelöscht
// wird er zum voxel
Last edited by ratz; 09/11/13 13:51.
|
|
|
|