Unity纸板方向横向右上下
本文关键字:上下 横向 方向 Unity | 更新日期: 2023-09-27 18:09:46
嗨,我有一个Unity应用程序,它使用谷歌Cardboard SDK来启用立体视图,所以我将有一个启用VR的应用程序。我的应用程序运行得非常好。
但如果我将播放器设置方向设置为自动方向,只允许向左和向右横向,就会出现问题。当它处于左横向时,一切正常,但当它处于右横向时,纸板视图将旋转180度(设置按钮移动到屏幕底部(,但我的统一对象没有。因此我有一个倒置的物体。
有什么方法可以解决这个问题吗?
谢谢。
SDK用于读取陀螺仪的本地代码似乎只针对横向向左方向进行了硬编码。这可以通过编辑BaseCardboardDevice.cs并用以下代码替换UpdateState((的定义来解决:
private Quaternion fixOrientation;
public override void UpdateState() {
GetHeadPose(headData, Time.smoothDeltaTime);
ExtractMatrix(ref headView, headData);
headPose.SetRightHanded(headView.inverse);
// Fix head pose based on device orientation (since native code assumes Landscape Left).
switch (Input.deviceOrientation) {
case DeviceOrientation.LandscapeLeft:
fixOrientation = Quaternion.identity;
return;
case DeviceOrientation.LandscapeRight:
fixOrientation = Quaternion.Euler(0, 0, 180);
break;
}
headPose.Set(headPose.Position, headPose.Orientation * fixOrientation);
}
我建议在Cardboard设置中也关闭"颈部模型比例"(将其设置为0(,因为这段代码不会正确显示。
我已经解决了这个问题,这是解决方案(适用于Cardboard v0.5.2(
首先,根据smd的建议,您需要在BaseCardboardDevice/UpdateState((中应用方向调整。但是,您应该选中ScreenOrientation而不是DeviceOrientation。代码如下:
public override void UpdateState() {
ProcessEvents();
GetHeadPose(headData);
ExtractMatrix(ref headView, headData);
headPose.SetRightHanded(headView.inverse);
if (Screen.orientation == ScreenOrientation.LandscapeRight) {
headPose.Set(headPose.Position, headPose.Orientation * Quaternion.Euler(0, 0, 180)); // Workaround
}
这将修复方向,但这还不够,因为在Cardboard Recenter((之后,您将面临错误的方向。为了解决这个问题,你还需要在CardboardHead/UpdateHead((方法中应用旋转,代码如下:
private void UpdateHead() {
if (updated) { // Only one update per frame, please.
return;
}
updated = true;
Cardboard.SDK.UpdateState();
if (trackRotation) {
var rot = Cardboard.SDK.HeadPose.Orientation;
if (Screen.orientation == ScreenOrientation.LandscapeRight) {
rot = Quaternion.Euler(0, 180, 0) * rot; // << Workaround
}
if (target == null) {
transform.localRotation = rot;
} else {
transform.rotation = target.rotation * rot;
}
}
if (trackPosition) {
Vector3 pos = Cardboard.SDK.HeadPose.Position;
if (target == null) {
transform.localPosition = pos;
} else {
transform.position = target.position + target.rotation * pos;
}
}
if (OnHeadUpdated != null) {
OnHeadUpdated(gameObject);
}
}
您只需添加:
headPose.Set(headPose.Position, headPose.Orientation * Quaternion.Euler(0,0,180));
位于BaseCardboardDevice类的UpdateState((的和处。无论我如何打开我尝试过的设备,它都为我解决了这个问题。Unity 5硬纸板SDK v0.5.1
var fixOrientation = Quaternion.identity;
// Fix head pose based on device orientation (since native code assumes Landscape Left).
switch (Input.deviceOrientation) {
case DeviceOrientation.LandscapeLeft:
fixOrientation = Quaternion.identity;
break;
case DeviceOrientation.LandscapeRight:
fixOrientation = Quaternion.Euler(0, 0, 180);
break;
default:
Debug.Log ("Error No Orientation" + Input.deviceOrientation.ToString ());
break;
}
headPose.Set(headPose.Position, headPose.Orientation * fixOrientation);
现在,Cardboard SDK变成了GoogleVR,所以我在GvrDevice.cs 上这样写
让您的应用程序同时出现在LandscapeLeft和LandscapeRight中的一种方法是在Start方法中按以下顺序启用屏幕设置:
void Start () {
Screen.orientation = ScreenOrientation.Landscape;
Screen.orientation = ScreenOrientation.AutoRotation;
Screen.autorotateToPortrait = false;
Screen.autorotateToPortraitUpsideDown = false;
}
基本上,你强制一侧,然后启用自动旋转,然后防止旋转为纵向。
请注意,通过这种方式,您的应用程序可以在两个Landscape上工作,因此您只需要向左或向右旋转屏幕。
-
另请注意,这也适用于带有Cardboard的VR应用程序如任何其他。