Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
08.09.2002, 18:38
gerk



Morgen wieder einmal!

Ich habe ein Problem:
Ich möchte meinen NPC überprüfen lassen, ob der Player hinter ihm steht, bzw. Ob ich ihn ansehe.

Das sollte man mit dem DotProduct - wenn ich mich in meinen mangelnden Mathematikkenntnissen nicht irre - berechnen können. Da es mir aber wie bereits erwähnt an mathematischem Grundwissen hier mangelt (besonders im Bereich Vektoren bin ich noch ziemlich grün), brauche ich eure Hilfe.

1)Bitte ertränkt mich nicht in einem Fluss von Formeln, die ein Durschnittsmensch wie ich sowieso nicht nachvollziehen kann :)

2)Bitte schlagt mich nicht für das Unwissen, denn mein gesamtes Vektoralgebra-Wissen beruht auf meinen autodidaktischen Versuchen, mir anhand von Tutorials etwas beizubringen.

Vielen Dank im Voraus,
Lag

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“


Dieser Beitrag wurde am 08.09.2002 um 18:39 von Lag of death bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
08.09.2002, 21:18
Cuthbert



Hi,

findet das ganze auf 2-dimensionaler ebene statt? würde das ganze vereinfachen.

Der Player udn der NPc brauchen jeweils einen vektor als blickrichtung.
der winkel zwischen den beiden vektoren lässt sich über eine formel berechnen (tja ohne das kommst du nich aus) und das müsste es dann gewesen sein.
wenn der winkel z.b. 0° ist dann ist er hinter dir und wenn er 180^ist dann seht ihr euch an.

mfg cuthbert

p.s. die formel steht im TW. müste mal nachschauen.

--

Die Singlein vögeln und asten von Hupf zu Hupf.

zum Seitenanfang zum Seitenende Profil || Suche
002
09.09.2002, 00:27
Tron



sehr simpel:
du brauchst den sichtvektor des npcs und den verbindungsvektor zwischen npc und spieler (pos_spieler - pos_npc)

daraus berechnest du das punktprodukt (jeweils paarweise die komponenten der vektoren multiplizieren und zusammenaddieren, also x1 * x2 + y1 * y2 + z1 * z2)

ist das ergebnis negativ steht der spieler im halbkreis hinter dem npc.

ein paar kenntnisse von vektoren sind UNABDINGBAR fuer spieleprogrammierung (naja... zumindest fuer die meisten spiele)
fuer dir unbeingt ein paar gute tutorials oder ein mathebuch zu gemuete

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
003
09.09.2002, 20:06
gerk



darf ich fragen, wie das mit dem halbkreis gemeint ist?
meinst du, dass sich der spieler dann in einem bereich von 180° von der sicht des arsches, des npc befindet?

oder hab ich das missverstanden.

@cuthbert: es spielt sich im 3dimensionalen raum ab.

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
004
10.09.2002, 19:51
apfelkorn



das ist von 90° bis 270° vom blickwinkel aus

--

zum Seitenanfang zum Seitenende Profil || Suche
005
10.09.2002, 20:18
gerk



wessen blickwinkel? vom npc, vom arsch des npc's oder meines?

bitte nich haun..

thx schon mal.

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
006
10.09.2002, 21:10
[RMen]OneStone



NPC Blickwinkel

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
007
11.09.2002, 09:11
gerk



ahh *einlichtaufgeht* 90 - 270° jetzt versteh ichs. ich dachte die ganze zeit
falsch.

ok mal (pseudo) c-scriptcode:
Quellcode:
var VecPos[3]; //Verbindungsvektor

Vecpos.x = Player.x - Npc.x;
Vecpos.y = Player.y - Npc.y;
Vecpos.z = Player.z - Npc.z;

FunktionUmEulerWinkelinVektorumzuwandeln(SichtNpc);

DotP();

Wenn Dotp größer 0 dann steh ich hinter dem Npc.

so ungefähr?

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
008
11.09.2002, 09:59
Tron



Zitat:
Lag of death postete
Wenn Dotp größer 0 dann steh ich hinter dem Npc.

so ungefähr?

so ungefaehr....

Zitat:
ist das ergebnis negativ steht der spieler im halbkreis hinter dem npc.

btw: wenn du nicht 180° sondern weniger (z.b. nur direkt dahinter +-30°) als hinten bewerten willst, wird es etwas komplizierter, oder ist 180° das was du willst?

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
009
11.09.2002, 10:19
gerk



nein 180° ist gut.

es geht nur darum, die schmerzen/sterbe-anims korrekt abzuspielen, dass zb der npc nicht nach hinten fällt, wenn ihn ein kopfschuss von hinten killt.

Zitat:

Wenn Dotp größer 0 dann steh ich hinter dem Npc.

natürlich vertippt :)

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
010
11.09.2002, 14:33
Prefect



Sooo kompliziert ist es auch wieder nicht. Wenn du genaue Winkelangaben haben willst mußt du die beiden Vektoren, von denen du den eingeschlossenen Winkel haben willst (in dem Fall halt Sichtvektor und Verbindungsvektor zum Spieler) normalisieren, d.h. auf die Länge 1 bringen, indem du einfach beide Vektoren durch ihre jeweilige Länge teilst.

Dann ist das Dotproduct der Cosinus des Winkels.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
011
12.09.2002, 12:35
gerk



aha. und was ist dann der "eingeschlossene winkel"?

bzw. wie errechne ich den?

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“


Dieser Beitrag wurde am 12.09.2002 um 12:35 von Lag of death bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
012
12.09.2002, 17:34
Cuthbert



den winkel berechnest du mit:

du hast v1 und v2 als vektoren
cos(winkel)=v1*v2(=punktprodukt) / (|v1|*|v2|)

das andere ist der betrag der winkel, d.h. alle komponenten qaudrieren und dann aus der summe die wurzel ziehen. fertig. lecker.

|v1|=sqrt(x*x+y*y+z*z);

in jeder programmiersprache gibt es eine arccos funktion mit der dann der winkel berechnet wird.

mfg cuthbert

--

Die Singlein vögeln und asten von Hupf zu Hupf.

zum Seitenanfang zum Seitenende Profil || Suche
013
12.09.2002, 19:30
gerk



aha. gut das werd ich gleich morgen versuchen. ich bin jetzt einfach zu müde, da ich erst um 5 von der schule heimgekommen bin.

wenn ich aber den sichtwinkel des npcs in nen vektor umwandeln kann, sollte alles in butter sein.

danke erst mal.

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
014
12.09.2002, 21:27
theDon



öhm
das geht auch einfacher (und schneller) mit dem betrag
Quellcode:#define BETRAG(x) (((x))>=0) ? ((x)) : (-((x)))

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
015
13.09.2002, 20:39
gerk



das ist (zumindest für mich) unleserlich.
und unübersichtlich finde ich es auch.
aber ansonsten ganz nett :)
ich hab aber keine ahnung, on das funktionieren würde.

mal abgesehen davon, dass ich den trinären operator nicht mag. da ziehe ich leserlichkeit und übersichtlichkeit kürze und geschwindigkeit(?) vor.

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“


Dieser Beitrag wurde am 13.09.2002 um 20:41 von Lag of death bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
016
13.09.2002, 21:12
the_viking



es sollte eigendlich keine Einbußen von Geschwindigkeit geben, da

(x > 0) ? x=1 : x=2;

oder

if(x>0)
x=1;
else
x=2;

oder

if(x>0)
{
x = 1;
}
else
{
x = 2;
}

vom Compiler (eigendlich) in den gleichen _asm code umwandeln müsste

--

thx, cu, MfG the_viking

(( My =]=H=O=M=E=> Page! ))
Coder bei Brainshock-Interactive und bei Z-Software
My ICQ: #160959446

zum Seitenanfang zum Seitenende Profil || Suche
017
13.09.2002, 21:16
gerk



ich war mir nicht sicher, drum das fragezeichen in den klammern.

--

„Und da wir uns ja seit heute etwas näher gekommen sind, kann ich nur sagen: Mir hilft da immer Norther volle Lautstärke (so wie jetzt), sodass die ganzen unrasierten, Wasserpfeife rauchenden, alternativen Wichsstudenten aus ihren, aus Bananenschalen und Abfall gebastelten, Sitzkissen fliegen.“

zum Seitenanfang zum Seitenende Profil || Suche
018
13.09.2002, 21:36
Archangel



Zitat:
theDon postete
öhm
das geht auch einfacher (und schneller) mit dem betrag
Quellcode:#define BETRAG(x) (((x))>=0) ? ((x)) : (-((x)))

hä? das funktioniert aber dann nur bei zahlen, aber n vector kann man doch nich mit 0 vergleichen.. der betrag eines vectors ist die länge..

oder hab ich jetzt was falsch verstanden ?

--

Mar 01 01:10:13 <voice> jo
Mar 01 01:10:40 <voice> bis dann ^^
Mar 01 01:11:20 <Archangel> jo
**** ENDING LOGGING AT Tue Mar 1 01:58:13 2005

zum Seitenanfang zum Seitenende Profil || Suche
019
13.09.2002, 21:42
theDon



natürlich geht das nur mit zahlen, lässt sich aber analog für einen vektor umbasteln. und schneller als quadrieren und dann wurzelziehen ist es auch

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
020
13.09.2002, 23:39
Tron



oh mann!
1. das geht NICHT mit sowas, es gibt keine andere moeglichkeit als quadrieren und wurzelziehen (das wurzelziehen kann man sich in manchen faellen sparen, aber hier nicht, normalisieren geht NUR so)
2. #define ist EV!L

korrekt sieht eine betragsfunktion SO aus:
template <class T> inline T Betrag(const T& t)
{
return (t < 0) ? -t : t;
}

wobei fuer einen typ T natuerlich die operatoren < und - definiert sein muessen

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
021
13.09.2002, 23:52
theDon



was ist bitte an meinem define evil? mal abgesehn davon das es auch mit c funktioniert und nicht nur mit c++?

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
022
14.09.2002, 13:07
TheTinySteini



Lag of Death: da in 3D-Engines die meisten Vektoren, die eine Richtung angeben, sowieso normalisiert sind (d.h. die Länge 1 haben), ist die Rechung mit dem Winkel sehr einfach.
Du hast den Richtungsvektor, in den der NPC blickt. Und du hast den Vektor player.origin - npc.origin, also den Vektor vom NPC zum Spieler, nennen wir ihn mal vecDir. So, dann normalisierst du vecDir (d.h. vecDir = vecDir / |vecDir|, in HL wäre das einfach vecDir.Normalize(), das macht das gleiche). Und nun denkst du dir nen Winkel aus, unter dem der NPC den Spieler noch sehen soll. Beispielsweise 45°. Dann kann der NPC den Spieler also sehen, wenn der Spieler von der Blickrichtung des NPC unter einem Winkel von -45° < x < 45° steht. Verständlich? Gut. Dann berechnest du den cos von 45°. Sind ungefähr 0,707. Dann berechnest du das Skalarprodukt (Dotproduct) von der Blickrichtung und vecDir, also vecView * vecDir. Dann guckst du, ob das Ergebnis größer als die besagten 0,707 ist. Falls ja, dann ist der Spieler vom NPC aus sichtbar. Falls nein, dann eben nicht.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
023
14.09.2002, 16:09
Cuthbert



@Tiny:
das ist genau das gleiche wenn du die formel nimmst, weil durch den Qoutienten |a|*|b| beide vektoren normalisiert werden. das ist also analog. und man hat als ergebnis einen schönen winkel den man vergleichen kann. ist doch anschaulicher und nachvollziehbarer.

mfg cuthbert

p.s. aber den cosinus zu vergleichen ist auch in ordnung, je nach dem womit der programierer mehr anfangen kann

--

Die Singlein vögeln und asten von Hupf zu Hupf.


Dieser Beitrag wurde am 14.09.2002 um 16:11 von Cuthbert bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
024
14.09.2002, 16:49
Prefect



Im Fall cos direkt vergleichen vs. Winkel vergleichen spielt die Performance allerdings tatsächlich eine Rolle, denn Winkelfunktionen sind nicht sooo schnell (und wenn du direkt mit dem Cosinus vergleichst fällt eine Winkelfunktion raus). Wenn du das nur einmal pro Frame für ein NPC machst ist es vielleicht egal, aber da es IMHO nicht sooo den Unterschied in der Leserlichkeit macht (zur Not halt Konstanten definieren, COS_45 oder so), ist es doch angebrachter.
Wenn du allerdings wirklich den Winkel brauchst ist es wieder was anderes.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche