相机、渲染和场景-相机震动

思考并回答以下问题:
1.相机震动效果是什么?实现的思路是什么?
2.

对于格斗、射击以及动作类游戏,相机震动效果十分重要,展现了碰撞、危险、打斗、动态以及激动人心的效果,并表示为一种动力学反馈的形式。
相机震动的实现方法多种多样,但均会涉及相机位置的变化,即通过某种“随机”功能使该位置在最小值和最大值之间变化。有时,震动效果较为剧烈,而某些时候,震动则通过阻尼功能呈现为平滑状态,进而生成一种缓慢的浮动效果。如下示例代码可绑定至任意相机上,并以此创建震动效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using UnityEngine;
using System.Collections;

public class CameraShake : MonoBehaviour
{
private Transform ThisTransform = null;
// Total time for shaking in seconds
public float ShakeTime = 2.0f;

// Shake amount - distance to offset in any direction
public float ShakeAmount = 3.0f;

// Speed of camera moving to shake points
public float ShakeSpeed = 2.0f;

void Start()
{
// Get transform component
ThisTransform = GetComponent<Transform>();

// Start shaking
StartCoroutine(Shake());
}

// Shake camera
public IEnumerator Shake()
{
// Store original camera position
Vector3 OrigPosition = ThisTransform.localPosition;
// Count elapsed time (in seconds)
float ElapsedTime = 0.0f;
// Repeat for total shake time
while(ElapsedTime < ShakeTime)
{
// Pick random point on unit sphere
Vector3 RandomPoint = OrigPosition + Random.insideUnitSphere * ShakeAmount;

// Update Position
ThisTransform.localPosition = Vector3.Lerp(ThisTransform.localPosition, RandomPoint, Time.deltaTime * ShakeSpeed);

// Break for next frame
yield return null;
// Update time
ElapsedTime += Time.deltaTime;
}
// Restore camera position
ThisTransform.localPosition = OrigPosition;
}
}
0%