一覧に戻る

Unity3Dプラグインの入力プラグインAPI

2018.07.08Unity3Dプラグイン

入力プラグインAPIはWikitude SDK ネイティブの入力と出力を変更するために使用されます。入力の場合、任意のソースのカスタムフレームデータはWikitude SDK ネイティブ APIの入力処理として提供されます。一方、出力の場合は、Wikitude SDK ネイティブ APIの既定のレンダリングに代わって高度な実装が可能です。両方のケースは以下の項目でサンプルを例にして説明します。

UNITYインターフェース

入力プラグインを有効にするには、WikitudeCameraスクリプトで「Has Input Plugins」を選択します。有効すると、入力プラグインをカスタマイズするために以下の追加オプションが表示されます。

  1. Requests Camera Frame Renderingは、SDKがカメラレンダリングを行うかどうかを制御します。独自のカメラレンダリングを行う場合は、これをオフにする必要があります。
  2. Invert Frame(反転フレーム)はフレームを垂直方向に反転します。SDKは、データの最初の行のピクセルに画像の上部が対応することを前提としています。これはネイティブカメラがデータを提供する動作と同じです。ただし、GetPixels32()を使用してUnityテクスチャ(WebCamTextureを含む)からテクスチャデータにアクセスするときはデータの最初の行は画像の一番下に一致します。Inverted Frameオプションを有効にすると、画像が自動的に反転されます。このオプションはColorSpace:RGBAである場合にのみ使用できます。

「Simple Input Plugin」サンプル

このサンプルではUnityを使用してカメラフィードを取得し、処理およびレンダリングするためにWikitude SDKに送信する方法を示します。このサンプルのロジックはCustomCameraController.csスクリプトに含まれています。
OnInputPluginRegisteredイベントが呼び出されたとき、フレームデータを格納するために必要なバッファが初期化されます。Updateメソッドでは有効なフレームを取得し、WebCamTextureクラスのGetPixels32(Color32[])メソッドを使用してピクセルを取得します。データの重複を避けるためにネイティブポインタを取得して、SDKに送信します。SDKは呼び出すときに指定されたネイティブポインタからのみデータを読み込むので、ポインタを保持する必要がありません。

private void SendNewCameraFrame() {
    GCHandle handle = default(GCHandle);
    try {
        handle = GCHandle.Alloc(_pixels, GCHandleType.Pinned);
        IntPtr frameData = handle.AddrOfPinnedObject();

        var metadata = new ColorCameraFrameMetadata();
        metadata.HorizontalFieldOfView = 58.0f;
        metadata.Width = _feed.width;
        metadata.Height = _feed.height;
        metadata.CameraPosition = CaptureDevicePosition.Back;
        metadata.ColorSpace = FrameColorSpace.RGBA;
        metadata.TimestampScale = 1;

        var plane = new CameraFramePlane();
        plane.Data = frameData;
        plane.DataSize = (uint)_frameDataSize;
        plane.PixelStride = 4;
        plane.RowStride = _feed.width;
        var planes = new List<CameraFramePlane>();
        planes.Add(plane);

        var cameraFrame = new CameraFrame(++_frameIndex, 0, metadata, planes);
        InputPlugin.NotifyNewCameraFrame(cameraFrame);
    } finally {
        if (handle != default(GCHandle)) {
            handle.Free();
        }
    }
}

「カスタムレンダリング」サンプル

このサンプルは、「Custom Camera」サンプルと同様に動作し、フレームはカスタムエッジ検出シェーダにてカメラフレームのレンダリングを処理するCustomCameraRenderer.csスクリプトに送信されます。このスクリプトはカメラに配置され、カスタムマテリアルを使用して画面にカメラのテクスチャを描画するためにCommandBufferを使用します。

_drawFrameBuffer = new CommandBuffer();
_drawFrameBuffer.Blit(_currentFrame, BuiltinRenderTextureType.CameraTarget, EffectMaterial);
camera.AddCommandBuffer(eventForBlit, _drawFrameBuffer);

また、このスクリプトはフィードのアスペクト比が画面のアスペクト比と一致しない場合はカメラのフレームの描画処理も行います。