3

我正在尝试使用Google Cardboard SDK制作球形 360 度视频。

我已经对MovieTexture可以正常工作的桌面构建进行了一些测试,但是在 iOS 中没有此类的实现。

我在资产商店看到了一些外部插件,但它们似乎都与Unity 5不兼容。

Cardboard SDK是否提供了一个类来实现这一点,或者如果没有,您是否知道可以实现这一点的另一个解决方案或插件?

4

2 回答 2

2

Unity 中的电影通常被渲染为对象上的纹理。在移动设备上,问题变成设备只想在视频播放器中显示视频,因此不支持 Unity 类 MovieTexture。

我成功地规避了这一点,并使用 Unity Asset Store 中名为 Easy Movie Texture 的 Unity 插件成功地在球体内部渲染 360 度视频。

对于在 Mac 上工作,这是我所做的:

  1. 从 Unity Asset Store 下载 Easy Movie Texture 插件
  2. 从 Assets/EasyMovieTexture/Scene 打开 Demo Sphere 演示场景
  3. 为您的项目创建一个新的(空)预制件,然后将 Sphere GameObject 从 Demo Sphere 场景拖到预制件上。
  4. 重新打开您的 Cardboard 场景并将新的 videosphere 预制件拖到您的层次结构中。
  5. 在 Quicktime 中打开您的源 360 度视频
  6. 文件 -> 导出 -> 720p
  7. 将文件扩展名从“.mov”更改为“.mp4”
  8. 将新的 mp4 文件拖到项目 Assets/Streaming Assets 目录中。注意:不要通过菜单系统导入,因为这会强制 Unity 转换为 OGG。
  9. 在 videosphere GameObject 的“Media Player Ctrl”脚本组件上,找到“Str_File_Name”字段并提供新导出的视频文件的完整文件名。确保包含扩展名作为字符串“mymovie.mp4”的一部分。

很确定这就是一切。希望它可以帮助其他人解决这个问题。

最后一点,视频只会在设备上呈现。在编辑器中,您只会在球体上看到白色纹理。您必须发布到设备才能看到精彩的 360 度视频。

于 2015-08-31T23:59:15.720 回答
1

我终于解决了。

我们必须删除 CardboardAppController 和 MMTAppController 并将它们合并为一个。

基本上在 Assets/Plugin/ios 中有 2 个 AppController:“CardboardAppController.mm”(也有 CardboardAppController.h 标头)和“MMTAppController.mm”

诀窍是 ios 在生成后只“看到”一个应用程序控制器。由于 CardboardAppController 首先出现,因此 MMTAppController 被丢弃。

为了解决这个问题,我做了以下事情:

创建新的 AppController:在我的例子中,它被命名为 SVAppController.mm 和 SVAppController.h

然后我们必须将两个应用控制器合并到那个中并删除它们。

所以我将 CardboardAppController.h 的内容复制粘贴到 SVAppController.h 并将 CardboardAppController.mm 的内容复制到 SVAppController.mm (确保更改代码中的名称,将 CardboardAppController 替换为 SVAppController

然后将 MMTAppController.mm 的内容复制到 SVAppController.mm的正确位置

最后删除 CardboardAppController 和 MMTAppController。

您将剩下 1 个应用程序控制器,一切都应该正常工作。

供参考这是我最终的 SVAppController:

SVAppController.h

#import "UnityAppController.h"
#import "UnityAppController+Rendering.h"
#import "UnityAppController+ViewHandling.h"

// Unity 4.6.2 added a category to the app controller.
#if UNITY_VERSION < 462
#import "UnityInterface.h"
#else
#import "UnityAppController+UnityInterface.h"
#endif

// Unity 4 used a different method name to create the UnityView.
#if UNITY_VERSION < 500
#define createUnityView initUnityViewImpl
#endif

@interface SVAppController : UnityAppController

- (void)preStartUnity;

- (UnityView *)createUnityView;

- (void)startSettingsDialog:(UIViewController *)dialog;

- (void)stopSettingsDialog;

- (void)pause:(bool)paused;

- (void)shouldAttachRenderDelegate;

@end

SVAppController.mm

#import "SVAppController.h"
#import "CardboardView.h"
#import <UIKit/UIKit.h>
extern "C" {

    extern void readProfile();
    extern void syncProfile();

    extern "C" void MMTUnitySetGraphicsDevice(void* device, int deviceType, int eventType);
    extern "C" void MMTUnityRenderEvent(int marker);

    extern UIViewController* createSettingsDialog(id app);
    extern UIViewController* createOnboardingDialog(id app);

    bool isOpenGLAPI() {
#if UNITY_VERSION < 463
        return true;
#else
        SVAppController* app = (SVAppController *)GetAppController();
        UnityRenderingAPI api = [app renderingAPI];
        return api == apiOpenGLES2 || api == apiOpenGLES3;
#endif
    }

    void launchSettingsDialog() {
        SVAppController* app = (SVAppController *)GetAppController();
        [app startSettingsDialog:createSettingsDialog(app)];
    }

    void launchOnboardingDialog() {
        SVAppController* app = (SVAppController *)GetAppController();
        [app startSettingsDialog:createOnboardingDialog(app)];
    }

    void endSettingsDialog() {
        SVAppController* app = (SVAppController *)GetAppController();
        [app stopSettingsDialog];
    }

}  // extern "C"

@implementation SVAppController

- (void)preStartUnity {
    [super preStartUnity];
    syncProfile();
}

- (UnityView *)createUnityView {
    return [[CardboardView alloc] initFromMainScreen];
}

- (void)startSettingsDialog:(UIViewController*)dialog {
    [self pause:YES];
    [self.rootViewController presentViewController:dialog animated:NO completion:nil];
}

- (void)stopSettingsDialog {
    [[self rootViewController] dismissViewControllerAnimated:NO completion:nil];
    [self pause:NO];
}

- (void)pause:(bool)paused {
#if UNITY_VERSION < 462
    UnityPause(paused);
#else
    self.paused = paused;
#endif
}

- (void)shouldAttachRenderDelegate;
{
    UnityRegisterRenderingPlugin(&MMTUnitySetGraphicsDevice, &MMTUnityRenderEvent);
}

@end

IMPL_APP_CONTROLLER_SUBCLASS(SVAppController)
于 2015-07-12T20:05:23.443 回答