摄像机组件(CameraComponent)
摄像机组件可以让您添加一个摄像机视角作为Actor的子对象。目前支持两种类型的投影方式的相机,分别是透视投影和正交投影。您可通过编辑器或代码更改相机的一些属性,比如相机选择透视投影时,可修改相机视场角、相机纵横比、近/远裁剪面;相机选择正交投影时,可修改相机视景体横截面大小、近/远裁剪面等参数。如果您想在场景播放时切换多个摄像机,可在过场动画中编辑这个功能。
1. 属性
- 投影模式: 投影模式用来切换摄像机的【透视 | 正交】模式。
在透视模式下,摄像机遵循近大远小的原则,仿照的是现实世界中的摄像机效果。
在正交模式下,摄像机无论远近,所见的内容都一样大。
一般情况下,摄像机都会使用透视模式。
透视模式下的相机和正交模式下的相机的参数设置不太相同。它们的区别如下:
透视模式:
相机视角:相机视角用于决定摄像机所拍摄内容的范围大小。可以想象现实世界中的普通相机和广角相机的区别,广角相机所拍摄的内容更多,所看到的物体感觉距离我们更远。而相机视角参数则是调整该摄像机的广角属性:
相机宽高比:该属性用于明确当前相机所视的内容宽度和高度的比值。这个属性的值不是摄像机决定的,而是当前的视口(Viewport)宽高所决定的。这里仅仅显示该值,而无法修改。
正交模式:
正交宽度:该属性决定摄像机所拍摄内容的范围大小。与透视模式不同,透视模式所示大小由相机张角决定,正交模式由一个宽度值决定:
近/远裁剪:该属性决定摄像机所能拍摄到的内容的远近的范围,单位是米。小于近裁剪的内容摄像机拍摄不到,大于远裁剪的内容摄像机也拍摄不到:
对于近/远裁剪的范围来说,由于移动端精度问题,在业务上够用的情况下,该范围越小越好。近/远裁剪的范围过大时,由于深度值精度不够精确,两个重叠的网格在移动端渲染时可能会出现闪烁问题。
2. 在代码中获取
获取到相机Actor, 并取到XECameraComponent, 获取到Actor, 我们可以设置相机的位置, 获取到CameraComponent我们可以设置相机的相关属性等.
local cameraActor = world:CreateActor(XECameraActor.ACTOR_TYPENAME)
local comp = cameraActor:GetRootComponent()
相机有两种投影模式, 有时我们需要获取到相机的透视模式, 代码如下:
--获取投影模式
--是否是透视模式
local bPerspective = comp:IsPerspectiveCamera()
--是否时正交模式
local bOrtho = comp:IsOrthoCamera()
在不同的场景下(可能有些场景大, 有些场景小), 我们可以动态设置近裁面与原裁面来达到效果和性能的平衡, (近裁面越小并且远裁面越大越消耗性能, 并且原裁面太大会因为深度值精度不够精确导致闪烁的问题)
--获取近裁剪
local fZNear = comp:GetZNear()
--设置近裁剪
comp:SetZNear(fZNear)
--获取远裁剪
local fZFar = comp:GetZFar()
--设置远裁剪
comp:SetZFar(fZFar)
--切换投影模式
--透视模式
comp:SwitchProjectModel(XECameraComponent.XEPM_PERSPECTIVE)
--正交模式
comp:SwitchProjectModel(XECameraComponent.XEPM_ORTHO)
--透视模式下:
--获取相机视角
local fFov = comp:GetFov()
--设置相机视角
comp:SetFov(fFov)
--正交模式下:
--获取相机宽度
local fWidth = comp:GetOrthoWidth()
--设置相机宽度
comp:SetOrthoWidth(fWidth)
--是否是当前相机,当前相机指的是当前游戏窗口中显示的内容是由这台相机所拍摄的
bool bActive = comp:IsActiveCamera()
--设置成当前相机
comp:SetActiveCamera()
如果一个场景中有多个相机, 我们会设置某个相机为当前使用的相机
---判断是否是激活的相机
pCameraComponent:IsActiveCamera()
---设置是否激活相机
pCameraComponent:SetActiveCamera(bActive)
---设置为当前显示的相机
pCameraComponent:ApplyAsSystemCamera()