Skalarprodukt = NaN - Ratlosigkeit

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

NightPhoenix

Betreff: Skalarprodukt = NaN - Ratlosigkeit

BeitragDo, Nov 27, 2008 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey leute ich benutze das Skalarprodukt um den Winkel zwischen 2 Vectoren zu berechnen...
Ich habe 2 Objekte: Ein NPC irgendwo und den Spieler
Aktion: Der NPC soll sich auf den Spieler ausrichten
Anmerkung: AlignToVector funktioniert in dem Falle nicht, da es sich in beiden Fällen um Objekte handelt, die an Pivots angehängt sind... die Position des NPC wird aber nur lokal ausgelesen, also ohne Rücksicht auf den Pivot

hier der code:
Code: [AUSKLAPPEN]
Function KI_Zielen(SIPI)
Local max,v1x#,v1y#,v1z#,v2x#,v2y#,v2z#,spx#,spy#,x1#,x2#,y1#,y2#,z1#,z2#,sqx1#,sqy1#,sqx2#,sqy2#,cx#,cy#,cx_old#,cy_old#

      max=100
         pp\kimz#=0;pp\SpeedMax#/15.0
            
            x1#=EntityX(pp\O,1)
            y1#=EntityY(pp\O,1)
            z1#=EntityZ(pp\O,1) ;bestimme Punkt A von NPC
               MoveEntity pp\O,0,0,100
            x2#=EntityX(pp\O,1)
            y2#=EntityY(pp\O,1)
            z2#=EntityZ(pp\O,1) ;bestimme Punkt B von NPC
               MoveEntity pp\O,0,0,-100
            
            v1x#=x2#-x1#
            v1y#=y2#-y1#
            v1z#=z2#-z1# ;Vektor von NPC aus Punkt A und B (AB)
            
            ;x1#=x1#
            ;y1#=y1#
            ;z1#=z1#
            x2#=EntityX(SIPI,1)
            y2#=EntityY(SIPI,1)
            z2#=EntityZ(SIPI,1) ;Punkt C: Position des Spielers
            
            v2x#=x2#-x1#
            v2y#=y2#-y1#
            v2z#=z2#-z1# ;Vektor des Spielers aus A und C (AC)
            
            sqx1#=Sqr((v1x#^2)+(v1z#^2)) ;Wurzelgleichungen
            sqy1#=Sqr((v2x#^2)+(v2z#^2))
            sqx2#=Sqr((v1x#^2)+(v1y#^2))
            sqy2#=Sqr((v2x#^2)+(v2y#^2))
                        
            spx#=(v1x#*v2x#+v1z#*v2z#)/(sqx1#*sqy1#) ;skalarprodukt / 2 wurzeln
            spy#=(v1x#*v2x#+v1y#*v2y#)/(sqx2#*sqy2#)
            
            cx#=ACos(spx#)/100.0 ;Cosinus des Ergebnisses -> Ergibt: Winkel X
            cy#=ACos(spy#)/100.0 ;Cosinus des Ergebnisses -> Ergibt: Winkel Y
                                                
            TurnEntity pp\O,cx#,cy#,0
            
                     
         
         pp\kitx#=0
         pp\kity#=0
         pp\kitz#=0
      
      

End Function


Das Problem ist es wie schon gesagt, dass spx# oder spy# bei annäherung an 0 (also wenig Rotation) den wert "NaN" annehmen... ich hab aber keine idee woran das liegen könnte. Beseitige ich das problem indem ich sage wenn wert<0.1 (winkel) then wert=0 dann dreht sich das objekt wieder und wieder um 360°
Achja wenn es "NaN" annimmt verschwindet das Objekt ... das existiert einfach nicht mehr ^^

Ich wette das ist wieder irgendein dummer Logikfehler, weil ich schonwieder stundenlang damit beschäftigt bin Rolling Eyes
Hoffe jemand kann mir helfen, danke schonmal
NightPhoenix

*edit*
das ist diese Formel hier:
user posted image
nur nach cos (winkel) umgestellt

cos (winkel) = (Skalarprodukt) / (betrag(vektor1)*betrag(vektor2))

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group