当前位置: 首页 > 编程笔记 >

Unity向量按照某一点进行旋转

百里业
2023-03-14
本文向大家介绍Unity向量按照某一点进行旋转,包括了Unity向量按照某一点进行旋转的使用技巧和注意事项,需要的朋友参考一下

本文实例为大家分享了Unity向量按照某一点进行旋转的具体代码,供大家参考,具体内容如下

一、unity的旋转

首先要知道一点就是在Unity的旋转中使用过四元数进行旋转的,如果对一个物体的rotation直接赋值你会发现结果不是你最终想要的结果,这个时候我们需要去借助Quaternion来进行旋转。

二、向量按照原点进行旋转

用到的Unity内置方法Quaternion.AngleAxis(float angle,Vector3 axis)
第一个参数就是我们需要旋转的角度 angle大于0时是按照顺时针的方向进行旋转,angle小于0是按照逆时针的方向旋转,这里的旋转时按照坐标原点进行的旋转。
第二个参数是旋转轴,围绕哪一个坐标轴进行旋转。

注意:使用这个方法时获得的也是四元数,我们将其转换成向量Vector3是需要乘以自身的坐标(四元数 * 自身向量,如果反过来 自身向量 * 四元数 在Unity会发生编译错误,这里需要注意一下)

案例:将Vector3(1,0,1)按照原点旋转45°,90°,180°,270°测试分别用黑、黄、蓝、绿颜色表示

代码如下:

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);

 }
}

三、向量按照指定位置进行旋转

/// <summary>
/// 围绕某点旋转指定角度
/// </summary>
/// <param name="position">自身坐标</param>
/// <param name="center">旋转中心</param>
/// <param name="axis">围绕旋转轴</param>
/// <param name="angle">旋转角度</param>
/// <returns></returns>
public Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)
 {
  return Quaternion.AngleAxis(angle, axis) * (position - center) + center;
 }

案例:将Vector3(1,0,1)按照Vector(2,0,2)旋转45°,90°,180°,270°测试分别用红、黄、蓝、绿颜色表示

代码如下:

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>
 /// 围绕某点旋转指定角度
 /// </summary>
 /// <param name="position">自身坐标</param>
 /// <param name="center">旋转中心</param>
 /// <param name="axis">围绕旋转轴</param>
 /// <param name="angle">旋转角度</param>
 /// <returns></returns>
 public Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)
 {
  return Quaternion.AngleAxis(angle, axis) * (position - center) + center;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍Unity实现绕任意轴任意角度旋转向量,包括了Unity实现绕任意轴任意角度旋转向量的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Unity实现绕任意轴任意角度旋转向量的具体代码,供大家参考,具体内容如下 游戏中有一需求,就是一个矩形或者Cube绕着某一点旋转任意角度,现在给出下面算法。 测试用例 效果图   以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大

  • 本文向大家介绍python dict按照value进行排序?相关面试题,主要包含被问及python dict按照value进行排序?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 按照value从大到小排序: sorted(d.items(),key = lambda x:x[1],reverse = True) 按照value从小到大排序: sorted(d.items(),key =

  • 前面两节课讲解到了顶点位置坐标数据、顶点颜色数据,这节课讲解第三种顶点数据:顶点法向量。 如果你有初高中物理的光学基础,应该会有漫反射、镜面反射的概念。比如太阳光照在一个物体表面,物体表面与光线夹角位置不同的区域明暗程度不同,WebGL中为了计算光线与物体表面入射角,你首先要计算物体表面每个位置的法线方向,在Threejs中表示物体的网格模型Mesh的曲面是由一个一个三角形构成,所以为了表示物体表

  • 本文向大家介绍C++实现一维向量旋转算法,包括了C++实现一维向量旋转算法的使用技巧和注意事项,需要的朋友参考一下 在《编程珠玑》一书的第二章提到了n元一维向量旋转算法(又称数组循环移位算法)的五种思路,并且比较了它们在时间和空间性能上的区别和优劣。本文将就这一算法做较为深入的分析。具体如下所示: 一、问题描述 将一个n元一维向量向左旋转i个位置。例如,假设n=8,i=3,向量abcdefgh旋转

  • 本文向大家介绍numpy中实现二维数组按照某列、某行排序的方法,包括了numpy中实现二维数组按照某列、某行排序的方法的使用技巧和注意事项,需要的朋友参考一下 如何根据二维数组中的某一行或者某一列排序?假设data是一个numpy.array类型的二维数组,可以利用numpy中的argsort函数进行实现,代码实例如下: 注意:argsort返回的只是排好序后的行索引,不会改变原数组。 按照某行进

  • 问题内容: 我需要对一个包含每个人年龄的数组列表进行排序,但是我必须打印出一个65岁以上的人的列表。我知道如何用SQL而不是Java来做到这一点。任何帮助,将不胜感激。谢谢! 问题答案: 首先,请确保您已充分说明了问题,然后考虑首先要使用的算法(不是特定于语言的);然后实施算法。 如果问题仅在于列出年龄在65岁以上(不是65岁或65岁以上)的所有人员,则只需要遍历该数组,并针对每一行检查年龄是否符