当前位置: 首页 > article >正文

unity,欧拉角

介绍

在Unity中,欧拉角(Euler Angles)用于描述物体的旋转状态,它由三个角度组成,通常是俯仰角(Pitch)、偏航角(Yaw)和翻滚角(Roll)。在Transform组件中,可以通过eulerAngles属性获取或设置物体的欧拉角。例如,当物体绕X轴旋转时,它的欧拉角表示为(X,0,0),当物体绕Y轴旋转时,它的欧拉角表示为(0,Y,0),当物体绕Z轴旋转时,它的欧拉角表示为(0,0,Z)。欧拉角在游戏开发中非常常用,可以用于控制物体的旋转状态,实现各种动态效果。但需要注意的是,欧拉角存在万向锁问题,需要注意避免出现异常情况。

万向锁:万向锁(Gimbal Lock)是欧拉角旋转中的一种异常情况,当物体的俯仰角接近90度或-90度时,会导致旋转出现异常。具体来说,当物体的俯仰角接近90度时,物体绕Y轴旋转和绕Z轴旋转的角度将会重叠,导致物体无法自由旋转,而是出现了旋转的“卡顿”现象。


方法

在Unity中,可以通过Transform组件的eulerAngles属性获取或设置物体的欧拉角。例如,可以使用以下代码获取物体的欧拉角:

Vector3 euler = transform.eulerAngles;
也可以使用以下代码设置物体的欧拉角:

transform.eulerAngles = new Vector3(x, y, z);
其中,x、y、z分别代表物体绕X轴、Y轴和Z轴的旋转角度。

除了使用eulerAngles属性,还可以使用Quaternion.Euler()方法将欧拉角转换为四元数。例如,可以使用以下代码将欧拉角转换为四元数:

Quaternion rotation = Quaternion.Euler(x, y, z);
其中,x、y、z分别代表物体绕X轴、Y轴和Z轴的旋转角度。


举例子

鼠标控制旋转视角

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseLook : MonoBehaviour
{
// 鼠标灵敏度
public float mouseSensitivity = 100f;
// 角度限制
public float clampAngle = 80f;

// 鼠标移动距离
private float mouseX;
private float mouseY;

// 角度
private float rotX = 0f;
private float rotY = 0f;

void Start()
{
    // 获取初始角度
    Vector3 rot = transform.localRotation.eulerAngles;
    rotX = rot.x;
    rotY = rot.y;
}

void Update()
{
    // 获取鼠标移动距离
    mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
    mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

    // 旋转视角
    rotX -= mouseY;
    rotY += mouseX;

    // 角度限制
    rotX = Mathf.Clamp(rotX, -clampAngle, clampAngle);

    // 更新旋转
    Quaternion localRotation = Quaternion.Euler(rotX, rotY, 0f);
    transform.rotation = localRotation;
}

}



http://www.kler.cn/news/8141.html

相关文章:

  • HashMap源码分析小结
  • python好玩的短代码
  • 不负期待,载誉收官 | 迅镭激光2023ITES深圳展圆满落幕!
  • 轻轻松松编译 Jmeter 源码,再也不求人
  • Leetcode.130 被围绕的区域
  • 继承(C++)
  • Spring-aop面向切面
  • Tomcat使用https配置实战
  • chatGPT中国入口-ChatGPT评论文章-ChatGPT怎么用
  • 多线程冲突处理方法,锁
  • 首届“兴智杯”产业赛收官,文心大模型助推产业创新
  • 量化注意事项和模型设计思想
  • rsync远程同步实现快速、安全、高效的异地备份
  • Spring 之循环依赖
  • 【计算机网络-网络层】路由选择协议
  • Redission分布式锁
  • vue3脚手架Vite
  • ChatGPT常用prompts汇总
  • springboot感受优化06
  • 使用for循环对ArrayList在遍历时删除存在的问题
  • Linux如何在Ubuntu系统服务器上安装 Jenkins?【详细教程】
  • 初识设计模式 - 策略模式
  • 基于SpringBoot+Vue的家政平台
  • 命名空间和程序集
  • Mysql 的B+树索引 和HASH索引
  • 160. 相交链表 ——【Leetcode每日一题】
  • CSS基础知识,必须掌握!!!
  • Android:启动流程
  • 城乡供水一体化管控平台-农村供水监管平台-乡村振兴
  • C++实现多线程