ラベル Android「応用」 の投稿を表示しています。 すべての投稿を表示

[VuforiaでARアプリ] 「Video Playback Sample」 に動画を追加 [Androidアプリ]




サンプルプログラムのビルドや開発環境については前の記事
前回:http://taku-note.blogspot.jp/2014/10/eclipsevuforia.html






まず、サンプルプログラムの中に入っている「VideoPlayback.java」を編集します。


「VideoPlayback.java」

VideoPlayback 65行目辺り
「NUM_TARGETS」に動画の数を入力
今回は追加する動画を「HYOUSHI」とします。


// Movie for the Targets:
    public static final int NUM_TARGETS = 3; //追加コード
    public static final int STONES = 0;
    public static final int CHIPS = 1;
    public static final int HYOUSHI = 2; //追加コード


VideoPlayback 156行目辺り
「mMovieName」に新しい動画のファイル名を指定します。

        mMovieName[STONES] = "VideoPlayback/VuforiaSizzleReel_1.m4v";
        mMovieName[CHIPS] = "VideoPlayback/VuforiaSizzleReel_2.m4v";
        mMovieName[HYOUSHI] = "VideoPlayback/Hyoushi.wmv"; //追加コード


VideoPlayback 256行目辺り
サムネイルテクスチャを追加します。これは動画が再生される前に画面に表示する画像です。

// We want to load specific textures from the APK, which we will later
    // use for rendering.
    private void loadTextures()
    {
        mTextures.add(Texture.loadTextureFromApk(
            "VideoPlayback/VuforiaSizzleReel_1.png", getAssets()));
        mTextures.add(Texture.loadTextureFromApk(
            "VideoPlayback/VuforiaSizzleReel_2.png", getAssets()));
        mTextures.add(Texture.loadTextureFromApk(
                "VideoPlayback/Hyoushi.png", getAssets()));  //追加コード
        mTextures.add(Texture.loadTextureFromApk("VideoPlayback/play.png",
            getAssets()));
        mTextures.add(Texture.loadTextureFromApk("VideoPlayback/busy.png",
            getAssets()));
        mTextures.add(Texture.loadTextureFromApk("VideoPlayback/error.png",
            getAssets()));
    }



次に「VideoPlaybackRenderer.java」を編集します。


「VideoPlaybackRenderer.java」

VideoPlaybackRenderer 73行目辺り

private float videoQuadTextureCoordsTransformedStones[] = { 0.0f, 0.0f,
            1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, };
private float videoQuadTextureCoordsTransformedChips[] = { 0.0f, 0.0f,
            1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, };
private float videoQuadTextureCoordsTransformedHyoushi[] = { 0.0f, 0.0f,
            1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, }; //追加コード


VideoPlaybackRenderer 531行目辺り

if (imageTarget.getName().compareTo("stones") == 0)
                currentTarget = VideoPlayback.STONES;
            else  if (imageTarget.getName().compareTo("chips") == 0)
                currentTarget = VideoPlayback.CHIPS;
            else  if (imageTarget.getName().compareTo("動画を移したいモデルビュー名") == 0)
        currentTarget = VideoPlayback.HYOUSHI;


VideoPlaybackRenderer 647行目辺り

if (imageTarget.getName().compareTo("stones") == 0)
                    GLES20.glVertexAttribPointer(videoPlaybackTexCoordHandle,
                        2, GLES20.GL_FLOAT, false, 0,
                        fillBuffer(videoQuadTextureCoordsTransformedStones));
                else if (imageTarget.getName().compareTo("chips") == 0)
                    GLES20.glVertexAttribPointer(videoPlaybackTexCoordHandle,
                        2, GLES20.GL_FLOAT, false, 0,
                        fillBuffer(videoQuadTextureCoordsTransformedChips));
                else if (imageTarget.getName().compareTo("動画を移したいモデルビュー名") == 0)
                    GLES20.glVertexAttribPointer(videoPlaybackTexCoordHandle,
                        2, GLES20.GL_FLOAT, false, 0,
                        fillBuffer(videoQuadTextureCoordsTransformedHyoushi));


VideoPlaybackRenderer 862行目辺り

if (target == VideoPlayback.STONES)
        {
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedStones[0],
                videoQuadTextureCoordsTransformedStones[1],
                videoQuadTextureCoords[0], videoQuadTextureCoords[1], mtx);
            videoQuadTextureCoordsTransformedStones[0] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedStones[1] = tempUVMultRes[1];
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedStones[2],
                videoQuadTextureCoordsTransformedStones[3],
                videoQuadTextureCoords[2], videoQuadTextureCoords[3], mtx);
            videoQuadTextureCoordsTransformedStones[2] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedStones[3] = tempUVMultRes[1];
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedStones[4],
                videoQuadTextureCoordsTransformedStones[5],
                videoQuadTextureCoords[4], videoQuadTextureCoords[5], mtx);
            videoQuadTextureCoordsTransformedStones[4] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedStones[5] = tempUVMultRes[1];
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedStones[6],
                videoQuadTextureCoordsTransformedStones[7],
                videoQuadTextureCoords[6], videoQuadTextureCoords[7], mtx);
            videoQuadTextureCoordsTransformedStones[6] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedStones[7] = tempUVMultRes[1];
        } else if (target == VideoPlayback.CHIPS)
        {
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedChips[0],
                videoQuadTextureCoordsTransformedChips[1],
                videoQuadTextureCoords[0], videoQuadTextureCoords[1], mtx);
            videoQuadTextureCoordsTransformedChips[0] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedChips[1] = tempUVMultRes[1];
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedChips[2],
                videoQuadTextureCoordsTransformedChips[3],
                videoQuadTextureCoords[2], videoQuadTextureCoords[3], mtx);
            videoQuadTextureCoordsTransformedChips[2] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedChips[3] = tempUVMultRes[1];
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedChips[4],
                videoQuadTextureCoordsTransformedChips[5],
                videoQuadTextureCoords[4], videoQuadTextureCoords[5], mtx);
            videoQuadTextureCoordsTransformedChips[4] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedChips[5] = tempUVMultRes[1];
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedChips[6],
                videoQuadTextureCoordsTransformedChips[7],
                videoQuadTextureCoords[6], videoQuadTextureCoords[7], mtx);
            videoQuadTextureCoordsTransformedChips[6] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedChips[7] = tempUVMultRes[1];
        }
         else if (target == VideoPlayback.HYOUSHI)     //追加コード
        {
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedHyoushi[0],
                videoQuadTextureCoordsTransformedHyoushi[1],
                videoQuadTextureCoords[0],
                videoQuadTextureCoords[1], mtx);
            videoQuadTextureCoordsTransformedHyoushi[0] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedHyoushi[1] = tempUVMultRes[1];
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedHyoushi[2],
                videoQuadTextureCoordsTransformedHyoushi[3],
                videoQuadTextureCoords[2],
                videoQuadTextureCoords[3], mtx);
            videoQuadTextureCoordsTransformedHyoushi[2] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedHyoushi[3] = tempUVMultRes[1];
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedHyoushi[4],
                videoQuadTextureCoordsTransformedHyoushi[5],
                videoQuadTextureCoords[4],
                videoQuadTextureCoords[5], mtx);
            videoQuadTextureCoordsTransformedHyoushi[4] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedHyoushi[5] = tempUVMultRes[1];
            tempUVMultRes = uvMultMat4f(
                videoQuadTextureCoordsTransformedHyoushi[6],
                videoQuadTextureCoordsTransformedHyoushi[7],
                videoQuadTextureCoords[6],
                videoQuadTextureCoords[7], mtx);
            videoQuadTextureCoordsTransformedHyoushi[6] = tempUVMultRes[0];
            videoQuadTextureCoordsTransformedHyoushi[7] = tempUVMultRes[1];
        }



これで動画の追加は完了です。

モデルデータセットを変更したい場合は以下のコードを編集、追加します。

VideoPlayback 632行目辺り

// データセットをロード:
        if (!dataSetFITPamph.load("追加したいデータセット名.xml",
            STORAGE_TYPE.STORAGE_APPRESOURCE))  //編集箇所
        {





サンプルプログラムのビルドや開発環境については前の記事で
前回:http://taku-note.blogspot.jp/2014/10/eclipsevuforia.html






参考:https://developer.vuforia.com/forum/faq/android-how-do-i-add-another-target-video-playback-sample















[VuforiaでARアプリ] VideoPlaybackSampleをeclipseでビルド [Androidアプリ]




eclipseとvuforiaで、AR動画のサンプルを試したのでメモ
まずは、開発環境から・・・


以下にて「Android-Vuforia SDK」と、Sampleをダウンロード

Android-Vuforia SDK
https://developer.vuforia.com/resources/sdk/android

Sample
https://developer.vuforia.com/resources/sample-apps/features




SDKを解凍すると「samples」というフォルダがあるので、その中にさっきダウンロードしたSampleを全部突っ込む。


eclipseにてダウンロードしたsampleをインポートする。


eclipseの「ウィンドウ-設定-java-ビルド・パス-クラスパス変数」内で、Vuforia SDKに入ってた「Vuforia.jar」を追加。その時名前は「QCAR_SDK_ROOT」にする。


これで実行できると思いきや、どうやらAndroid NDKがないと動かないらしいので、以下から「Android NDK」をダウンロード。適当なディレクトリに入れ、パス通し。詳しくは以下の参考さいとで。

Android NDK
https://developer.android.com/tools/sdk/ndk/index.html

Android NDK参考
http://technobrain.seesaa.net/article/246790219.html


次に、「Cygwin」のインストール。どうやらeclipseでコンパイルする前にCygwinでコンパイルするらしい、先にコンパイルして生成しておくファイルが有るとか何とか、詳しいことは知らん。

Cygwin
https://cygwin.com/install.html

Cygwin参考
http://win.just4fun.biz/%E9%96%8B%E7%99%BA%E3%83%84%E3%83%BC%E3%83%AB/Cygwin%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89.html



インストールが終わったら、Cygwinでコンパイルする。
まず、「cd」コマンドでサンプルプロジェクトがあるディレクトリに移動し、「ndk-build]コマンドでビルド。

ここまでのことで詳しくは以下のリンクで
https://developer.vuforia.com/resources/dev-guide/step-1-setting-development-environment-android-sdk


これで、やっと実行できる 笑








次回はこのサンプルプログラムに自分の好きな動画を追加していきたいと思います。

次回:http://taku-note.blogspot.jp/2014/11/vuforia-video-playback-sample.html



















[簡単Androidアプリ] 背景にグラデーションを与える方法




背景にグラデーションを与えるには、eclipseの「パッケージ・エクスプローラー」内の「res」->「drawable」フォルダ内に新しく「xml」ファイルを作成し、そこにグラデーションを与える記述をします。では早速見て行きましょう。

まず、新しく「xml」ファイルを作成します。
drawable」フォルダを右クリックし「新規」、「Android XML ファイル」を選択

  • リソース・タイプを「Drawable
  • ファイル名を適当に入力、ここでは「gradientbackground」とする。
  • ルート要素を「shape」にし完了。



作成したXMLファイルに以下を記述。


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
    android:startColor="#339933"
    android:endColor="#99CC33"
    android:angle="270"/>
<corners android:radius="10dp"/>
</shape>

 グラデーションは<gradient>タグ内で設定しています。android:startColor=""にグラデーションのスタートの色を16進数カラーコードで指定し、android:endColor=""にグラデーションの終わりの色を16進数カラーコードで指定します。android:angle=""ではグラデーションがどの方角に向かうかかを角度で指定します。デフォルトでは0度となり、右から左へとグラデーションします。

 次に、layoutのxml内で先ほど作成したgradientbackground.xmlを背景として設定します。背景の設定は3行目のandroid:background="@drawable/作成したファイル名"で行います。以下activity_main.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:background="@drawable/gradientbackground"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</LinearLayout>