2017-05-20 4 views
1

Probablement la question de rotation de troisjs pas 9000, je veux simplement avoir 3 boutons d'interface utilisateur pour faire pivoter un objet de 90 degrés dans chaque direction x, y & z avec chaque clic sur chaque, comment cela pourrait-il être difficile?Comment faire pour faire pivoter Object3d autour de l'axe X, Y et Z sans avoir les axes à retourner ou provoquer le verrouillage de cardan?

L'utilisation de méthodes de rotation régulières qui utilisent euler provoquera un blocage du cardan, et en utilisant des quan- térités, les axes se retourneront de manière aléatoire dans lesquels l'axe z sera à un point ou à un autre.

s'il vous plaît jeter un oeil à ma démo de travail: http://grutex.com/webgl/demos/help/

Edit: voici les fonctions de rotation partie:

 function z_rotate(){ 

     var startAngle = 0; 
     var start = {angle: startAngle}; 
     var end = {angle: startAngle + 90}; 
     var lastAngle=0;         
     var tween = new TWEEN.Tween(start) 
      .to(end, 400) 
      .easing(TWEEN.Easing.Quadratic.Out) 
      .onUpdate(function(){ 
       startAngle=this.angle;  
       my_object.rotateOnAxis(new THREE.Vector3(0,0,1),degreeToRadians(startAngle-lastAngle)); 
       lastAngle=startAngle;      
      }) 
      .start(); 


    } 

    function x_rotate(){ 

     var startAngle = 0; 
     var start = {angle: startAngle}; 
     var end = {angle: startAngle + 90}; 
     var lastAngle=0;         
     var tween = new TWEEN.Tween(start) 
      .to(end, 400) 
      .easing(TWEEN.Easing.Quadratic.Out) 
      .onUpdate(function(){ 
       startAngle=this.angle; 
       my_object.rotateOnAxis(new THREE.Vector3(1,0,0),degreeToRadians(startAngle-lastAngle)); 
       lastAngle=startAngle;      
      }) 
      .start(); 
    } 

    function y_rotate(){ 
     var startAngle = 0; 
     var start = {angle: startAngle}; 
     var end = {angle: startAngle + 90}; 
     var lastAngle=0;         
     var tween = new TWEEN.Tween(start) 
      .to(end, 400) 
      .easing(TWEEN.Easing.Quadratic.Out) 
      .onUpdate(function(){ 
       startAngle=this.angle; 
       my_object.rotateOnAxis(new THREE.Vector3(0,1,0),degreeToRadians(startAngle-lastAngle)); 
       lastAngle=startAngle;      
      }) 
      .start(); 

    } 
+1

Bienvenue sur SO. Veuillez ajouter votre code à votre message. Astuce: évitez d'appeler 'new' à chaque image. Créez une instance d'un objet et réutilisez-la. – WestLangley

+0

Étude [cette réponse] (http://stackoverflow.com/questions/20089098/three-js-adding-and-removing-children-of-rotated-objects/20097857#20097857), et entre la rotation d'un parent temporaire objet, à la place. – WestLangley

+0

@WestLangley merci !, si ce n'était pas pour vous j'aurais été frapper ma tête contre le mur pendant des jours, vous êtes la seule personne que je souhaitais pour me répondre après avoir lu une tonne de vos réponses sur SO concernant three.js, je vais poster le code modifié ci-dessous – Blimpy

Répondre

0

Comme @WestLangley a souligné, j'attacher et détacher l'objet 3D à un point de pivot parent (THREE.Object3D), attachant l'objet 3d au point de pivotement avant le début de l'interpolation et détache le point de pivot après l'achèvement de l'interpolation et réinitialise sa rotation à (0,0,0)

@WestLangley answer: Three.js: Adding and Removing Children of Rotated Objects

Nouvelle fonction modifiée de rotation:

var axis_x = new THREE.Vector3(1, 0, 0).normalize(); 

    function x_rotate(){ 
     pivot_attach(); 
     var startAngle = 0; 
     var start = {angle: degreeToRadians(startAngle)}; 
     var end = {angle: degreeToRadians(startAngle + 90)}; 
     var lastAngle=0;         
     var tween = new TWEEN.Tween(start) 
      .to(end, 400) 
      .easing(TWEEN.Easing.Quadratic.Out) 
      .onUpdate(function(){ 
       startAngle=this.angle; 
      pivot.rotateOnAxis(axis_x,startAngle-lastAngle); 
       lastAngle=startAngle;      
      }) 
      .start().onComplete(pivot_detach); 
    } 

function pivot_attach() { 

    pivot.updateMatrixWorld(); 
    THREE.SceneUtils.attach(my_object, scene, pivot); 

} 

function pivot_detach() { 

    pivot.updateMatrixWorld(); 
    my_object.updateMatrixWorld(); // if not done by the renderer 

    THREE.SceneUtils.detach(my_object, pivot, scene); 
    pivot.rotation.set(0, 0, 0); 

} 

et ne pas oublier d'ajouter le pivot à la scène "scene.add (pivot);"

+0

Spécifiez vos angles en radians pour commencer. – WestLangley

+0

ils sont donc la fonction "degreeToRadians()", ou je pourrais utiliser "THREE.Math.degToRad (degrees);" méthode. – Blimpy

+0

Vos angles sont en degrés. 'angle: startAngle + 90' – WestLangley