この問題は解決しました。解決策は次のとおりです (Cardboard v0.5.2 で有効)。
まず、smd で提案されているように、BaseCardboardDevice / UpdateState() で方向調整を適用する必要があります。ただし、DeviceOrientation ではなく ScreenOrientation を確認する必要があります。コードは次のとおりです。
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
}
これで向きが修正されますが、それだけでは十分ではありません。CardboardRecenter() の後で間違った方向を向いているからです。これを回避するには、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);
}
}