SpawnAlgorithmus auf einer Kugel / Kollisionsberechnung der einzelnen Objekte

Neue Frage »

zorg Auf diesen Beitrag antworten »
SpawnAlgorithmus auf einer Kugel / Kollisionsberechnung der einzelnen Objekte
Meine Frage:
Hallo,
ich sitze grade an einem Algorithmus für eine programmierte Simulation. Dabei sollen Objekte an der Position x,y,z mit der Größe a,b,c um eine Kugel herum platziert werden.

Die Berechnung eines Punktes zur Platzierung habe ich bereits, zusätzlich wird noch eine Distanz addiert, da das Objekt auf die Kugel "fallen" soll.

Die Kugel soll einen Planeten darstellen und die Objekte (Gegenstände) sollen auf die Kugel per Gravitation fallen.

Nun zu meinem Problem:

Die Berechnung soll prüfen, ob das Objekt mit den oben genannten Angaben dort platziert werden darf OHNE mit einem anderen Objekt zu kollidieren.

Die Kugel habe ich zu Beginn erstmal bei den Koordinaten 0,0,0 platziert.

Den Radius r hat man auch gegeben.

Der Algorithmus muss also beim Platzieren eines neuen Objektes prüfen, ob das neue Objekt beim Landen auf dem Planeten mit einem bereits platzierten Objekt kollidieren würde.

Meine Ideen:
Ich habe das Ganze schonmal angefangen zu programmieren, vielleicht ist ja jemand in der Programmierung bewandert und kann meinen Ansatz nachvollziehen smile

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
public class WorldGenerator : MonoBehaviour
{
    CalcCoordinates calculator;

    GameObject planet;
    public GameObject[] planetPrefabs;
    public GameObject[] skyPrefabs;
    public GameObject[] spacePrefabs;

    void Start()
    {
        calculator = GameObject.FindGameObjectWithTag("Calculator").GetComponent<CalcCoordinates>();

        planet = GameObject.FindGameObjectWithTag("Planet");

        SpawnObjects(planet, planetPrefabs, PlayerPrefs.GetInt("planetObjectsCount"), 50);
        SpawnObjects(planet, skyPrefabs, PlayerPrefs.GetInt("skyObjectsCount"), 150);
        SpawnObjects(planet, spacePrefabs, PlayerPrefs.GetInt("spaceObjectsCount"), 200);
    }

    private void SpawnObjects(GameObject planet, GameObject[] prefabs, float objectCount, float distanceToPlanet)
    {
        List<gameObject> spawnObjectsList = new List<gameObject>();
        for (int i = 0; i < objectCount; i++)
        {
            gameObject spawnObject = prefabs[Random.Range(0, prefabs.Length)];
            Vector3 spawnPos = calculator.CalcPointOnSphere(distanceToPlanet);
            if(CheckSpawnPoint(spawnObjectsList, spawnObject, spawnPos))
            {
                    gameObject objectToSpawn = (gameObject)Instantiate(spawnObject, spawnPos, Quaternion.identity);
                    spawnObjectsList.Add(objectToSpawn);
            }
        }
    }
    
    private bool CheckSpawnPoint(List<gameObject> spawnObjectsList, GameObject objectToSpawn, Vector3 spawnPos)
    {
        foreach(gameObject listObject in spawnObjectsList)
        {
            if(wenn das zu spawnende objekt mit einem bereits vorhandenen Objekt kollidieren würde ...) // HIER ENDET DER ANSATZ
            {
                return false;
            }
        }
        return true;
    }
}


Falls jemand diesen Code gerne erklärt haben möchte, einfach melden!

Mein weiterer Ansatz:

Zunächst würde ich berechnen, wo das neue Objekt auf dem Planeten "landen" würde. Dazu würde ich aus den beiden Punkten Planetenursprung und "SpawnPosition" einen Schnittpunkt auf der Kugeloberfläche berechnen.

Also Schnittpunkt einer Strecke auf einem Kreis?

Aber es wäre super wenn jemand mir bei meinem Problem unter die Arme greifen könnte, unser Programmierlehrer hat bereits kapituliert. Big Laugh
Winston Smith Auf diesen Beitrag antworten »

Hallo smile

Ich finde das Theman grundsätzlich sehr Interesannt... bin aber nicht soo fit in Programmiersprachen....
Ein paar Gedanken:
1.) Welche Sprache ist das eigentlich?

2.) Bewegen sich dein "Objekte" nach Landung oder sind diese dann Statisch?
-Statisch macht die Sache einfacher. Bei Bewegung müsstest du ja noch die Zeitkomponente ins Spiel bringen.

3.) Ansatz"Also Schnittpunkt einer Strecke auf einem Kreis?"
Ich würde eher sagen Schnittpunkt eines Vektors (also die "Orbitale Landungskapsel")mit einer Kugel-Planeten (Weil ja 3D)

-bei der gelegenheit, willst du beim "Fall" im Bezug auf Gravitation (da würde dann die Masse des Planeten eine Rolle spielen. Natürlich kannst du das auch Willkürlich festlegen.) auch eine Aufschlagsberechnung durchführen? also ob das Objekt zu schnell ist und eine Bruchlandung möglich ist oder ab alles glatt Landet.

-" zusätzlich wird noch eine Distanz addiert, da das Objekt auf die Kugel "fallen" soll."
also brauchst du eine größere Kugel die deinen PLaneten umschliest. Das wäre dann sowas wie deine Atmosphäre bzw. Erreignishorizont. (Ich nehme an, das der Weltraum in deinem Setting keine Rolle spielt. Ansonsten musst du ja noch die Vektoren Prüfen mit Zeit, ob eine Kollision im Wltraum stattfindet.).

Also zuerst der Schnittpunkt Erreignishorizont mit Vektor, von da aus Senkrecht zum Planeten.

4.)Projektion auf 2D
Hast du mal darüber nachgedacht, eine 2D Darstellung zu wählen?
Also die Oberfläche deiner Kugel ganz klasssich auf eine Karte zu Projezieren?
https://de.wikipedia.org/wiki/Kartennetzentwurf
Wenn du das einmal gemacht hättest, wäre doch eine Prüfung der Kollision mit einfachem X und Z vergleich möglich (plus der Größe natürlich, was aber auch nicht schwer wird) und Y könnte man vernachlässigen.
Desweiteren würde die Darstellung der Planetenoberfläche vereinfacht werden.

(Ich persönlich ziehe in einem Computerspiel die 2D Darstellung der 3D Planetendarstellung vor)

Meiner Meinung nach wäre das zwar zuerst recht aufwendig, aber dafür wäre alles was danach kommt ein klacks.
Den einzigen 3D Schnittpunkt den du bräuchtest, wäre der Vektor (Raumsprung) und der Schnittpunkt mit der Atmophäre/Erreignishorziont.
Von da ab könntest du dann auf der 2D Karte alles weitere berechnen.
Auch die Interaktion von Objekten auf der Oberfläche wäre dann deutlich einfacher.


hmja... wenn mir noch was einfällt, reiche ich das nach smile
Ich hoffe ich konnte dir die ein oder andere Idee geben. Bei den Programmierdeatils hinsichtlich von Sprachen muss ich leider passen :/ aber bei den Grunsätzlichen Prizipien helfe ich gern, wenn ich kann smile
Winston Smith Auf diesen Beitrag antworten »

Durch deine Beschreibungen, kam mir das Spiel

"Planetary Annihilation"

in den Sinn....

Vieleicht findest du in dem Zusamenhang was brauchbares smile
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »