Unity之繞軸進(jìn)行旋轉(zhuǎn)的操作
先上一張效果圖

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軸旋轉(zhuǎn)angle角度
Quaternion rotation = Quaternion.AngleAxis(angle, axis);
//旋轉(zhuǎn)之前,以center為起點(diǎn),transform.position當(dāng)前物體位置為終點(diǎn)的向量.
Vector3 beforeVector = transform.position - center;
//四元數(shù) * 向量(不能調(diào)換位置, 否則發(fā)生編譯錯(cuò)誤)
Vector3 afterVector = rotation * beforeVector;//旋轉(zhuǎn)后的向量
//向量的終點(diǎn) = 向量的起點(diǎn) + 向量
transform.position = afterVector + center;
//看向Sphere,使Z軸指向Sphere
transform.LookAt(Sphere.transform.position);
}
}
補(bǔ)充:Unity繞x軸旋轉(zhuǎn)并限制角度的陷阱

在制作FPS相機(jī)時(shí),遇到了需要限制角度的需求,視角只能查看到-60到60度的范圍,而在Unity的Transform組件中,繞x軸逆時(shí)針旋轉(zhuǎn),Transform組件的localEulerAngle會(huì)在0~360范圍內(nèi)遞增(如圖)
關(guān)鍵在于其中的角度轉(zhuǎn)換,直接上代碼
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);
}
補(bǔ)充:Unity3D 實(shí)現(xiàn)物體始終面向另一個(gè)物體(繞軸旋轉(zhuǎn)、四元數(shù)旋轉(zhuǎn))
一開(kāi)始本人糾結(jié)于在VR中,怎么利用手柄來(lái)控制物體的旋轉(zhuǎn),物體位置不變。
相當(dāng)于:地球儀。更通俗點(diǎn)來(lái)說(shuō),就是一個(gè)棍子插到地球儀上,然后拿著棍子就可以控制地球儀轉(zhuǎn)。手柄相當(dāng)于那根棍子。
代碼如下:
myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
這句代碼實(shí)現(xiàn)了 myTransform 始終可以根據(jù) target 旋轉(zhuǎn),rotationSpeed控制速度。
當(dāng)然上面這句話僅僅只是始終面向,還沒(méi)有加上一開(kāi)始記錄下target的初始旋轉(zhuǎn)。不然一開(kāi)始就要跟著手柄轉(zhuǎn),而不是自己隨意控制。對(duì)于上句的理解,我理解完便貼上。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- Unity3D運(yùn)行報(bào)DllNotFoundException錯(cuò)誤的解決方案
- unity avprovideo插件的使用詳解
- unity里獲取text中文字寬度并截?cái)嗍÷缘牟僮?/a>
- Unity3D啟動(dòng)外部程序并傳遞參數(shù)的實(shí)現(xiàn)
- unity 如何獲取button文本的內(nèi)容
- unity 如何獲取Text組件里text內(nèi)容的長(zhǎng)度
- unity 如何使用文件流讀取streamingassets下的資源
- unity 文件流讀取圖片與www讀取圖片的區(qū)別介紹
- 解決unity rotate旋轉(zhuǎn)物體 限制物體旋轉(zhuǎn)角度的大坑
- 詳解Unity安卓共享紋理
相關(guān)文章
C#實(shí)現(xiàn)餐飲管理系統(tǒng)完整版
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)餐飲管理系統(tǒng)的完整版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
C# HttpClient Post參數(shù)同時(shí)上傳文件的實(shí)現(xiàn)
這篇文章主要介紹了C# HttpClient Post參數(shù)同時(shí)上傳文件的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
asp.net頁(yè)面中如何獲取Excel表的內(nèi)容
在瀏覽網(wǎng)頁(yè)時(shí),一定會(huì)看到我們需要保存的信息,我們比較常用的方法就是拖動(dòng)鼠標(biāo),選中我們需要的內(nèi)容,然后ctrl+c,然后在保持到excel當(dāng)中去,那么如何用asp.net獲取excel表的內(nèi)容呢,下面小編就給大家介紹asp.net獲取excel表的內(nèi)容,需要的朋友可以參考下2015-08-08
C#打開(kāi)php鏈接傳參然后接收返回值的關(guān)鍵代碼
這篇文章主要介紹了C#打開(kāi)php鏈接傳參然后接收返回值的關(guān)鍵代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
C# 中的 IReadOnlyDictionary 和 IReadOnlyLis
C# 中的IReadOnlyDictionary和IReadOnlyList是接口,用于表示只讀的字典和只讀的列表,這些接口提供了對(duì)集合的只讀訪問(wèn)權(quán)限,即不允許對(duì)集合進(jìn)行修改操作,這篇文章主要介紹了C# 中的 IReadOnlyDictionary 和 IReadOnlyList實(shí)例詳解,需要的朋友可以參考下2024-03-03
C# WinForm捕獲全局變量異常 SamWang解決方法
本文將介紹C# WinForm捕獲全局變量異常 SamWang解決方法,需要的朋友可以參考2012-11-11

