Witam! Piszę klasę związaną z kamerą w XNA. Chciałbym zrobić oddalanie i przybliżanie kamery, która patrzy na jakiś obiekt (punkt), przypuścmy Vector3.Zero. Jak mam zaimplementować poruszanie po tym wektorze czyli dajmy na to pozycja kamery = 10, 10, 10; patrzy na punkt 0, 0, 0 - czyli jest tu określony wektor 3D, jak się po nim poruszać, tzn. tą kamerą czy obiektem? Wykorzystam to pewnie potem np. w kierunku jazdy samochodem. Pomóżcie! :P
Taki szybki pomysł:
Masz dwa punkty, pomiędzy nimi odcinek. Zmodyfikuj twierdzenie Talesa tak by działało w 3D i wtedy łatwo przesuniesz o dany procent odcinka.
Wyjdzie coś na styl:
Start.X+=(End.X-Start.X)*percentage;
Start.Y+=(End.Y-Start.Y)*percentage;
Start.Z+=(End.Z-Start.Z)*percentage;
mnożenie i dzielenie wektorów :)
DELETE
Do tego użyłem dzielenia wektorów :)
Mój jest w połowie dobry bo jeżeli chciałbyś oddalić to zamiast dzielić trzeba pomnożyć
Miałem przerwę i teraz spróbowałem coś zrobić. Wymyśliłem takie coś:
public void ZoomIn(float value)
{
Camera Normalized = this.Clone() as Camera;
Vector3 Vector = Normalized.LookAt - Normalized.Position;
Vector.Normalize();
position += Vector * value;
}
I nic z tego, bo kamera jedzie, ale nie po wektorze "patrzenia". Co zrobiłem źle?
public void ZoomIn(float value)
{
Camera Normalized = this.Clone() as Camera;
Vector3 Vector = Normalized.LookAt - Normalized.Position;
Vector.Normalize();
Normalized.position -= Vector * value;
}
WTF?! Przecież to jest prawie to samo, a poza tym Normalized jest kopią nie?
Swego czasu napisałem taką klasę, która pomagała mi w "zarządzaniu" kamerą w DirectX. Po pewnych przeróbkach zadziała pewnie z XNA. Slide działa do przodu i do tyłu, natomiast na boki i w górę/dół chyba nie dokończyłem...
http://wklej.to/jpeed
Legenda(?):
Forward - ruch w przód
Sideways - na boki (nie wiem dokładnie, w który bok dla +)
Upward - w górę (w górę i chyba nie działa :P )
hTheta i vTheta to to samo co hAngle (dosłownie kąt horyzontalny) i vAngle (kąt wertykalny) tyle, że w radianach. W sumie nie wiem po co tak to śmiesznie zrobiłem, ale już zostało.
moveDist - to coś w rodzaju czułości, jakby jednostka
radius - to promień "abstrakcyjnej" kuli, która służy do obliczenia lookAt
a co masz na myśli ze źle leci że zamiast przybliża oddala czy co ?
Tak na oko to się porusza wektorem Y (góra/dół). A powinien oddalać/przybliżać nie? LookAt mam (0,0,0) a kamera (5,5,5). Wektor po Normalize otrzymuje jakoś (0.534, 0.534, 0.534) a value próbowałem różnie i 0.005 i 0.5 i do samo - góra, dół. :(
Tak myślę, ale nie wiem czy to prawda, ale kamera się przybliża/oddala, ale po wektorze pozycji kamery czyli 5,5,5 ??
Pokarz klase camera
I zamień tam += na -= tak powinno byc.
Mówienie nam że normalize wynosi 0.5 nic nam nie mówi. Chyba ze wyszło by więcej niż 1.
Ale zamiana nic nie daje, bo pod strzałkami mam + i - odpowiednio przybliżanie i oddalanie, więc tylko zmieni to, że będzie się poruszało do góry lub do dołu, a nie po wektorze patrzenia kamery ;/
**Problem rozwiązany.**