2017-10-18 12 views
0

En essayant de trouver les composants/tête d'un vecteur en 3D avec Java. J'ai déjà obtenu la configuration des variables x, y, z et les variables de rotation correspondantes. En utilisant ces variables et les mathématiques vectorielles, je veux trouver les composants après qu'ils ont été tournés. Vous pouvez considérer les variables x, y, z comme un vecteur en cours de traduction.Essayer de faire pivoter le vecteur 3D en Java

En utilisant le calcul de ce poste: Rotating a Vector in 3D Space

j'ai écrit un code qui était censé calculer la position en fonction de ce dernier message:

//Rotate Z 
x = ((x * Math.cos(radz)) - (y * Math.sin(radz))); 
y = ((x * Math.sin(radz)) + (y * Math.cos(radz))); 
//Ignore Z ############################################### 

//Rotate Y 
x = ((x * Math.cos(rady)) - (z * Math.sin(rady))); 
//Ignore Y ############################################### 
z = ((x * Math.sin(rady)) + (z * Math.cos(rady))); 

//Rotate X 
//Ignore X ############################################### 
y = ((y * Math.cos(radx)) - (z * Math.sin(radx))); 
z = ((y * Math.sin(radx)) + (z * Math.cos(radx))); 

où x, y et z sont les positions besoin d'être changé et radx, rady et radz sont les degrés de rotation en radians.

En utilisant ce code, si vous définissez les variables comme si:

double radx = Math.toRadians(0f); 
double rady = Math.toRadians(90f); 
double radz = Math.toRadians(0f); 

double x = 1; 
double y = 0; 
double z = 0; 

System.out.println(x + " " + y + " " + z); 

Il produit: 6.123233995736766E-17 0.0 6.123233995736766E-17

qui im ​​assez sûr est pas exact. . .

Qu'est-ce que je fais de mal avec ce code? Y at-il un moyen plus facile de trouver la tête d'un vecteur 3D Java?

J'ai aussi la bibliothèque joml, mais il semble avoir le même problème avec la méthode vec.rotateX.

Répondre

1

Vous mettez à jour vos variables rapidement. Essayez de:

//Rotate Z 
double newX = ((x * Math.cos(radz)) - (y * Math.sin(radz))); 
y = ((x * Math.sin(radz)) + (y * Math.cos(radz))); 
//Ignore Z ############################################### 

x = newX; 

//Rotate Y 
newX = ((x * Math.cos(rady)) + (z * Math.sin(rady))); 
//Ignore Y ############################################### 
z = ((x * -Math.sin(rady)) + (z * Math.cos(rady))); 

x = newX; 

//Rotate X 
//Ignore X ############################################### 
double newY = ((y * Math.cos(radx)) - (z * Math.sin(radx))); 
z = ((y * Math.sin(radx)) + (z * Math.cos(radx))); 

y = newY; 
+0

Fonctionne pour x, y et z individuellement. Fonctionne également pour x + y, x + z mais pas y + z pour une raison quelconque. Im regardant dans maintenant. Si possible, pouvez-vous comprendre celui-là? Éclate également – codedcosmos

+0

Pas clair si les sommes ne fonctionnent pas. Veuillez fournir un exemple d'entrée et de sortie désirée que vous recherchez. – Doleron

+0

Radx est très bien ne vous inquiétez pas à ce sujet et rady + radz sont également bien indifidually. Cependant, en changeant rady + radz ensemble, il se brise pour une raison quelconque. Notez que ces entrées sont en degrés, à convertir dans le code. Quand ayant radX 0, Rady comme 135 et Radz que 135. Le résultat devrait être d'environ: 0,5 -0,70710677 0,5 Lorsque son fait: 0,5 -0,70710677 -0,5 – codedcosmos