(个人)VR实时交互的太极拳学习系统创新实训第二周(2)

     这篇博客,主要介绍一下,在开始关卡关于摄像机动画和Matinee动画的一些制作技巧和心得。

     因为之前也没有用UE4 制作过摄像机动画,因此进入UE4官方文档查找与摄像机动画有关的方法。

     解析来是具体的制作过程。

  1. 首先在关卡中创建一个Matinee组件:

   

  2 .在选中Matinee,在左侧Matinee的细节栏可以看到“打开Matinee”选项:双击打开编辑器:


3.在场景中添加自己想要的摄像机:


4.在相机的Depth of field 属性中为相机设置属性:


5.接来啦要将摄像机添加进Matinee的动画轨迹中,选中Camera,在Matinee面板的左下角的空白处选择Add New Camera Group,之后可以看到一个当前摄像机的轨道,包括,Movement轨道和FOVAngle轨道。


6.拉长动画轨道:按着Ctrl键用鼠标左键拖动红色三角形,可以拉长时间长度,


7.之后在0.0处,选中Movement轨道,按Entry键,可以看到生成了一个小三角。这个小三角就表示已经在此处KEY帧。


8.打开世界视图,在关卡中将摄像机摆放在自己想要的位置:,这样一个位置就确定了。接下来回到Matinee窗口,将时间快移动到2.0处,按下Entry键,在此处再次添加关键帧。


9.在世界界面中,调整2.0出摄像机的位置,可以看到生成了一条黄色轨迹曲线。这条线就是摄像机当前的轨迹。


10.利用脚本对轨迹进行修改:

UCLASS()  
class MYFIRSTCODE_API AAvatar : public ACharacter  
{  
    GENERATED_BODY()  
  
public:  
    AAvatar();  
    virtual void BeginPlay() override;  
      
    // Called every frame  
    virtual void Tick( float DeltaSeconds ) override;  
  
    // Called to bind functionality to input  
 SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;  
    
    void SetupPlayerInputComponent(class UInputComponent* InputComponent) override; 
    void MoveForward(float amount);  
    void MoveBack(float amount);  
    void MoveLeft(float amount);  
    void MoveRight(float amount);  
  
    void Yaw(float amount);  
    void Pitch(float amount);  
      
      
};

11.之后用同样的方法,创建另外两个机位。


12.将二号机位的开始时间拖到一号机位的结束时间上,

13.在世界中,为二号机位制作一个环绕的效果。


13.三号机位雷同。

14.为了控制时间,在右侧的红色三角处,点击右键,选择Move To Longest Track Endpoint,可以使动画序列时间自动匹配上。


15.接下来就需要添加整个动画序列了,在“轨道”窗口的空白处,单击右键,添加“Add New Director Group”,会在上方出现一个DirGroup:



16.在Director轨道上KEY帧添加不同的摄像机动画,每个摄像机动画的长度可以确定,用不同的颜色长度表示不同长度的摄像机动画。



17.之后保存Matinee,此时会显示需要关闭Matinee。

18.打开关卡蓝图,让关卡开始时就播放Matinee动画。首先选中Matinee再打开关卡蓝图,此时才可以在关卡蓝图中添加一个Matinee的引用。注意一定要选择Matinee才可以。(上图是高亮了Matinee,下图是未高亮)



19.使用Set View Target with Blend 方法来进行画面的替换:

const float SmoothBlendTime = 0.25f;  
TimeToNextCameraChange -= DeltaTime;  
if (TimeToNextCameraChange <= 0.0f)  
{  
    TimeToNextCameraChange += TimeBetweenCameraChanges;  
  
    // Find the actor that handles control for the local player.  
    APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);  
    if (OurPlayerController)  
    {  
        if ((OurPlayerController->GetViewTarget() != CameraOne) && (CameraOne != nullptr))  
        {  
            // Cut instantly to camera one.  
            OurPlayerController->SetViewTarget(CameraOne);  
        }  
        else if ((OurPlayerController->GetViewTarget() != CameraTwo) && (CameraTwo != nullptr))  
        {  
            // Blend smoothly to camera two.  
            OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);  
        }  
    }  
} 

20.用Play方法播放Matinee的引用:


21.连接上先前制作的开始界面,借完成了启动关卡的所有操作。因为动画长度为15s,因此使用Delay方法,停止15s再生成UI界面。


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页