问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Unity中Vector3的三维向量和旋转详解

创作时间:
作者:
@小白创作中心

Unity中Vector3的三维向量和旋转详解

引用
CSDN
1.
https://blog.csdn.net/wangzhae/article/details/136311121

在Unity引擎中,Vector3是三维向量的基础数据类型,广泛应用于坐标、旋转和缩放等场景。本文将详细介绍Vector3的创建、修改、向量计算以及旋转方式(欧拉角和四元数)等核心知识点,并通过代码示例帮助读者快速掌握这些基础操作。

Vector3基础概念

Vector是Unity中的结构体类型,其中:

  • Vector2包含两个变量
  • Vector3包含三个变量
  • Vector4包含四个变量

在Unity中,Vector3主要用于表示三维空间中的向量,其常用的变量为x、y、z,可以代表坐标、旋转、缩放等信息。

创建和修改Vector3

创建结构体

// 向量
Vector3 v = new Vector3(1, 1, 1);
// 坐标
Vector3 v = new Vector3(1, 1, 1);
// 旋转
Vector3 v = new Vector3(45, 90, 1);
// 缩放
Vector3 v = new Vector3(1, 1, 0.5f); 

v = Vector3.zero; // 快速创建零向量
v = Vector3.one;  // 快速创建全1向量

修改结构体

v.x = 0; // 修改v的x分量为0

向量计算

Vector3 v = new Vector3(0, 0, 0); 
Vector3 v2 = Vector3.forward; // 等于Vector3(0, 0, 1)

Debug.Log(Vector3.Angle(v, v2)); // 计算两个向量夹角 90度
Debug.Log(Vector3.Distance(v, v2)); // 计算两个点距离 1.414214
Debug.Log(Vector3.Dot(v, v2)); // 计算点乘 0
Debug.Log(Vector3.Cross(v, v2)); // 计算叉乘 (0.00, -1.00, 0.00) 
Debug.Log(Vector3.Lerp(Vector3.zero, Vector3.one, 0.5f)); // 插值计算 (0.5, 0.5, 0.5)
Debug.Log(Vector3.Lerp(Vector3.zero, Vector3.one, 0.8f)); // 插值计算 结果是(0.8, 0.8, 0.8)
Debug.Log(v.magnitude); // 向量模长 结果是1
Debug.Log(v.normalized); // 单位向量 结果是(1.00, 0.00, 0.00)

旋转方式

旋转是三维空间中物体姿态变化的重要组成部分,常见的旋转方式有欧拉角和四元数两种。

欧拉角

欧拉角通过三个角度(绕x轴、y轴和z轴的旋转角度)来描述物体的旋转。这种方法在三维图形学和游戏开发中非常常见,但可能会造成万向节死锁问题。

Vector3 v = new Vector3(0, 30, 0);  

四元数

四元数是一种复数类型,可以用来表示三维空间中的旋转。四元数由四个实数组成,可以通过将欧拉角转换为四元数来描述物体的旋转。这种方法在三维动画和游戏开发中也有广泛的应用,且不会造成万向节死锁。

  1. 使用给定的x,y、z、w分量构造新的四元数
Quaternion quaternion = new Quaternion(float x, float y, float z, float w);
  1. 使用欧拉角转四元数
Vector3 rotate = new Vector3(0, 30, 0); // 定义欧拉角
Quaternion quaternion = Quaternion.identity; // 定义空的四元数
quaternion = Quaternion.Euler(rotate); // 欧拉角转四元数
rotate = quaternion.eulerAngles; // 四元数转为欧拉角
  1. 通过角色看向的方向获取
quaternion = Quaternion.LookRotation(new Vector3(0, 0, 0)); 

调试输出

在开发过程中,调试输出是非常重要的环节,可以帮助开发者快速定位问题。Unity提供了多种调试输出方式:

Debug.Log(); // 正常输出
Debug.LogWarning(); // 警告
Debug.LogError(); // 错误

此外,还可以使用以下方法绘制调试信息:

  • 绘制一条线
Debug.DrawLine(v1, v2, Color.blue);
  • 绘制射线
Debug.DrawRay(v1, v2, Color.blue);

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号