2009-05-29 8 views
2

Ich beginne ein Spielprojekt, das es Charakteren erlaubt, sich in dunklen Bereichen zu verstecken. Sich in einer dunklen Ecke zu verstecken, sollte es anderen Charakteren erschweren, dich zu sehen.Berechnung, wie sichtbar ein Objekt in einer 3D-Szene für die Verwendung in der Spiellogik ist/AI

Was ich brauche, ist eine Möglichkeit zu berechnen, wie die Lichtverhältnisse sind, wo das Zeichen befindet.

Das Ideal wäre ein

double getLightFactor(GameCharacter observer, GameCharacter target) 

haben, da ich es annehmen Lichtverhältnisse sein könnte, wo das Licht so fällt, dass verschiedene Seiten des Ziels durch unterschiedliche Mengen von Licht getroffen wird. Aber ich würde gerne begleichen für

double getLightFactor(GameCharacter target) 

das Licht für einen bestimmten Charakter zu erhalten, unabhängig davon, wo Sie beobachten oder sogar

double getLightFactor(int x, int z) 

nur an einem bestimmten Kartenpunkt, das Licht zu bekommen in der Terrain.

Die Methode muss berücksichtigen, dass sich die Lichtbedingungen während des Spielens ändern können, aber da es wiederum auf Runden basiert, könnten einige schwere Berechnungen erlaubt sein. Ich beabsichtige, die Verwendung von Taschenlampen zu ermöglichen, so dass sie ebenfalls berücksichtigt werden müssen (aber sie könnten separat modelliert und gehandhabt werden).

Ich werde Ogre3d verwenden, um meine Szene zu behandeln, aber ich werde gerne generische Lösungen oder sogar Lösungen für andere Motoren akzeptieren (meine Wahl des Motors ist nicht in Stein gemeißelt).

Ideen, Papiere oder wirklich alles relevante ist sehr willkommen!

Antwort

3

Sie könnten die Szene aus der Sicht des Beobachters einfach in einen Offscreen-Puffer rendern (auch in einer eher niedrigen Auflösung), wobei die aktuellen Lichteinstellungen berücksichtigt werden. Dann könnten Sie einen mittleren Helligkeitswert um die Mitte des Zielcharakters berechnen.

Ich weiß nicht, über den Ogre3D Motor, aber das soll eine eher generische Art und Weise sein, Ihr Problem zu umgehen (die Szene schließlich aus einem anderen Blickwinkel nur Rendering ...)

+0

Ich mag diese Antwort. Vor allem, weil ich das gleiche dachte;) Wenn sich das Ziel in den Schatten versteckt, render das Ziel einfach nicht und kein Beobachter kann es auf ihrem Bildschirm sehen. Dieses Problem benötigt einige Änderungen, weil Sie wollen, dass das Ziel 20% sichtbar usw. ist. – ralphtheninja

+0

Ich mag die Idee und werde darüber nachdenken. Nicht sicher, aber es wird schnell genug sein. –

0

Oh Junge. Das hängt sehr vom Motor ab. Ich kann dir jetzt sagen, dass du die zweite Option willst.

Wie funktioniert die Beleuchtung? Ist es dynamisch oder statisch? Nehmen wir an, es ist eine Kombination aus beidem.

Überprüfen Sie für statische Beleuchtung die Lightmap in der Nähe. Es ist entweder vertexbasiert oder eine Textur, Sie können es an einigen Stellen in der Nähe probieren und sie mitteln. Sehen Sie sich an, wie der Motor die Beleuchtung für Modelle berechnet, in den Grafikcode eingräbt und erkennt, woher die Daten tatsächlich stammen. Sie können dieselbe Quelle verwenden. Einige Spiele haben volumetrische Lichtinformationen, Quake 2 tut dies pro Blatt im BSP-Baum (leicht zu überprüfen) und Quake 3 hat volumetrische Texturen (auch leicht zu überprüfen).

Dann müssen Sie die dynamischen Lichter hinzufügen. Eine Möglichkeit besteht darin, Strahlen vom Spieler (wahrscheinlich ein paar verschiedene Strahlen, von verschiedenen Teilen des Spielers) auf die Lichtquelle zu schießen. Zählen Sie, wie viele getroffen werden, und fügen Sie Ihrer Zahl für jede eine kleine Zahl hinzu, je nachdem, wie weit das Licht ist. Alle anständigen Game-Engines haben ein Verfahren für "Shoot Ray und sehen, was es trifft", es ist wie AIs Sichtlinie und wie Sie herausfinden, was Kugeln treffen und was passiert, wenn Sie in die Wand laufen.Schießen Sie nicht zu viele Strahlen zu weit, weil es langsam sein könnte.

Sie müssten diesen Wert nicht zu oft neu berechnen, Sie könnten es tun, wenn eine neue Lichtquelle erstellt wird und dann jede Sekunde oder so.

0

Abhängig von der Komplexität der Umgebung können Sie eine 2D-Lichtkarte überlagern und auf dem Gelände überlagern. Jede Zelle hätte einen Lichtintensitätswert basierend auf den nahegelegenen Lichtquellen. Es wäre schnell zu berechnen, auch für bewegte Objekte, und schnell zu erreichen, um die "Dunkelheit" eines Ortes zu bestimmen.

Sie müssen möglicherweise Shapes mit einfachen Box- oder Kreisalgorithmen "stempeln", abhängig von der Art der Lichter, die Sie haben.