Autor Wątek: PhysX podążanie kamery za objektem  (Przeczytany 921 razy)

Offline xardas97260

  • Użytkownik

# Wrzesień 25, 2010, 09:47:37
Witam. Czy możecie powiedziec, jak zrobić, żeby kamera podążała za obiektem?
Objekt tworzę tak:
CreateBox(NxVec3(5,0,0), NxVec3(0.5,1,0.5), 20);Dzięki za góry za pomoc

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Wrzesień 25, 2010, 10:39:18
Albo ray cast (wg mnie najlepsze rozwiazanie ) albo mozna macierzami. Ogolna zasada jest taka ze potrzebujesz miec 2 punkty pozycja akutlana i pozycja klatke puzniej, z nich obliczasz kierunek patrzenia a z kad kameta  bedzie patrzec mozna sobie zrobic na zasadzie takiego "wysiegnika"

warto zajrzec do tutoriala z RayCastCar z physX SDK

motoda ktora ja uzywam:

Kod: (c++) [Zaznacz]

NxVec3 v3Position = CarVechicle->getActor()->getGlobalPose().t;

NxVec3 v3LookFromPos;

float fNudge = (s_v3LastBaseLookFromPos - v3Position).magnitude();
if (fNudge < CarVechicle->getCameraDistance())
{
fNudge = CarVechicle->getCameraDistance() - fNudge;
s_v3LastBaseLookFromPos -= NxVec3(0,0,0) * fNudge * 1.1f;
s_v3LastBaseLookFromPos.y += fNudge * 0.2f;
}

s_v3LastBaseLookFromPos -= CarVechicle->getActor()->getLinearVelocity() * 0.006f;

NxVec3 v3FacingNudge = NxVec3( 0, 0, 0 ) * 0.2f * s_fFacing;
v3FacingNudge.y = 0.0f;
s_v3LastBaseLookFromPos -= v3FacingNudge;

float fDot = (v3Position - s_v3LastBaseLookFromPos).dot(NxVec3(0,0,0));
s_fFacing = fDot * 0.1f;

if (s_fFacing > 1.0f)
s_fFacing = 1.0f;
else if (s_fFacing < -1.0f)
s_fFacing = -1.0f;

NxVec3 v3LookDirection = v3Position - s_v3LastBaseLookFromPos;
float fMag = v3LookDirection.magnitude();
if (fMag > 0.0f)
v3LookDirection /= fMag;

v3LookFromPos = v3Position - v3LookDirection * CarVechicle->getCameraDistance();

s_v3LastBaseLookFromPos = v3LookFromPos;

if ( abs(v3LookDirection.y) <= 0.99f )
{
v3LookFromPos += k_v3LookFromPos;
NxVec3 v3LookAtPos = (v3Position + k_v3fLookAtPos);

NxVec3 Ray = v3LookFromPos - v3LookAtPos;
NxVec3 d( Ray );
d.normalize();

NxVec3 result;
if( MainPhysic.TraceLine( result, NULL, v3LookAtPos, d,Ray.magnitude(),
TRACE_STATIC | TRACE_DYNAMIC, (1<<0)|(1<<1), TRACE_POSITION ) )
v3LookFromPos = result + v3LookDirection*0.2f;

Dir = -d;
Dir.normalize();
}

             Eye = v3LookFromPos;


Ta metoda wymaga raycasta ale jest mila dla oka :) i daje bardzo plynna kamera kotra sama sobie kolizje wylicza. Kod nie moj ale ten kto mi go dal tez mial go od kogos wiec moge ci go sprezentowac ;)
« Ostatnia zmiana: Wrzesień 25, 2010, 10:51:35 wysłana przez .:NOXY:. »

Offline xardas97260

  • Użytkownik

# Wrzesień 25, 2010, 10:53:07
Aha, dzięki, kod działa, ale go troche "ztuninguje" :D

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Wrzesień 25, 2010, 11:15:36
A warto sobie model za ktorym kamera podaza do innej grupy kolizji zeby nie raycastowac po nim ;)