视口(Viewport)
视口是用来表示窗口中绘制出的一个3D显示区域. (这个区域不一定是屏幕大小), 用一个不是很恰当但是很易懂的方式描述就是: 视口是用来显示相机在虚拟世界中拍摄到的图像的.
1. XEViewport
引擎中XEViewport用于记录当前视口绑定的相机, 绑定的世界以及指定视口上渲染内容的枚举类型.
如何获取XEViewport:
local pViewport = xe.Director:GetInstance():GetViewport()
获取到XEViewport之后我们可以获取到Viewport的宽高.
local fWidth = pViewport:GetViewportWidth()
local fHeight = pViewport:GetViewportHeight()
在调试的时候我们可以查看相机的位置, 当前帧率, DrawCall数量等.
---获取当前窗口渲染选项
local nRenderOption = pViewport:GetAddRenderOption()
---获取到nRenderOption之后和对应的选项做与运算, 最终会得到开启哪些选项.
---显示坐标轴.
pViewport:SetAddRenderOption(XEViewport.XVPA_RendCoord)
---如果我们即想显示坐标轴 又想显示帧数 只需要将两个选项相加然后设置即可
pViewport:SetAddRenderOption(XEViewport.XVPA_RendCoord + XEViewport.XVPA_RendFps)
下边介绍一下选项的种类以及含义.
- XEViewport.XVPA_RendCoord: 绘制坐标轴
- XEViewport.XVPA_RendFps: 显示帧率
- XEViewport.XVPA_CameraPos: 显示相机位置
- XEViewport.XVPA_PreviewMode: 预览模式
- XEViewport.XVPA_StateGroup: 引擎状态
- 更新时间: 音频, 蒙太奇, 客户端等每帧更新的时长等.
- 粒子系统: 粒子的DrawCall数量, 每帧更新时长, 渲染数据准备时长等.
- UI系统: UI的DrawCall数量, UI动画更新时长, UI场景更新时长, UI渲染数据准备时长等.
- 物理系统: 3D刚体数量, 3D骨骼模型数量, 2D刚体数量等.
- 贴图: 贴图大小, 贴图数量等.
- 模型: 静态模型DrawCall数量, 皮肤模型DrawCall数量, 骨骼更新时长等.
- 渲染: 总DrawCall数量, 面数等.
- XEViewport.XVPA_DefaultRenOpt: 默认选项 会显示帧数以及当前帧用时.
上述的渲染选项默认会显示在右下角的位置, 但是如果内容过多会显示不下, 所以我们可以设置渲染选项显示的位置.
pViewport:SetFpsRenderPos(XEViewport.XVP_LEFTTOP)
目前我们支持显示在视口的四个角落:
- XEViewport.XVP_LEFTTOP: 左上
- XEViewport.XVP_LEFTBOTTOM: 左下
- XEViewport.XVP_RIGHTTOP: 右上
- XEViewport.XVP_RIGHTBOTTOM: 右下
我们也支持设置渲染选项的颜色, 这边可以到API文档中查找对应的接口.
2. XViewport
XViewport提供了视口与虚拟世界坐标转换以及设置相机等功能, 实际上XEViewport是在XViewport基础上进行了封装. 我们在游戏中可能用XViewport更多一些.
XViewport的获取
local pXViewport = xe.Director:GetInstance():GetViewport():GetXViewport()
获取到XViewport之后 我们可以通过世界中坐标获取在屏幕上的投影
local vScreenPos = pXViewport:TransformWorldToScreen(vWorldPos)
我们也可以通过屏幕的坐标获取到在世界中位置
local vWorldPos = pXViewport:InvTransformScreenToWorld(vScreenPos)
可以设置显示在Viewport上的相机
pXViewport:SetCamera(pCamera)
我们也可以设置视口的显示参数(一般情况下不建议设置)
local pParam = pXViewport:GetViewportParam()
pParam.nHeight = 0
pParam.nWidth = 0
pParam.X = 0
pParam.Y = 0
pParam.fMaxZ = 0
pParam.fMinZ = 0
pXViewport:SetParam(pParam)