gpt4 book ai didi

c# - 在 Unity 中缓慢旋转角度

转载 作者:行者123 更新时间:2023-11-30 19:54:19 25 4
gpt4 key购买 nike

我正在使用 SteamVR 并想根据 Controller 升高的高度旋转相机,我已经编写了将 Controller 高度发送到相机脚本上的方法的脚本。

当我执行以下操作时,轮换有效:

transform.Rotate(0, 0, 30);//30 只是为了测试,稍后我们将使用 Controller 高度

但我想慢慢地进行这种轮换,这不能立即发生。

我也尝试过使用 Quaternion.Lerp,但它似乎不起作用。

Quaternion.Lerp(this.transform.rotation, new Quaternion(this.transform.rotation.eulerAngles.x, this.transform.rotation.eulerAngles.y, zPosition, 0), Time.deltaTime * 5) ;

有什么建议吗?

最佳答案

Quaternion.Lerp() 应该可以很好地满足您的需求 - 但是,您对它的使用为该方法提供了一些不正确的参数,这就是它没有按预期工作的原因。 (此外,您可能不应该使用它的构造函数来构造四元数,有一些辅助方法可以正确地从欧拉角转换。)

您需要做的是记录初始开始和结束旋转,并在每次调用时将它们传递给Quaternion.Lerp()。请注意,您不能在每一帧都引用 transform.rotation,因为它会随着对象的旋转而变化。例如,调整您的代码以使其工作:

Quaternion startRotation;
Quaternion endRotation;
float rotationProgress = -1;

// Call this to start the rotation
void StartRotating(float zPosition){

// Here we cache the starting and target rotations
startRotation = transform.rotation;
endRotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, zPosition);

// This starts the rotation, but you can use a boolean flag if it's clearer for you
rotationProgress = 0;
}

void Update() {
if (rotationProgress < 1 && rotationProgress >= 0){
rotationProgress += Time.deltaTime * 5;

// Here we assign the interpolated rotation to transform.rotation
// It will range from startRotation (rotationProgress == 0) to endRotation (rotationProgress >= 1)
transform.rotation = Quaternion.Lerp(startRotation, endRotation, rotationProgress);
}
}

希望对您有所帮助!如果您有任何问题,请告诉我。

关于c# - 在 Unity 中缓慢旋转角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42658013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com