[C#/C++] Hjälp med korsning mellan två vektor punkter

Permalänk
Medlem

[C#/C++] Hjälp med korsning mellan två vektor punkter

Halloj!

Vänder mig nu till SweC efter några år med denna fråga liggandes i andra forum utan svar. Prövar här nu med förhoppning att någon vänlig själ här kan hjälpa mig med detta.
Kan börja med att jag alltid haft svårt med matematiken så därav behöver jag någon som kan detta då jag förstår ingenting.
Är mycket tacksam om jag kan få det löst någon gång!

Det jag vill göra är att göra en korsning mellan två punkter (vektorer) från startA till endA, baserat på två hastigheter mellan endA (m_hEnemy->velocity) och flSpeed om dem korsas.
Har redan en fungerande funktion för detta, förutom att den behöver skära av när endA korsar ett hinder som är i vägen.

Headers: http://www.megafileupload.com/ex4C/headers.zip

Vector vecStart = pev->origin; // startA vecStart.z += 50; // lyft upp en bit ifrån marken float flSpeed = 1800; Intersect( vecStart, Target(m_hEnemy), m_hEnemy->velocity * 1, flSpeed );

Vector CBase :: Intersect( Vector vecSrc, Vector vecDst, Vector vecMove, float flSpeed ) { Vector vecTo = vecDst - vecSrc; float a = DotProduct( vecMove, vecMove ) - flSpeed * flSpeed; float b = 0 * DotProduct(vecTo, vecMove); float c = DotProduct( vecTo, vecTo ); float t; if (a == 0) { t = c / (flSpeed * flSpeed); } else { t = b * b - 4 * a * c; t = sqrt( t ) / (2.0 * a); float t1 = -b +t; float t2 = -b -t; if (t1 < 0 || t2 < t1) t = t2; else t = t1; } // ALERT( at_console, "Intersect %f\n", t ); if (t < 0.1) t = 0.1; if (t > 10.0) t = 10.0; Vector vecHit = vecTo + vecMove * t; return vecHit.Normalize( ) * flSpeed; }

För avskärningen:

TraceResult tr; TRACE_LINE( vecSrc, Target(m_hEnemy), TRUE, ENT(pev), &tr ); if ( tr.pHit && tr.flFraction != 1.0) { // ett hinder är i vägen }

Permalänk
Avstängd

Hej

Vad menar du med skära av, skall en ny kurs beräknas?

Permalänk
Medlem

@burner1: Yes. Den skal beräkna som jag ritat upp på bilden.
Blir väl att göra så här i såna fall:

TRACE_LINE( vecSrc, Target(m_hEnemy), TRUE, ENT(pev), &tr ); if ( tr.pHit ) { if( tr.flFraction != 1.0 ) return Vector... // hinder i vägen // fri sikt till målet/endA }

Använder detta redan om inte m_hEnemy syns.

Vector vecDir; if (HasConditions( bits_COND_SEE_ENEMY ) && IsAlive(m_hEnemy) ) vecDir = Intersect( vecStart, Target( m_hEnemy ), m_hEnemy->velocity * 1, flSpeed ); else vecDir = gpGlobals->v_forward * flSpeed;

Permalänk
Avstängd

Kan du inte göra det enklast möjliga att låta en tråd uppdatera föremålens positioner varje given tidsenhet, där du kontinuerligt uppdaterar kurs och fart.

Om de bägge föremålet befinner sig på samma värden i koordinatsystemet så har en de träffat varandra?

ps; möjligt att jag inte förstår vad du vill göra

Permalänk
Medlem
Skrivet av burner1:

Kan du inte göra det enklast möjliga att låta en tråd uppdatera föremålens positioner varje given tidsenhet, där du kontinuerligt uppdaterar kurs och fart.

Om de bägge föremålet befinner sig på samma värden i koordinatsystemet så har en de träffat varandra?

ps; möjligt att jag inte förstår vad du vill göra

Kan väl vara bra att nämna att denna ligger och uppdaterar sig hela tiden i en Think() funktion så den gör redan det
Det som kommer från startA är en kula med en hastighet (definierad i float flSpeed) som enbart åker rakt fram.
Hoppas du förstår från mitt perspektiv nu.

Permalänk
Hedersmedlem
Skrivet av burner1:

Om de bägge föremålet befinner sig på samma värden i koordinatsystemet så har en de träffat varandra?

Problemet (om man har ändlig precision) brukar vara att de aldrig hamnar på exakt samma koordinat...

Kanske kan man istället beräkna tidpunkten för skärning med alla väggar, hastigheter och liknande och se vilken som blir minst?