[Verworfen] Sichtfeld als Kegel

Wenn der Kriegsnebel aktiviert ist, kann man den Sichtradius ja mit SetPlrViewRange für verschiedene Objekte festlegen.

Kann ich den Sichtradius auch in anderen Formen festlegen, also z.b in Kegelform?
Ich möchte also z.b den Scheinwerfer aus dem Hazardpaket (bei Furniture/Lights zu finden) nutzen. Dieser hat einen kegelförmigen Lichtstrahl und man kann ihn schwenken.
Nun soll der Sichtradius, den dieser scheinwerfer macht, die Form seines Lichtes haben, vllt noch ein bisschen größer, aber jedenfalls kegelförmig und mit dem Licht schwenkbar sein.

Ist sowas umsetzbar? Oder vllt in etwas abgewandelter Form?

EDIT:
vllt könnte man auch einfach im Lichtkegel Objekte mit Sichtradius erzeugen, oder man gibt dem Gegel selbst Lichtradius… wobei ersteres vermutlich genauer wäre.

Einfach so fertig gibt es das nicht.

Du könntest ein schwarzes Viereck nehmen und da den Sichtkegel ausschneiden und dieses Viereck dann richtig gedreht über den Clonk legen. Das könnte OK aussehen

Und für den Strahler könnte man mehrere kleine Objekte in Richtung des Strahlers platzieren, die den FoW aufheben. Die weiter hinten halt etwas mehr. Ergibt auch einen Kegel.

danke für die Idee =) also du meinst also mithilfe einer Form Sichtbereich verdecken, richtig?  Das würde dann aber auch heißen, dass es verdeckt wäre, obwolh z.b ein Clonk mit ausreichend Sichtradius da ist, oder? Dann wäre es nicht so gut in der Praxis, aber dennoch danke.

ja genau, das war das, was ich mit in meinem "Edit" überlegt hatte. Ich glaube das ist die beste und einfachste Umsetzung.

Jetzt ist nur noch die Frage wie man solche Objekte erstellt, die eben an der richtigen Stelle des lichtkegels sind und außerdem keinerlei interaktion mit dem Rest der Spielwelt haben… 
Das Skript von diesem Scheinwerfer hast du/habt ihr vermutlich alle, oder? Ist in Hazard/Structures/Furniture/Lights zu finden.

Was muss man für ein Script für ein Objekt schreiben, damit sowas klappt?

man könnte die Funktionsweise des Fernrohrs nutzen, welches es im "E.P.I.C. Melee Pack" gibt. Wenn ihr euch das mal anschauen wollt, das gibt es auch auf ccan.de.
Im Epic Pack hat der Clonk automatisch einen begrenzten Sichtradius (im clonkskript verankert). Jedenfalls gibt es dort unter Tools das Fernrohr. Mit diesem kann man in die ferne schauen, also in der ferne Sichtradius erzeugen. Dieser wandert kreisförmig in die gewählte Richtung.

Das heißt wenn sowas möglich ist, dann ist es auch möglich solche Sichtkreise in Kegelform anzuordnen :slight_smile:
Vllt schaut ihr euch mal das Fernrohr genauer an. Hier nur mal kurz das Script des Objekts, welches für die Sicht sorgt:
/– Fernrohr-Sichtfenster –/

/#strict

local iDistance;
local iYDir;

protected func Initialize()
{
   iDistance=100;
   SetAction("Fly");
   return(1);
}

protected func Fly()
{
  SetYDir(iYDir,this());
  if(InLiquid()) iDistance-=4;
   else --iDistance;
  if(iDistance<1) RemoveObject();
  return(1);
}
 
protected func Hit()
{
   RemoveObject();
   return(1);
}


Wie könnte ich das nutzen?

Originalpack tut's auch. Schau dir mal die Fackel aus Der Schlund (Chasm.c4d) an, da gibt es ein spezielles "Licht"-Objekt, das ungefähr das macht, was du willst.

ah, da kommt die Fackel also her =) wusste garnicht, dass es in den Szenarien noch weitere Objekte gibt, danke für den Hinweis =)
Die Fackel kannte ich bisher nur aus dem "Torches" Pack, welches auch zum Download gibt. Dort habe ich die fackel bereits abgeändert, also habe ihr noch richtige Lichteffekte aus dem Hazardpack hinzugefügt.

Aber leider sehe ich nicht, wie ich damit nun die Sichtradien wie gewünscht anordnen kann… den "SetPlrViewRange" Befehl, welcher bei der fackel verwendet wird, kenne ich schon und natürlich muss ich den auch verwenden. Aber die Frage ist jetzt hauptsächlich, wie ich es schaffe, dass diese in dem Lichtstrahl des Flutlichtes angeordnet werden.

Also ich stelle es mir irgendwie so vor, dass wir verschiedene "SetPlrViewRange" Größen haben und  dann sagen: der kleinste Sichtkreis kommt direkt vor den Scheinwerfer. Dann in einer entfernung von x kommt der etwas größere Sichtkreis. Und dann der nächste. 
Nur weiß ich nicht, wie ich das praktisch umsetzen kann. Man kann den Lichtkegel ja auch bewegen. Der Sichtkreis sollte sich dabei dann mitbewegen, also müssen sie an dem Lichtkegel verankert werden.

Ach und wenn wir grade bei "setPlrViewRange" sind, da gibt es ein Minium, oder? Wenn ich es auf 1 setze, ist der Kreis genauso groß ,wie wenn ich es auf 10 setze.  Kann man das iwie trotzdem noch kleiner machen? Ich glaub 20 oderso in dem Dreh ist das Minimum.

>Ach und wenn wir grade bei "setPlrViewRange" sind, da gibt es ein Minium, oder?


FoWRes in der Scenario.txt.

>Aber leider sehe ich nicht, wie ich damit nun die Sichtradien wie gewünscht anordnen kann... den "SetPlrViewRange" Befehl, welcher bei der fackel verwendet wird, kenne ich schon und natürlich muss ich den auch verwenden. Aber die Frage ist jetzt hauptsächlich, wie ich es schaffe, dass diese in dem Lichtstrahl des Flutlichtes angeordnet werden.


Das ist lineare Interpolation mit ein bisschen Trigonomagie. Ich hab hier mal ein Beispiel mit Partikeln gebaut. Mit "TurnTo(Winkel)" kannst du das auf einen Winkel drehen.

FowRes ist interessant danke, aber es verbessert halt nur die Qualität das nebels, also in welchen großen "Stücken" etwas auf/zu gedeckt wird.  Habs mal auf 1 gestellt, hakt dann natürlich etwas, aber die Lore hat, obwohl ich ihr eine Sichtweite von 1 gegeben habe, immernoch dieselbe Sichtweite wie meine Clonks mit 40 Sichtweite. Also daran ändert das leider nichts, weshalb der Standardwert ausreicht.

Danke für dein Objekt, habe es mal ins scheinwerferscript reingepackt:
protected func Initialize()
{
  pLight = CreateObject(CONE, 0,0, -1);
  pLight -> Activate(this());
}

An der Stelle wo nun CONE steht, steht eigentlich "FLHH" also das Licht, welches beim Scheinwerfer direkt imselben Ordner ist.  Natürlich funktioniert das so noch nicht, aber ich konnte zumindest die Kegelform sehen, die du da erstellt hast aus den roten punkten, sieht super aus =)

Ich weiß nur leider nicht, wie ich das nun korrekt integrieren kann… und Sichtradius verleiht das bisher ja auch noch nicht, aber ich vermute mal du wolltest jetzt erstmal nur eine schöne kegelform erstellen?

Wo der Scheinwerfer zu finden ist, hab ich ja im ersten Post hier geschrieben, kannst da ja mal reinschauen, wenn du etwas Zeit hast =)
Wäre gut, wenn man dann einfach alles was geht vom scheinwerfer übernimmt. Drehen tut der sich ja so wie ein geschützturm.

Hm, ich hatte ganz vergessen, dass SetPlrViewRange einen dritten Parameter hat. Für Werte kleiner als 128 muss der wahr sein. Trotzdem sieht FoW mit extrem kleinen Radien ziemlich komisch aus (oder bleibt ganz schwarz ab ~10 Pixeln Radius).

>Ich weiß nur leider nicht, wie ich das nun korrekt integrieren kann… und Sichtradius verleiht das bisher ja auch noch nicht, aber ich vermute mal du wolltest jetzt erstmal nur eine schöne kegelform erstellen?


Das war mehr oder weniger als Proof of Concept gedacht, damit du dir die Mathematik da drin anschauen kannst. Es sollte reichen, wenn du den TimerCall als Initialisierung nimmst, die CreateParticle-Calls durch CreateObject für die einzelnen Lichter ersetzt (DrawCircle ist dann auch überflüssig) und z.B. das ganze in ein Array schreibst, um bei Drehung die Lichter alle neu auszurichten. Eventuell musst du auch die Besitzer irgendwie anpassen, damit der FoW für jeden Spieler aufgehoben wird (Die Fackel erzeugt z.B. ein Licht für jeden Spieler).

danke dir.
Leider bin ich noch sehr neu und ziemlich unerfahren. Ich kann alles was mir hier im Forum bereits beigebracht wurde.
Aber das ist leider noch nicht genug, um das nun einfach umzusetzen =/ 

Ich danke dir nochmal für dein Objekt, aber ich glaube alleine komme ich damit nicht weit.

Ich könnte mir aber vorstellen, dass es auch einfacher umsetzbar ist. Und zwar hat der Scheinwerfer ja bereits einen Lichtkegel, also eine weiße Grafik dafür. Dieser bewegt sich bereits so wie er es soll.  Man müsste also lediglich auf diesen Kegel 2 bis 3 Punkte setzen, um die ein Sichtradius gemacht wird.  Also zb direkt vor dem Scheinwerfer auf dem Lichtkegel z.b Sichtradius 30 und ganz am Ende des Lichtkgegels nochmal einen Punkt mit sichtradius 60.  So oder so ähnlich.  Nur fehlt mir dafür ein Befehl, um den Sichtradius genau an diesen Stellen zu platzieren.

>Nur fehlt mir dafür ein Befehl, um den Sichtradius genau an diesen Stellen zu platzieren.


Den gibt es (zumindest meines Wissens nach) nicht. FoW ist in Clonk ein bisschen fummelig, da nur Objekte den FoW lüften können und das auch nur für ihren Besitzer, wenn ich mich recht erinnere. Statt den Sichtradius an einem Punkt zu setzen, musst du ein Objekt mit einem gewissen Sichtradius (SetPlrViewRange) an der entsprechenden Position erstellen. Praktischerweise bleibt das Objekt auch da, wenn du die Kategorie auf C4D_StaticBack setzt.

>Leider bin ich noch sehr neu und ziemlich unerfahren. Ich kann alles was mir hier im Forum bereits beigebracht wurde.
>Aber das ist leider noch nicht genug, um das nun einfach umzusetzen =/ 


Versuch dich am besten langsam dem Problem zu nähern und zerleg es in Teilprobleme. Z.B.:
-Erstellen eines Licht-Objektes mit gewissem Sichtradius für einen bestimmten Spieler (Stichwort CreateObject und SetPlrViewRange)
-Ein Objekt, das die Licht Objekte von oben in einer Linie erzeugt (Stichwort: for-Schleife)
-Sichtradien sollen mit der Entfernung anwachsen (lineare Interpolation bzw. Geradengleichung ist da das Stichwort)
-Drehung der "Lichtlinie" mit Sinus und Cosinus (Stichwort Trigonometrie und Einheitskreis)
Wenn du irgendwo festhängst, findest du mit Sicherheit hier oder im IRC jemanden, der dir hilft.

>Ich könnte mir aber vorstellen, dass es auch einfacher umsetzbar ist.


Ich fürchte, der Hazard-Lichtkegel ist noch komplizierter, da er die Draw-Transformationsmatrix für die Rotation benutzt. Hazard ist an sich für Anfänger meiner Ansicht nach ein bisschen hart, aber das musst du selbst wissen.

okay, danke…

Da ich zurzeit noch viele andere Baustellen habe, siehe die anderen Threads hier von mir, verschiebe ich das Lichtkegelprojekt erstmal nach hinten.  Das Aufwand/Nutzen Verhältnis scheint mir da nämlich nicht besonders gut zu sein :smiley: (wenn man bedenkt, dass ich für die "einfachsten" Dinge hier schon Tage brauche, dann wird dieses projekt hier einfach viel zu lange dauern)  Deswegen werde ich vorübergehend stattdessen dem Scheinwerfer selbst einen großen Sichtradius von z.b 500 oderso geben und die Drehung des Lichtes ist dann einfach nur ein hübscher Effekt ohne Auswrikung.
Wenn ich mit allem anderen fertig bin, dann überlege ich mir nochmal, ob ich das hier nun umsetze, oder ob ich darauf verzichten kann.

edit:
ah ich hatte deine Antwort zum Sichtradius und dem dritten Parameter überlesen, super danke, das funktioniert :slight_smile: sieht nun für  die Lore z.b so aus:
SetPlrViewRange(50,this(),1);