Jak zrobić, by kamera podążała za jadącym samochodem (XNA i JigLibX)

0

Mam taki problem: stworzyłem samochód (carobject = new CarObject(... )etc.) i w sekcji Update wstawilem:
camera.Position = new Vector3(carObject.PhysicsBody.Position.X, carObject.PhysicsBody.Position.Y, carObject.PhysicsBody.Position.Z);
Wszystko git, tylko dlaczego samochód się 'zacina'? Jedzie kawałek w przód i w tył odrobinę, tak parę razy na sekundę. Jak to naprawić?No i nie wiem jak zrobić, żeby kamera była tak z góry ustawiona zawsze na przód samochodu (na razie podąża za samochodem, ale muszę ją obracać, bo przy manewrowaniu 'gubi' auto - patrzy się zawsze w jednym kierunku. Z góry dzięks! Szukałem w necie, ale śmieci same ;/

0

Żeby zmienić kierunek patrzenia kamery, należy zmienić parametr camera.Target. Sęk w tym, że kierunek ułożenia samochodu jest macierzą (carObject.PhysicsBody.Orientation), a camera.Target - to Vector3. Jak to przekształcić?

POMOCY!!!

0

Spokojnie, nie zawsze odpowiedź przychodzi od razu.

0

Nie wiem jak jest w sisszarpach, ale w OpenGLu kamera jest definiowana przez trzy punkty, a nie tylko jeden. Niemożliwe jest opisanie widoku kamery za pomocą tylko jednego punktu w przestrzeni trójwymiarowej.

O nawet coś znalazłem po 5 sekundach w Google: http://msdn.microsoft.com/en-us/library/bb197901(v=xnagamestudio.10).aspx
Tworzenie macierzy przekształcającej punkty do przestrzeni kamery:
view = Matrix.CreateLookAt( cameraPosition, cameraLookat, new Vector3( 0.0f, 1.0f, 0.0f ) );

0

Zgadza się, jeden z punktów mam już opisany, i jest to mniej więcej współrzędna samochodu. I tak się dzieje - kamera podąża za samochodem. Problem jest w macierzy kierunku, który opisuje, w którym kierunku porusza się samochód. Nawet jeśli przypiszę do macierzy kamery macierz kierunku samochodu, na niewiele się to zdaje. Kamera lata gdzie popadnie. Jak na razie obmyśliłem coś takiego:

 Matrix cameraRotation = Matrix.CreateRotationX(15) * Matrix.CreateRotationY(carObject.PhysicsBody.Orientation.M13);
		Vector3 targetPos = camera.Position + Vector3.Transform(Vector3.Forward, cameraRotation);
camera.Target =  targetPos;
		

Napisałem to, bo zauważyłem, że przy zmianie kierunku poruszania się samochodu zmienia się M13 - pierwsza kolumna wiersz trzeci macierzy orientacji. Trochę działa - kamera się obraca przy skręcaniu samochodu (tyle że obraca się zupełnie nie tam gdzie trzeba :P i skacze). Problem leży w samych wartościach - M13 przyjmuje (jak zauważyłem) wartości od -1 do 1, a ja potrzebuję jakoś je przeliczyć na punkt perspektywy.

0

Mam nowości: M13 i M33 są z sobą w zależności sinus-cosinus. Oznacza to, że jeśli obliczymy, dla jakiego kąta sinusem jest M13, to będzie to ta sama wartość kąta, dla której M33 jest cosinusem. Nie myślałem długo - naskrobałem:

 
		 double asinek = Math.Asin(carObject.PhysicsBody.Orientation.M13);
		 if(asinek < 0) asinek += (-(asinek)) + 180 + (-(asinek));
		Matrix cameraRotation = Matrix.CreateRotationX(0) * Matrix.CreateRotationY((float)asinek);
		Vector3 targetPos = camera.Position + Vector3.Transform(Vector3.Forward, cameraRotation);
	camera.Target =  targetPos;

Z merytorycznego punktu widzenia - wszystko powinno być o.k. W drugiej linii dbam o to, by obliczać sinus zawsze dodatniej strony paraboli, żeby nie było problemów z parametrami kamery. Potem wpisuje w macierz i powinno grać. Tylko dlaczego kamera ładnie zbliża się do jednego boku, a nagle przeskakuje gdzieś do tyłu???

1 użytkowników online, w tym zalogowanych: 0, gości: 1