Unity之绕轴进行旋转的操作

先上一张效果图

using UnityEngine;
using System.Collections;
public class TestRotateRound : MonoBehaviour
{
    public GameObject Sphere;
    private float curtTime = 0.0f;
    void Update()
    {
        //使用C#封装好的代码RotateAround
        gameObject.transform.RotateAround(Sphere.transform.position, Sphere.transform.up, 72 * Time.deltaTime);
        //自己封装代码,功能和上面的相同
        //RotateAround(Sphere.transform.position,Vector3.up, 72 * Time.deltaTime);
    }
    private void RotateAround(Vector3 center, Vector3 axis, float angle)
    {
        //绕axis轴旋转angle角度
        Quaternion rotation = Quaternion.AngleAxis(angle, axis);
        //旋转之前,以center为起点,transform.position当前物体位置为终点的向量.
        Vector3 beforeVector = transform.position - center;
        //四元数 * 向量(不能调换位置, 否则发生编译错误)
        Vector3 afterVector = rotation * beforeVector;//旋转后的向量
        //向量的终点 = 向量的起点 + 向量
        transform.position = afterVector + center;
        //看向Sphere,使Z轴指向Sphere
        transform.LookAt(Sphere.transform.position);
    }
}

补充:Unity绕x轴旋转并限制角度的陷阱

在制作FPS相机时,遇到了需要限制角度的需求,视角只能查看到-60到60度的范围,而在Unity的Transform组件中,绕x轴逆时针旋转,Transform组件的localEulerAngle会在0~360范围内递增(如图)

关键在于其中的角度转换,直接上代码

        public static void RotateClampX(this Transform t, float degree, float min, float max)
        {
            degree = (t.localEulerAngles.x - degree);
            if (degree > 180f)
            {
                degree -= 360f;
            }
            degree = Mathf.Clamp(degree, min, max);
            t.localEulerAngles = t.localEulerAngles.SetX(degree);
        }

补充:Unity3D 实现物体始终面向另一个物体(绕轴旋转、四元数旋转)

一开始本人纠结于在VR中,怎么利用手柄来控制物体的旋转,物体位置不变。

相当于:地球仪。更通俗点来说,就是一个棍子插到地球仪上,然后拿着棍子就可以控制地球仪转。手柄相当于那根棍子。

代码如下:

myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);

这句代码实现了 myTransform 始终可以根据 target 旋转,rotationSpeed控制速度。

当然上面这句话仅仅只是始终面向,还没有加上一开始记录下target的初始旋转。不然一开始就要跟着手柄转,而不是自己随意控制。对于上句的理解,我理解完便贴上。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • unity里获取text中文字宽度并截断省略的操作

    前言 在unity的ugui中Text控件,有时我们会有各种各样的需求,比如类似html中css的text-overflow属性,希望一段文字如果不够长就全显示,如果特别长就截断并且后面加上例如-这种后缀. 好吧这样的需求在ugui里貌似没有现成的方法,如果有的话麻烦指点一下~ 实现 大概的思路就是 - 首先要能判断什么时候overflow - 并且支持加上后缀 那么text控件本来是支持overflow然后直接截断的,但是比较暴力,直接砍断,不能加后缀,并不满足我们的需求. 然后如果简单的通过

  • Unity3D启动外部程序并传递参数的实现

    之前开发项目,一直都使用的是外壳程序加子程序的模式,通过外壳程序去启动子程序,外壳程序和子程序之间的通信,是使用配置文件完成的. 我总觉得这样通信很麻烦,因为外壳程序需要对配置文件进行更改和写入,然后子程序又要读取信息.而且整合的时候,会导致有很多配置文件,而且需要对路径做很多处理和限制. 我发现Process.Start()函数中,是可以传递参数的. 也就是说,我们是可以在使用Process.Start()函数启动外部程序时,传递参数的进行通信的. 具体操作如下: public void St

  • unity 如何使用文件流读取streamingassets下的资源

    目的:读取streamingassets下的文件中指定的一段字节 已知:文件中的起始位置,和需要读取的长度 1.android下读取 1.1 不能直接使用C#的FileStream,读取失败 var buffer = new byte[size]; FileStream stream = File.OpenRead(path); stream.Read(buffer , pos, size); 报错: IsolatedStorageException: Could not find a part

  • unity avprovideo插件的使用详解

    1.新建一个MediaPlayer组件 2.在canvas下新建一个AVProVideo组件 并将上一步新建的MediaPlayer组件赋值到avprovideo组件上的mediaplayer上 3.将需要播放的视频放在StreamingAssets文件夹下 接下来就是用代码调用了 1._mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, 视频路径, 是否自动播放);//加

  • unity 如何获取button文本的内容

    如下就可以获取button中的文本内容 using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class ButtonContent : MonoBehaviour{ public Button btn; void Start(){ btn = GameObject.Find("填写button名").getComponent<Button&g

  • Unity解析gif动态图操作

    工作需求,要播放一张gif图片,又不想转成视频播放,就开始研究怎样解析gif,在网上也看了不少教程,最后根据自己需求写了个脚本. 首先,Unity是不支持gif的(至少我没找到方法),而又要在NGUI中显示gif图片.所以就想到了将gif解析成序列帧再去循环播放. 有人说可以找软件解析,然后导入Unity做动画,最终我没有采用,自己再Unity中以代码解析,然后播放的. 代码如下 (在Awake中解析的,因为要在其他脚本调用,实时解析的话,到时候会花费一会时间): using System.Co

  • Unity 如何获取鼠标停留位置下的物体

    根据UGUI的射线检测机制获取当前鼠标下的UI: /// <summary> /// 获取鼠标停留处UI /// </summary> /// <param name="canvas"></param> /// <returns></returns> public GameObject GetOverUI(GameObject canvas) { PointerEventData pointerEventData

  • unity 文件流读取图片与www读取图片的区别介绍

    IO流代码: void LoadByIO() { float time = Time.time; FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); fs.Seek(0, SeekOrigin.Begin); byte[] bytes = new byte[fs.Length]; fs.Read(bytes, 0, (int)fs.Length); fs.Close(); fs.Dispose(); fs =

  • unity 如何获取Text组件里text内容的长度

    我就废话不多说了,大家还是直接看代码吧~ /// <summary> /// 计算字符串在指定text控件中的长度 /// </summary> /// <param name="message"></param> /// <returns></returns> int CalculateLengthOfText(string message,Text tex) { int totalLength = 0; Fon

  • Unity之绕轴进行旋转的操作

    先上一张效果图 using UnityEngine; using System.Collections; public class TestRotateRound : MonoBehaviour { public GameObject Sphere; private float curtTime = 0.0f; void Update() { //使用C#封装好的代码RotateAround gameObject.transform.RotateAround(Sphere.transform.p

  • Unity实现绕任意轴任意角度旋转向量

    本文实例为大家分享了Unity实现绕任意轴任意角度旋转向量的具体代码,供大家参考,具体内容如下 游戏中有一需求,就是一个矩形或者Cube绕着某一点旋转任意角度,现在给出下面算法. public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle) { Vector3 point = Quaternion.AngleAxis(angle, axis) * (position -

  • Unity实现物体沿自身的任意轴向旋转

    本文实例为大家分享了Unity实现物体沿任意轴向旋转,供大家参考,具体内容如下 一.创建一个需要旋转的物体 二.编写控制该物体的脚本 using UnityEngine; using System.Collections; public class Test_ElectricFan : MonoBehaviour { public bool isOpen=false; //是否开始旋转 public int speed=2; //旋转的速度 // Use this for initializat

  • Pandas 重塑(stack)和轴向旋转(pivot)的实现

    import numpy as np import pandas as pd from pandas import Series,DataFrame 一.重塑 stack:将数据的列索引旋转为行索引 unstack:将数据的行索引旋转为列索引 df = DataFrame({'水果':['苹果','梨','草莓'], '数量':[3,4,5], '价格':[4,5,6]}) print(df) 价格  数量  水果 0   4   3  苹果 1   5   4   梨 2   6   5  草

  • Unity UI实现拖拽旋转

    本文实例为大家分享了Unity UI实现拖拽旋转的具体代码,供大家参考,具体内容如下 跟随鼠标旋转 第一种效果是跟随鼠标旋转,原理是计算下鼠标位置与拖拽物体的相对位移 旋转方向即可 注意转换对应空间坐标 新建脚本mono类继承 IBeginDragHandler, IDragHandler, IEndDragHandler 接口 [SerializeField] private Canvas m_Canvas; private Vector3? CalculateWorldToScreenPos

  • C语言编程C++旋转字符操作串示例详解

    目录 旋转字符串 字符串左旋 题前认知: 暴力移位: 三步翻转: 判断字符串旋转 题前认知 字符串追加判断 旋转字符串 字符串左旋 实现一个函数,可以左旋字符串中的k个字符. 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 题前认知: 一个字符串如果就定死了.eg:char arr[]="dfdf"什么的那多没意思,一点都没有人机交互的感觉,(虽然现在人机交互适合个体,不适合集群,但也是比死板的定死字符串舒服) 所以字符串得是我们可输入的,才有可玩性,玩的不

  • unity 实现摄像机绕某点旋转一周

    在Update函数中执行: if (turnAround) { playerCamera.RotateAround(transform.localPosition, transform.up, Time.deltaTime * rotateSpeed); degree += Time.deltaTime * rotateSpeed; if (degree >= 360) { turnAround = false; degree = 0; } } 补充:unity 摄像机围绕某个物体进行旋转放大缩

  • Unity中EventTrigger的几种使用操作

    说起EventTrigger事件触发器,它的使用可以说是无处不在,EventTrigger继承了很多的事件接口,这些接口对我们开发是十分有用的. 弄懂EventTrigger在以后开发游戏过程中可以说是事半功倍. namespace UnityEngine.EventSystems { [AddComponentMenu ("Event/Event Trigger")] public class EventTrigger : MonoBehaviour, IEventSystemHan

  • unity 鼠标移入弹出UI的操作

    外部调用 show 和Hide方法 using DG.Tweening; using UnityEngine; using UnityEngine.UI; public class ShowInfo : MonoBehaviour { private bool _isshowing = false; public Canvas Canvas; // Use this for initialization void Start() { Hide(); } // Update is called o

  • Android实现绕球心旋转的引导页效果

    现在很多APP都会出现Android实现绕球心旋转的引导页效果,一个类似小车一直在往前开的旋转式动画效果. 先看一下预览效果: 嗯,整体效果还算理想,基本实现了页面绕屏幕底部中心旋转. 这里我们用到了Android系统的一个组件ViewFlipper,该控件的主要作用是为其中的View切换提供动画效果,主要的方法如下: setInAnimation:设置View进入屏幕时的动画. setOutAnimation:设置View退出屏幕时的动画. showNext:调用该方法可以显示下一个View.

随机推荐