Landschaft programmieren

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Die Modell-Daten der Welt werden in räumliche Datenstrukturen gespeichert (z.B. Octree, kd-Tree oder BSP-Tree). Diese Datenstrukturen haben bestimmte Eigenschaften. Ordnet man den Spieler in die Struktur ein, sind beispielsweise die Nachbarknoten räumlich ebenfalls Nachbarn. D.h. man muss gar nicht erst jedes Polygon durchchecken ob es mit dem Spieler kollidiert, sondern reduziert bereits auf die Polygone, die in der Nähe des Spielers sind.

Verwendet man ein grobes Kollisionsmodell für den Spieler (AABB, OBB, und wie sie alle heißen), kann man im Vorfeld mit relativ wenig Operationen checken, ob überhaupt eine Kollision möglich ist.

Eine wirklich polygongenaue Kollisionserkennung wird nicht immer durchgeführt sondern meist nur eine Hüllkörper-Kollision (meist kreisförmig). Die ist einfacher zu berechnen. Erkennt man leicht daran, dass Körperteile in der Wand verschwinden, aber man nicht durchlaufen kann oder durch Spalten, durch die man eigentlich durchkommen müsste nicht durchkommt.

Es gibt verschiedene Verfahren wie man die Modelldaten organisieren kann / sollte um Vorteile bei der Kollisionsberechnung zu erhalten. Im Grunde gehts immer darum, so viele Modelle, Regionen und Polygone im Vorfeld auszuschließen. Und für die Berechnung selbst gibts auch wieder Verfahren. Viel zu viel um das hier alles zu erläutern.

Google mal nach:

BSP-Tree, kd-Tree, Octree, Collision Detection, Hüllkörper, Hit-Testing, Bounding-Volume

Verstehe ich das richtig, dass die gesamte Welt in ein 3-Deminsionales Raster gelegt wird, und dann geprüft wird, wo man gerade steht?

0
@YlLaY

Beim Octree wird der Raum gleichmäßig unterteilt (Quadrate) und durch diese Aufteilung kommt man leicht an die Nachbarelemente. Stell dir ein Kuchen vor den du viertelst und ein viertel erneut viertelst. Und einige dieser 16tel erneut viertelst. Wenn du dir ein Stück aussuchst, kannst du mit relativ wenig Aufwand die Stücke finden, die nebendran liegen, selbst wenn der Kuchen gigantisch groß ist. Octrees sind aber nicht das non-plus-ultra. Sobald Objekte ungleichmäßig verteilt sind (z.B. sich irgendwo sammeln) wird die Struktur ineffizient. Dann sind kd-Trees besser.

Dieses "3-dimensionale Raster" (wie du dir es vorstellst) ist eine Visualisierung dieser Datenstruktur (welcher Bereich ist in welchem Knoten). Wie dieses "Raster" aussieht, hängt von der verwendeten Datenstruktur ab. Beim Octree hast du das typische Raster (gleichmäßige Abstände).

<a href="http://www.iue.tuwien.ac.at/phd/stippel/_14207_figure1825.gif" target="_blank">www.iue.tuwien.ac.at/phd/stippel/\_14207\_figure1825.gif</a>

Hier wird die Geometrie eines Lochs in einem Würfel mit Octrees repräsentiert.

Beim kd-Tree wird der Raum immer an Punkten (das können Modelle aber auch Vertices sein, je nachdem wo man ihn anwendet) zerschnitten. Das sieht dann etwa so aus wenn mans visualisiert:

tcl3d.org/images/tcl3d/rtVis/rtVis-KdTree.png

Siehst du den Unterschied? Das Raster sieht willkürlich zerschnitten aus (eigentlich ist es kein "Raster", da es ungleichmäßig aufgebaut ist). Der kd-Tree passt sich der Verteilung an.

0

OpenGL und DirectX sind für mehrere Programmiersprachen erreichbar. Es lautet aber ganz anders.

Solche spiele wie GTA laufen ja in einer Engine, dass heist das spiel wirde gsr nicht richtig programmiert. Außerdem eignet sich die sprache Phyton viel besser für 2D/3D spiele. Man kann auch völlig ohne programmieren 3D spiele erzeugen und zwar mit der freeware Blender.

warum ist dann c++ DIE sprache für spiele ?
und natürlich werden die noch richtig programmiert, wie das garfiktechnisch abläuft weiß ich nicht (wird wahrscheinlich von nem level designer gemacht) aber was ein spiel doch eigentlich ausmacht sind die KI`s

0

Spiele werden sehr wohl noch programmiert. Große Game-Engines wie Unity bieten zwar klasse Tools mit denen man viele Sachen zusammenklicken kann, aber das ist ein kleiner Teil.

Rockstar verwendet RAGE (Rockstar Advanced Game Engine). Eine Game-Engine die Rockstar selber entwickelt (und damit auch programmiert) hat. Wenn man sich sowas baut, hat man bei den elementaren Funktionen eine Datenbank, die man wiederverwenden kann (wer will schon das Rad neu erfinden, wenn das alte super funktioniert und bereits eingefahren ist?).

Aber selbst wenn man das hat - die Spielelogik kann man nicht zusammenklicken (allein schon aus dem Grund das jedes Spiel etwas anders ist). Bei einfachen Shootern geht das vielleicht ansatzweise noch (die sind ja zumindest prinzipiell gleich), aber selbst da muss man dann an der Logik schrauben. Bei einem hochkomplexen Spiel wie GTA ist das unmöglich alles zusammenzuklicken.

Und deine Behauptung, dass sich Python besser für 2D/3D-Spiele eignet ist so nicht ganz richtig. Für Spiele die Umfang / Komplexität von GTA und co haben eignet sich Python überhaupt nicht. Bei solchen Titeln muss man hocheffiziente Programme schreiben. Das kann man mit C++ besser, da man hier eine sehr gute Mischung aus hardware-nähe und Abstraktionsfähigkeit hat. In Python mag die Entwicklung bequemer ("besser") sein, aber nicht das Ergebnis

0

Richtige Programmiersprache für das Projekt (3D Minesweeper)

Guten Abend liebe Leute!

Habe soeben meinen dritten Master erworben und beginne jetzt den vierten Bachelor, in Biomedical Engineering.. Wie man sich vorstellen kann werde ich hier mit einigen Programmiersprachen konfrontiert - großteils Neuland für mich - und um diese spielend zu lernen habe ich mir als ersten Meilenstein gesetzt, ein 3D Minesweeper Spiel zu programmieren. Ich würde dies am liebsten in C machen, egal wie umständlich das sein mag, da C eine der wichtigsten Sprachen in biomed ist. Meine Frage: Ist das überhaupt möglich? Ich kann es mir in C# vorstellen, aber in C?

Freue mich auf eure Antworten! Erklärungen zum Wieso und Wie sind Beste Antwort material!

...zur Frage

Simulation programmieren

Hallo,

Ich bin gerade dabei eine Simulation zu schreiben und hab aber obwohl ich mich echt informiert habe keine Ahnung, wie ich das anstellen soll. Am liebsten möchte ich in Visual Basic programmieren.

Und zwar sollen einfach eine bestimmte Anzahl an Kreisen in einem Feld (2D) sich bewegen mit verschiedenen Geschwindigkeiten. An der "Wand" und wenn sie zusammenstoßen, sollen sie möglichst realistisch abgestoßen werden.

Wie genau macht man das jetzt normal, dass auch bei größerer Anzahl an Kreisen das Programm flüssig läuft?

Bin über jede Hilfe dankbar, weil ich jetzt schon ewig nach einer Lösung geschaut habe...

PS: Es geht um eine Simulation zur kin. Gastheorie, so ähnlich wie hier: http://falstad.com/gas/

...zur Frage

3D Spiele programmieren mit Visual Basic

Hallo,

Ist es möglich mit Visual Basic ein 3D Spiel zu programmieren? Welche anderen Programme brauche ich dazu? Kann man XNA für Visual Basic kompatibel machen?

Danke

...zur Frage

C# oder Python lernen?

Ich möchte anfangen Spiele zu programmieren (erstmal 2D später dann auch 3D) aber kann mich nicht zwischen C# und Python entscheiden. Welche Sprache findet ihr am besten um Spiele zu programmieren? Oder würdet ihr doch eine andere auswählen?

MFG Niels | GameTerrorLP | gnivciv

...zur Frage

Gibt es ein farbiges 3D-Programm, mit dem man ein Haus planen (erbauen) und einrichten kann?

Bitte nennt mir welche.

...zur Frage

LWJGL (OpenGL) Problem Quadrate

Hey Leute,

Ich hab neulic einbisschen mit OpenGL angefangen und es ist einfach nur super. Doch ich bin auf ein problem gestoßen: Ich wollte eine Funktion schreiben die ein oder mehrere Quadrate animiert. Das lief bei der einstellung GL_LINE_LOOP auch super bloß wenn ich auf GL_QUADS umstell kommen Fehler dabei raus (Bilder im Anhang) Funktion (d steht für die x, e für die y und f für die z Achsenverschiebung. b ist praktisch die größe und r, g und bl die Farben.)

public static void Quadrat(float d, float e, float f, float b, float r, float g, float bl){
    glBegin(GL_QUADS);

    //VORNE
    glColor3f(r,g,bl); 
    glVertex3f(-b+d, b+e, b+f);        

    glVertex3f(-b+d,-b+e, b+f);
    glVertex3f( b+d,-b+e, b+f);
    glVertex3f( b+d, b+e, b+f);    

    //OBEN
    //glColor3f(0f,1f,0.5f);

    glVertex3f( b+d, b+e,-b+f);        
    glVertex3f(-b+d, b+e,-b+f);
    glVertex3f(-b+d, b+e, b+f); 
    //LINKS
    //glColor3f(0f,b,1.0f); 
    glVertex3f( -b+d, b+e, b+f);        
    glVertex3f( -b+d, b+e,-b+f);        
    glVertex3f( -b+d,-b+e,-b+f);
    glVertex3f( -b+d,-b+e, b+f); 
    //UNTEN
    //glColor3f(0f,1f,0.25f);
    glVertex3f( b+d,-b+e, b+f);        
    glVertex3f( b+d,-b+e,-b+f);        
    glVertex3f(-b+d,-b+e,-b+f);
    glVertex3f(-b+d,-b+e, b+f); 
    //RECHTS
    //glColor3f(1f,0.5f,1.0f); 
    glVertex3f( b+d,-b+e, b+f);       
    glVertex3f( b+d,-b+e,-b+f);        
    glVertex3f( b+d, b+e,-b+f);
    glVertex3f( b+d, b+e, b+f); 

        glEnd();
    }

Also wie gesagt ich bin noch OpenGL Anfänger ^^ Könnt ihr mir helfen? Dank!

MFG David Schwarzbeck

...zur Frage

Was möchtest Du wissen?