Skip to content

相机

NIBIRU引擎的场景是通过在虚拟的三维空间中放置各种对象来创建的。由于开发者的屏幕是二维屏幕,因此需要通过相机来捕捉场景并将其平面化至视图以进行显示。

相机是在场景空间中定义视图的对象。相机的位置定义了观察点,而通过相机的变换组件对其进行旋转、位移的变换可以将相机捕捉画面的方向进行调整。

相机组件还定义了视图中区域的大小、远截面、近截面、视场角等参数,通过设置这些参数相机能够调整其在当前屏幕上观察到的内容。

为了模拟现实世界中人眼观察事物时的透视效果,NIBIRU引擎提供的相机也是支持透视的。

属性面板介绍

alt text

  • 视场角:视场角控制相机的渲染角度范围。
  • 缓冲清除类型:缓冲清除类型可以控制相机背景的缓冲清除类型,目前支持颜色、天空盒。通过设置该属性可以在多个相机参与渲染时设置开发者想保留的缓冲类型。
  • 深度:深度控制了在多个相机参与渲染时的渲染时序。
  • 投影模式:用于设置相机的投影模式采用透视或者正交矩阵。
  • 视口矩形:视口矩形控制了相机渲染的画面占据视窗的百分比。
  • 背景颜色:背景颜色定义了相机在不渲染天空盒时的背景色。
  • 近截面:近截面控制相机近端的裁剪面。
  • 远截面:远截面控制相机远端的裁剪面。
  • 剔除遮罩:剔除遮罩控制相机渲染时的对象所在层级。
  • EV100:用于实现更真实的光照和曝光效果,特别是在使用物理光照单位和后期处理系统时。通过合理设置EV100值,可以显著提升场景的视觉质量和真实感。
  • 渲染模式:用于设置相机是每帧进行渲染还是手动控制渲染。
  • HDR模式:是否启用HDR选项来开启高动态范围渲染。可选择根据项目设置或者不启用。
  • 渲染管线:选择项目使用的项目管线。
  • 渲染纹理:渲染纹理可以将相机渲染画面渲染至指定的渲染纹理中。
  • 目标窗口:可以设置相机附加到哪个窗口进行画面渲染。
  • 后处理列表:用于设置相机使用的后处理效果,详情参考图像后处理章节

NCamera

  • 静态接口
函数描述
GetCurrent当前渲染相机
MainCamera主相机
OverLayCanvasCameraOverlay渲染相机
  • 接口
函数说明
Pitch、Yaw、Roll、Rotate相机旋转接口
SetPosition、SetDirection、LookAt、
GetPosition、GetRight、GetUp、GetDirection
相机位置、方向、视点设置、获取接口
SetNearDistance、GetNearDistance相机近截面设置、获取接口
SetFarDistance、GetFarDistance相机远截面设置、获取接口
SetViewport、GetViewport相机视口设置、获取接口
SetCustomViewMatrix、ResetCustomViewMatrix、SetCustomProjectionMatrix、ResetCustomProjectionMatrix相机设置、重置自定义视图、投影矩阵
SetClearFlags、GetClearFlags设置、获取清除模式
SetBackgroundColor、GetBackgroundColor设置、获取清除背景颜色
GetScreenToWorldRay、WorldToScreenPoint、
ScreenToWorldPoint、ScreenToViewportPoint、
ViewportToScreenPoint
坐标转换函数
SetTargetTexture、GetTargetTexture设置、获取相机目标渲染纹理
SetRenderScene设置是否渲染场景
SetAspectRatio、GetAspectRatio、
SetFovY、GetFovY、GetFovX
设置、获取透视投影参数
SetOrthographicSize、GetOrthographicSize设置、获取正交投影参数
SetDepth设置相机叠加深度
SetRenderMask设置剔除遮罩
SetRenderMode、GetRenderMode设置是否按需渲染
SetMSAALevel、GetMSAALevel设置、获取MSAA配置
AppendPostFXPass、RemovePostFXPass、
ClearPostFXPass、GetPostFxPasses
后处理相关操作
SetTargetWindow、GetTargetWindow、HasAttachToWindow相机渲染窗口属性
SetStereoViewMatrix、SetStereoProjectionMatrix、
GetStereoViewMatrix、GetStereoProjectionMatrix、SetStereoLocalPosition、SetStereoLocalRotation、
GetStereoLocalPosition、GetStereoLocalRotation
立体相机相关属性设置、获取
GetCustomRenderer获取自定义渲染管线

相机基本属性设置

  • 接口
cpp
void Pitch(float angle);
void Yaw(float angle);
void Roll(float angle);
void Rotate(const Quaternion& quat);
void SetPosition(const Vector3& pos);
void SetDirection(const Vector3& dir);
void LookAt(const Vector3& targetPoint);
void SetNearDistance(float fVal);
float GetNearDistance() const;
void SetFarDistance(float fVal);
float GetFarDistance() const;
Vector3 GetPosition();
Quaternion& GetOrientation();
Vector3 GetRight() const;
Vector3 GetUp() const;
Vector3 GetDirection() const;
ViewportSize GetViewport();
void SetViewport(ViewportSize viewport);
Matrix4 GetViewMatrix();
Matrix4 GetProjectionMatrix();
EClearFlags GetClearFlags();
void SetClearFlags(EClearFlags clearFlags);
void SetFovY(const float fovY);
float GetFovY() const;
float GetFovX() const;
float GetAspectRatio() const;
void SetAspectRatio(const float value);
XRCameraTag GetXRCameraTag();
CameraTag GetCameraTag();
void SetDepth(float depth);
void SetBackgroundColor(const Color32& color);
const Color32& GetBackgroundColor() const;
  • 参数
参数说明
angle旋转角度
quat旋转四元数
pos位置
dir方向
targetPoint目标点
fVal远/近截面
viewport视口大小
clearFlags清除模式
fovYY轴视野区域角度
value视锥宽高比
depth相机叠加深度
color背景清除颜色
  • 描述

您可以通过NCamera的相关接口设置相机的基础参数,如方向、位置、视锥体、清除模式等。

cpp
void ExampleClass::Start()
{
	NCameraPtr camera = NCamera::MainCamera();
	camera->SetNearDistance(0.1f);
	camera->SetFarDistance(1000.0f);
	camera->SetFovY(90.0f);
	camera->SetAspectRatio(1.0f);
	camera->SetClearFlags(EClearFlags::CF_Color);
	camera->SetBackgroundColor(Color32::White);
}

void ExampleClass::Update()
{
	NCameraPtr camera = NCamera::MainCamera();
	camera->SetPosition(Vector3f(0, Mathf::Cos(NTime::GetTime()), 0));
}

根据层进行对象剔除

  • 接口
cpp
void SetRenderMask(ECameraRenderMask mask);
void SetRenderMask(uint32 mask);
  • 参数
参数说明
mask剔除遮罩
  • 描述

您可以通过给物体设置层,给相机设置要渲染的层,以此来进行渲染遮罩筛选。给物体设置层可以通过NActor的SetLayer接口实现。

cpp
void ExampleClass::Start()
{
	NCameraPtr camera = NCamera::MainCamera();
	NActorPtr actor = GetNActor();
	actor->SetLayer(ECameraRenderMask::kDefaultLayer);
	camera->SetRenderMask(ECameraRenderMask::kDefaultLayer);
}

设置相机渲染目标窗口

  • 接口
cpp
bool SetTargetWindow(const ETargetWindow& targetWindow);
ETargetWindow GetTargetWindow() const;
bool HasAttachToWindow() const;
  • 参数
参数说明
targetWindow显示的目标窗口
  • 描述

您可以通过NCamera的SetTargetWindow接口设置相机的显示窗口,当存在目标窗口时,该相机才会渲染。

cpp
void ExampleClass::Start()
{
	GetNActor()->GetComponent<NCamera>()->SetTargetWindow(ETargetWindow:: EWindow1);
}

自定义相机矩阵

  • 接口
cpp
void ResetCustomViewMatrix();
void SetCustomViewMatrix(const Matrix4& mat);
void SetCustomProjectionMatrix(const Matrix4& mat);
void ResetCustomProjectionMatrix();
void SetStereoViewMatrix(XRCameraTag eye, const Matrix4 & mat);
void SetStereoProjectionMatrix(XRCameraTag eye, const Matrix4 & mat);
const Matrix4& GetStereoViewMatrix(XRCameraTag eye);
const Matrix4& GetStereoProjectionMatrix(XRCameraTag eye);
void SetStereoLocalPosition(XRCameraTag eye, const Vector3 & pos);
void SetStereoLocalRotation(XRCameraTag eye, const Quaternion & quat);
const Vector3& GetStereoLocalPosition(XRCameraTag eye);
const Quaternion& GetStereoLocalRotation(XRCameraTag eye);
  • 参数
参数说明
mat视图/投影矩阵
eye立体相机的左右眼
pos位置
quat旋转四元数
  • 描述

您可以通过自定义的视图、投影矩阵,控制相机的渲染。 通常在对接XR设备时,视图和投影矩阵由XR设备的SDK给出,您可以将获取到的矩阵传递给相机,相机会应用该矩阵,并且不再自动计算视图/投影矩阵。

cpp
void ExampleClass::Update()
{
	NCameraPtr camera = NCamera::MainCamera();
	Matrix4f viewMat = Matrix4f::Identity;
	Matrix4f projMat = Matrix4f::Identity;
	// 获取自定义的矩阵
	camera->SetCustomViewMatrix(viewMat);
	camera->SetCustomProjectionMatrix(projMat);
}