变换旋转 (Slerp) - Unity
Transform rotation (Slerp) - Unity
我正在尝试使用 space 栏更改主摄像头的位置和旋转。
改变位置我没有问题,但发现在 z 轴上旋转相机的问题。
最初旋转设置为 359.9f,在按下 space 栏后旋转设置为 179.9f 但是当我回到原始旋转 (359.9f) 时旋转方向不同。
这是我的代码:
using UnityEngine;
using System.Collections;
public class Untitled : MonoBehaviour {
//Lerp Position
private Vector3 start;
private Vector3 end;
//Lerp Time
private float lerpTime = 3f;
private float currentLerpTime = 0;
// Camera Up - Down
public bool up = false;
void Update () {
start = Camera.main.transform.position;
end = new Vector3 (Camera.main.transform.position.x, 105, Camera.main.transform.position.z);
//Quaternions
Quaternion RotationA = Quaternion.Euler (0, 0, 179.9f);
Quaternion RotationB = Quaternion.Euler (0,0, 359.9f);
// Inputs
if (Input.GetKey (KeyCode.Space) && Camera.main.transform.position.y < 8f)
{
up = true;
currentLerpTime = 0;
lerpTime = 3f;
}
if (Input.GetKey (KeyCode.Space) && Camera.main.transform.position.y > 103f)
{
up = false;
currentLerpTime = 0;
lerpTime = 3f;
}
// When the camera is down (Lerp/Slerp)
if (up == false)
{
currentLerpTime += Time.deltaTime;
if (currentLerpTime >= lerpTime)
{
currentLerpTime = lerpTime;
}
float Perc = currentLerpTime / lerpTime;
start = Camera.main.transform.position;
Camera.main.transform.position = Vector3.Lerp (start, new Vector3 (Camera.main.transform.position.x, 105, Camera.main.transform.position.z), Perc);
Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, RotationA, Perc);
}
// When the camera is up (Lerp/Slerp)
if (up == true)
{
currentLerpTime += Time.deltaTime;
if (currentLerpTime >= lerpTime)
{
currentLerpTime = lerpTime;
}
float Perc = currentLerpTime / lerpTime;
end = Camera.main.transform.position;
Camera.main.transform.position = Vector3.Lerp (end, new Vector3(Camera.main.transform.position.x, 6, Camera.main.transform.position.z), Perc);
Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, RotationB, Perc);
}
}
}
我也尝试了另一种旋转方法,但没有任何改变:
Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, Quaternion.AngleAxis(179.9f, Vector3.forward), Perc)
Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, Quaternion.AngleAxis(359.9f, Vector3.forward), Perc)
我该如何解决?提前致谢。
您的程序所做的是在两个旋转之间交替,这占球体旋转的一半。为了达到您想要的结果,第二次旋转应该朝向 0 角度。在您当前的程序中,它会旋转回 360 度。
目前的运作方式:
1. 第一次旋转 359.9f -> 179.9f (float decreasing)
2. 第二次旋转 179.9f -> 359.9f (浮动增加)
3.(从 1 开始重复。)
您认为它应该如何工作:
1. 第一次旋转 359.9f -> 179.9f (float decreasing)
2. 第二次旋转 179.9f -> 0.0f(浮动减少,当值达到零时可能重置为 359.9f)
要遵循您的编码风格,只需再添加一个轮换:
//Quaternions
Quaternion RotationA = Quaternion.Euler (0, 0, 179.9f);
Quaternion RotationB = Quaternion.Euler (0,0, 359.9f);
Quaternion RotationC = Quaternion.Euler (0,0, 0.0f);
然后将另一个旋转更改为使用 RotationC
// When the camera is up (Lerp/Slerp)
if (up == true)
{
...
(Camera.main.transform.rotation, RotationC, Perc);
}
最后当旋转达到零时重置回默认值:
void Update () {
if(Camera.main.transform.rotation == RotationC){
Camera.main.transform.rotation = RotationB;
}
}
我正在尝试使用 space 栏更改主摄像头的位置和旋转。 改变位置我没有问题,但发现在 z 轴上旋转相机的问题。 最初旋转设置为 359.9f,在按下 space 栏后旋转设置为 179.9f 但是当我回到原始旋转 (359.9f) 时旋转方向不同。
这是我的代码:
using UnityEngine;
using System.Collections;
public class Untitled : MonoBehaviour {
//Lerp Position
private Vector3 start;
private Vector3 end;
//Lerp Time
private float lerpTime = 3f;
private float currentLerpTime = 0;
// Camera Up - Down
public bool up = false;
void Update () {
start = Camera.main.transform.position;
end = new Vector3 (Camera.main.transform.position.x, 105, Camera.main.transform.position.z);
//Quaternions
Quaternion RotationA = Quaternion.Euler (0, 0, 179.9f);
Quaternion RotationB = Quaternion.Euler (0,0, 359.9f);
// Inputs
if (Input.GetKey (KeyCode.Space) && Camera.main.transform.position.y < 8f)
{
up = true;
currentLerpTime = 0;
lerpTime = 3f;
}
if (Input.GetKey (KeyCode.Space) && Camera.main.transform.position.y > 103f)
{
up = false;
currentLerpTime = 0;
lerpTime = 3f;
}
// When the camera is down (Lerp/Slerp)
if (up == false)
{
currentLerpTime += Time.deltaTime;
if (currentLerpTime >= lerpTime)
{
currentLerpTime = lerpTime;
}
float Perc = currentLerpTime / lerpTime;
start = Camera.main.transform.position;
Camera.main.transform.position = Vector3.Lerp (start, new Vector3 (Camera.main.transform.position.x, 105, Camera.main.transform.position.z), Perc);
Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, RotationA, Perc);
}
// When the camera is up (Lerp/Slerp)
if (up == true)
{
currentLerpTime += Time.deltaTime;
if (currentLerpTime >= lerpTime)
{
currentLerpTime = lerpTime;
}
float Perc = currentLerpTime / lerpTime;
end = Camera.main.transform.position;
Camera.main.transform.position = Vector3.Lerp (end, new Vector3(Camera.main.transform.position.x, 6, Camera.main.transform.position.z), Perc);
Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, RotationB, Perc);
}
}
}
我也尝试了另一种旋转方法,但没有任何改变:
Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, Quaternion.AngleAxis(179.9f, Vector3.forward), Perc)
Camera.main.transform.rotation = Quaternion.Slerp (Camera.main.transform.rotation, Quaternion.AngleAxis(359.9f, Vector3.forward), Perc)
我该如何解决?提前致谢。
您的程序所做的是在两个旋转之间交替,这占球体旋转的一半。为了达到您想要的结果,第二次旋转应该朝向 0 角度。在您当前的程序中,它会旋转回 360 度。
目前的运作方式:
1. 第一次旋转 359.9f -> 179.9f (float decreasing)
2. 第二次旋转 179.9f -> 359.9f (浮动增加)
3.(从 1 开始重复。)
您认为它应该如何工作:
1. 第一次旋转 359.9f -> 179.9f (float decreasing)
2. 第二次旋转 179.9f -> 0.0f(浮动减少,当值达到零时可能重置为 359.9f)
要遵循您的编码风格,只需再添加一个轮换:
//Quaternions
Quaternion RotationA = Quaternion.Euler (0, 0, 179.9f);
Quaternion RotationB = Quaternion.Euler (0,0, 359.9f);
Quaternion RotationC = Quaternion.Euler (0,0, 0.0f);
然后将另一个旋转更改为使用 RotationC
// When the camera is up (Lerp/Slerp)
if (up == true)
{
...
(Camera.main.transform.rotation, RotationC, Perc);
}
最后当旋转达到零时重置回默认值:
void Update () {
if(Camera.main.transform.rotation == RotationC){
Camera.main.transform.rotation = RotationB;
}
}