- Home /
 
Constraints on rotation axis in c#
How do I create a constraint on a certain rotation axis in c#?.....making an object rotate towards the mouse is easy but I cant seem to create the x and z constrains to keep it from spinning in every direction. ....... if I use transform.rotation.z = 0 I get an error in C#.
rotation is a Quaternion. you can't mess with its individual components like the way you're doing it. you can set the rotation like:
 transform.rotation = Quaternion.Euler(x, y, z); 
 
                  this is just like setting the rotation in the inspector
What you mean deformed? - You only want the y to rotate right? 
Answer by vexe · Oct 05, 2013 at 08:45 AM
See this amazing tutorial from UnityGems, covers everything you need about rotations and Quaternions including your restrictions/constraints that you're asking about (the "Rotating Around the Y Axis Only" section)
I know but in javascript when I make an object rotate towards the mouse with the transform.LookAt everything works fine....I just add a constraint on the x and z axis like transform.rotation.z = 0 and everything works fine......... But in c# I cannot set constraints on an individual axis like in javascript so I use tranform.EulerAngles = new Vector3(0,transform.eulerAngles.y,0)....the constraints actually works but the gameobject gets deformed by this and I want to know if there any other ways to set constraints.Bu if I use transform.rotation = Quaternion.Euler(0,transform.rotation.y,0) the gameObject dosent spin anymore it just budges a little from left to right.
 using UnityEngine;
 using System.Collections;
 
 public class turretRotation : $$anonymous$$onoBehaviour {
     
     RaycastHit hit;
     Vector3 targetPos;
     
     
     
     
     void Start () 
     {
         
         renderer.material.color = Color.red;
     }
     
     
     void Update () 
     {
          
         if(Physics.Raycast(Camera.main.ScreenPointToRay (Input.mousePosition),out hit,100))
         {
             targetPos = new Vector3 (hit.point.x, 0, hit.point.z);        
         }
         transform.rotation =  Quaternion.LookRotation(targetPos - transform.position);
         
         
         if(transform.eulerAngles.x!=0 || transform.eulerAngles.z!=0)
         {
             //transform.eulerAngles = new Vector3(0,transform.eulerAngles.y,0 );///the constraints work fine but the gameObject gets deformed
             transform.rotation =  Quaternion.Euler(transform.rotation.x, transform.rotation.y , transform.rotation.z );//the constraints work as well bu the gameObject barely budges from left to right
         }
         
     }
 }
 
                  I need to know what Im doing wrong.....in javascript is easier but I want to see it in c#
Please do it like in the link I gave you above. rotation is a quternion you shouldn't access/mess with its components directly like you did (it has four components, xyzw):
  transform.rotation =  Quaternion.Euler(transform.rotation.x, transform.rotation.y , transform.rotation.z );
 
                  Just make a new rotation variable:
 var newRotation = Quaternion.LookRotation(targetPos - transform.position).eulerAngles;
 
                  set your constraints:
 newRotation.z = newRotation.x = 0;
 
                  and apply your new rotation:
 transform.rotation = Quaternion.Euler(newRotation);
 
                  That should work just fine.
Not sure if it would work, but could you try localEulerAngles ins$$anonymous$$d? - the thing is, eulerAngles gets locked at 360 dgs, you can't rotate more than that. Also put a print between setting the rotation and the eulers, print (trans.euler.y); see what's happening. 
The linked article is great. Not sure how long it'll work, but mirror at: http://web.archive.org/web/20140702084123/http://unitygems.com/quaternions-rotations-part-1-c/
Your answer
 
             Follow this Question
Related Questions
Flip over an object (smooth transition) 3 Answers
Camera global rotation clamping issue 0 Answers
rotate axis of movement 0 Answers