在SvrManager的Start方法中另一个比较重要的方法为SubmitFrame,具体实现如下:
IEnumerator SubmitFrame ()
{
while(true)
{
yield return waitForEndOfFrame;
var horizontalFieldOfView = 0f;
if (settings.eyeFovMargin > 0f)
{
horizontalFieldOfView = (monoCamera.enabled ? monoCamera.fieldOfView / monoCamera.aspect : leftCamera.fieldOfView / leftCamera.aspect) * Mathf.Deg2Rad;
}
plugin.SubmitFrame(frameCount, horizontalFieldOfView, (int)settings.displayType);
frameCount++;
}
}
该方法中,通过在协程方法中使用while(true)逻辑语句实现了类似于Update方法。
之后计算水平的Camera FOV值,调用Plugin.SubmitFrame方法传入当前帧数,FOV以及显示类型,之后在SDK底层代码中去刷新当前的帧图像。
void LateUpdate()
{
if (!IsRunning)
{
return;
}
status.pose = plugin.GetPredictedPose(ref headOrientation, ref headPosition, frameCount);
if (!disableInput)
{
if ((status.pose & (int)SvrPlugin.TrackingMode.kTrackingOrientation) != 0)
{
head.transform.localRotation = headOrientation;
}
if (settings.trackPosition && (status.pose & (int)SvrPlugin.TrackingMode.kTrackingPosition) != 0)
{
head.transform.localPosition = headPosition * settings.trackPositionScale;
}
}
var isValid = true;
if (settings.poseStatusFade)
{
isValid = !settings.trackPosition
|| ((plugin.GetTrackingMode() & (int)SvrPlugin.TrackingMode.kTrackingPosition) == 0)
|| (status.pose & (int)SvrPlugin.TrackingMode.kTrackingPosition) != 0;
}
var targetAlpha = fadeState == eFadeState.FadeOut || !isValid ? 1f : 0f;
UpdateOverlayFade(targetAlpha, Time.deltaTime / fadeDuration);
}
在SvrManager的LateUpdate方法中完成了VR场景头部位置及朝向的刷新逻辑。
plugin.GetPredictedPose(ref headOrientation, ref headPosition, frameCount);
首先是定义了headOrientation以及headPosition变量,保存的是底层SDK中返回的6Dof中位置及朝向的数据。
之后根据TrakingMode的值来判断当前使用哪一组数值更新Camera数据。