Voor een prototype probeer ik mannetjes rond te laten lopen op een bol. Voor dit soort logica is het het makkelijkste voor mij om sferische coordinaten te gebruiken, maar voor het renderen en picking e.d. heb ik juist XYZ (cartesische) coordinaten nodig.
De bol heeft een radius van 1 en een origin van (0,0,0)
Ik heb het volgende stelsel gebruikt:
Het neutrale punt is (1,0,0)
Sy (of pitch) geeft de hoogte op de bol aan en loopt van pi/2 (top) naar 0 (evenaar) naar -pi/2 (bottom)
Sx (of yaw) geeft de rotatie rond de evenaar van de bol aan en loopt van 0 (rechts) naar pi (links) naar 2*pi (weer rechts).
Dit werkt prima, maar nu heb ik weer cartesische coordinaten nodig, daarom bedacht ik het volgende:
-Neem een vector wijzend naar het neutrale punt (1,0,0).
-Roteer deze rond de z-as (pitch)
-En daarna rond de y-as (yaw)
Ik dacht dat ik nu het goede punt in cartesische coordinaten zou hebben. En deze methode klopt ongeveer, maar het z-coordinaat heeft het verkeerde teken (raar, ik kan maar niet beredeneren waarom, maar in het vlak waar yaw in [0,pi] geld wordt deze negatief
) en rond de evenaar (pitch=0) kloppen de punten perfect. Ook vanaf de voorkant (yaw=0) is er geen probleem, maar zodra pitch groter wordt terwijl yaw niet nul is lijkt er van de x en z coordinaten niets meer te kloppen.
Nu heb ik de rotaties van de vector al omgekeer maar dan komt er alleen maar onzin uit, dus ik maak een andere logisch fout, maar wat doe ik verkeerd?!
Hier zijn de twee schuldige functies
(Ik gebruik het XNA framework, waar Matrix en Vector3 en hun functies al in zitten, daar zit hoogstwaarschijnlijk niet de fout)
De bol heeft een radius van 1 en een origin van (0,0,0)
Ik heb het volgende stelsel gebruikt:
Het neutrale punt is (1,0,0)
Sy (of pitch) geeft de hoogte op de bol aan en loopt van pi/2 (top) naar 0 (evenaar) naar -pi/2 (bottom)
Sx (of yaw) geeft de rotatie rond de evenaar van de bol aan en loopt van 0 (rechts) naar pi (links) naar 2*pi (weer rechts).
Dit werkt prima, maar nu heb ik weer cartesische coordinaten nodig, daarom bedacht ik het volgende:
-Neem een vector wijzend naar het neutrale punt (1,0,0).
-Roteer deze rond de z-as (pitch)
-En daarna rond de y-as (yaw)
Ik dacht dat ik nu het goede punt in cartesische coordinaten zou hebben. En deze methode klopt ongeveer, maar het z-coordinaat heeft het verkeerde teken (raar, ik kan maar niet beredeneren waarom, maar in het vlak waar yaw in [0,pi] geld wordt deze negatief

Nu heb ik de rotaties van de vector al omgekeer maar dan komt er alleen maar onzin uit, dus ik maak een andere logisch fout, maar wat doe ik verkeerd?!
Hier zijn de twee schuldige functies
(Ik gebruik het XNA framework, waar Matrix en Vector3 en hun functies al in zitten, daar zit hoogstwaarschijnlijk niet de fout)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| public static Position ToSpherical(Vector3 position) { float sx; float sy; //Sy in [-pi/2,pi/2) pi/2 meaning top, -pi/2 meaning bottom //Sx in [0,2*pi) 0 meaning (1,0,0), pi meaning (-1,0,0) if (position.Z >= 0) { sx = (float)Math.Acos(Vector3.Dot(position, Vector3.Right)); } else { sx = MathHelper.TwoPi - (float)Math.Acos(Vector3.Dot(position, Vector3.Right)); } sy = (float)Math.Asin(Vector3.Dot(position, Vector3.Up)); return new Position(sx, sy); } public static Vector3 ToVector3(Position pos, float sphereRadius) { float yaw = pos.Sx; float pitch = pos.Sy; Vector3 v = new Vector3(1, 0, 0); v = Vector3.Transform(v, Matrix.CreateRotationZ(pitch)); v = Vector3.Transform(v, Matrix.CreateRotationY(yaw)); return Vector3.Normalize(v) * sphereRadius; } |