嗨,我有一个使用google Cardboard SDK来启用立体视图的Unity应用程序,所以我将有一个支持VR的应用程序。我的应用程序运行得很好。
但是有一个问题,如果我将播放器设置方向设置为自动定向,只允许左横向和右横向。当它在风景左边时,一切正常工作,但当它在风景右边时,纸板视图将旋转180度(设置按钮移动到屏幕底部),但我的unity对象不会。因此,我有一个颠倒的对象。
有什么方法可以解决这个问题吗?
谢谢。
发布于 2015-09-02 12:11:13
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设置中关闭Neck Model Scale (将其设置为0),因为它不会在此代码中正确显示。
发布于 2016-01-19 21:54:43
我已经解决了这个问题,下面是解决方案(适用于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);
}
}发布于 2015-09-08 01:36:37
您可以只添加以下内容:
headPose.Set(headPose.Position, headPose.Orientation * Quaternion.Euler(0,0,180));在BaseCardboardDevice类的UpdateState()的和处。它为我解决了这个问题,无论我如何打开我尝试过的设备。Unity 5 cardboard SDK v0.5.1
https://stackoverflow.com/questions/32200052
复制相似问题