当前位置:网站首页>The unity vector rotates at a point

The unity vector rotates at a point

2022-07-07 15:53:00 Le_ Sam

This article is an example for you to share Unity The specific code that the vector rotates according to a certain point , For your reference , The details are as follows

One 、unity The rotation of the

The first thing to know is that Unity Quaternions have been used in the rotation of , If for an object rotation You will find that the result is not what you want in the end , At this time, we need to use Quaternion To rotate .

Two 、 The vector rotates according to the origin

Use of Unity Built-in methods Quaternion.AngleAxis(float angle,Vector3 axis)
The first parameter is the angle we need to rotate angle Greater than 0 It rotates clockwise ,angle Less than 0 It rotates counterclockwise , The rotation here is based on the coordinate origin .
The second parameter is the axis of rotation , About which axis .

Be careful : When using this method, we also get quaternions , We convert it into a vector Vector3 It needs to be multiplied by its own coordinates ( Four yuan number * Self vector , If I go the other way Self vector * Four yuan number stay Unity A compilation error occurs , There's a little bit of caution here )

Case study : take Vector3(1,0,1) Rotate according to the origin 45°,90°,180°,270° Test with black 、 yellow 、 blue 、 Green means

using UnityEngine;
 
[ExecuteInEditMode]
public class VectorDirTest : MonoBehaviour {
 
 // Update is called once per frame
 void Update () {
  Debug.DrawLine(Vector3.left * 5f,Vector3.right * 5f,Color.red);
  Debug.DrawLine(Vector3.up * 5f,Vector3.down * 5f,Color.green);
  Debug.DrawLine(Vector3.forward * 5f,Vector3.back * 5f,Color.blue);
 
   
  Vector3 dir = new Vector3(1,0,1);
  Debug.DrawLine(Vector3.zero,dir,Color.white);
 
  Debug.DrawLine(Vector3.zero,Quaternion.AngleAxis(45,Vector3.up) * dir,Color.black);
 
  Debug.DrawLine(Vector3.zero,Quaternion.AngleAxis(90,Vector3.up) * dir,Color.yellow);
 
  Debug.DrawLine(Vector3.zero,Quaternion.AngleAxis(180,Vector3.up) * dir,Color.blue);
 
  Debug.DrawLine(Vector3.zero,Quaternion.AngleAxis(270,Vector3.up) * dir,Color.green);
 
 }
}

 

3、 ... and 、 The vector rotates according to the specified position  


/// <summary>
///  Rotate a specified angle around a point 
/// </summary>
/// <param name="position"> Self coordinate </param>
/// <param name="center"> Center of rotation </param>
/// <param name="axis"> Around the axis of rotation </param>
/// <param name="angle"> Rotation Angle </param>
/// <returns></returns>
public Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)
 {
  return Quaternion.AngleAxis(angle, axis) * (position - center) + center;
 }

Case study : take Vector3(1,0,1) according to Vector(2,0,2) rotate 45°,90°,180°,270° Test with red 、 yellow 、 blue 、 Green means

using UnityEngine;
 
[ExecuteInEditMode]
public class VectorDirTest : MonoBehaviour {
 
 
 
  
 // Update is called once per frame
 void Update () {
  Debug.DrawLine(Vector3.left * 5f,Vector3.right * 5f,Color.red);
  Debug.DrawLine(Vector3.up * 5f,Vector3.down * 5f,Color.green);
  Debug.DrawLine(Vector3.forward * 5f,Vector3.back * 5f,Color.blue);
 
  Vector3 dir = new Vector3(1,0,1);
  Vector3 point = new Vector3(2,0,2);
 
  Debug.DrawLine(Vector3.zero, RotateRound(dir, point, Vector3.up, 45), Color.red);
  Debug.DrawLine(Vector3.zero, RotateRound(dir, point, Vector3.up, 90), Color.yellow);
  Debug.DrawLine(Vector3.zero, RotateRound(dir, point, Vector3.up, 180), Color.blue);
  Debug.DrawLine(Vector3.zero, RotateRound(dir, point, Vector3.up, 270), Color.green);
  Debug.DrawLine(Vector3.zero, dir, Color.black);
 
   
 }
 
  
 
 /// <summary>
 ///  Rotate a specified angle around a point 
 /// </summary>
 /// <param name="position"> Self coordinate </param>
 /// <param name="center"> Center of rotation </param>
 /// <param name="axis"> Around the axis of rotation </param>
 /// <param name="angle"> Rotation Angle </param>
 /// <returns></returns>
 public Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)
 {
  return Quaternion.AngleAxis(angle, axis) * (position - center) + center;
 }
}

 

原网站

版权声明
本文为[Le_ Sam]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202130609270844.html