Liteバージョンで2Dコンテンツ表示のシナリオを作って、フルバージョンの顔検出と組み合わせてみます。

今年は、007の50周年記念ということで、

2Dコンテンツ素材は、映画のオープニングで出てくる、ライフリング・マーク。

007には関心なくても、どっかで見た事あるんじゃないでしょうか?

顔検出には、TESTSのtestFaceTrackingAutoinitにあるトラッカーを使います。

手順

今回は、SATCHでの制作の仕方を書いてみます。

こんなことをやってみようと....。





工程は3つ。

1:SATCH Studio Liteでダミー・トラッキングして2Dコンテンツの表示シナリオを作成。
2:シナリオのトラッカーをtestFaceTrackingAutoinitのものと入れ替える。
3:SATCH Studioのフルバージョンでシナリオを読んで、Luaコードを書き換える。


TOP

1:SATCH Studio Liteでダミー・トラッキングして2Dコンテンツの表示シナリオを作成

SATCH Studio Liteの使い方はここを参照。

SATCH StudioのLiteバージョンを使ってみる

起動前に、以下のファイルを所定のフォルダーに入れておきます。

トラキング用画像

今回はトラッキング・ダミーとして使うのですが、以下のようなファイルを使ってみます。
(本当はなんでもいいんですけど....)

左クリックして、元画像のサイズを使います。





SATCHStudioLite/resources/trackerに保存しておきます。


2Dコンテンツ画像

お約束の画像です。
左クリックして、元画像のサイズを使います。





SATCHStudioLite/resources/2dContentsに保存しておきます。



Liteを起動して、以下のページの手順でシナリオを作成します。

SATCH StudioのLiteバージョンを使ってみる

以上

TOP

2:シナリオのトラッカーをtestFaceTrackingAutoinitのものと入れ替える

SATCH Developer siteのサンプルから、testFaceTrackingAutoinitをダウンロード。

解凍してfacetrackerAutoinitフォルダーを確認。

facetrackerAutoinitフォルダー内の「testFaceTrackingAutoinit_tracker.xml」ファイルの名前を「tracker.xml」に変更。

facetrackerAutoinitフォルダー名を「tracker」に変更。

1:で作ったシナリオのtrackerフォルダーを、これと入れ替えます。

以上

TOP

3:SATCH Studioのフルバージョンでシナリオを読んで、Luaコードを書き換える

SATCH Studioのフルバージョン版を起動して、シナリオを読み込みます。

シナリオがオリジナルと異なっているので、Scaleが変わっています。

Object Editorで「model2D_1」を選んで、Scale値を500位に設定して、Set initial valuesをクリック。



Luaコードを変更します。

元のままでは、2Dオブジェクトがお顔に追随してしまいます。今回は検出したら2Dオブジェクトを固定にしたままにします。

変更をかけるLuaはmainです。

Outlinerからmainというluascriptを右クリックで選んで、Open in Lua Editorを選択。

変数に以下のようなものを追加。

local current_pos = Vector3()
	local ini_count = 0
	local ini_x = 0
	local ini_y = 0
	local ini_z = 0


最後の方にある、main routineを探して以下のように変更。

コメントアウトというワードと追加というワードの部分を参照。

--main routine

repeat
    isCommand, command = componentInterface:pullCommand()
    if isCommand then
        handleCommand(command)
    end

    if isSVInit == false then
        --check requireMode of startTracking. 4th param.
        err_ret, g_trackingIndex = MLTPlugin:startTracking(g_trackerPath, 0, camera)
        err_ret,status = MLTPlugin:getTrackingStatus(g_trackingIndex)
        err_ret, g_targetCount = MLTPlugin:getTargetCount(g_trackingIndex)
        isSVInit = true
    end

    for iTargetIndex =1, g_targetCount do
        err_ret, status = MLTPlugin:getTargetStatus(g_trackingIndex, iTargetIndex-1)
        if status > 0 then
            err_ret = MLTPlugin:getTargetPos(g_trackingIndex, iTargetIndex-1, position, orientation)
            err_ret, kfIndex = MLTPlugin:getRecognizedKeyFrameIndex(g_trackingIndex, iTargetIndex-1)
            
            local luaIndex = kfIndex+1
            local itemId = (targets[luaIndex]['itemId'] ~= null) and targets[luaIndex]['itemId'] or 0
            g_targetIndex = iTargetIndex-1
            trackingCallback(jsNotify, itemId, iTargetIndex-1, kfIndex, position, orientation)
            tFlag = true
            g_keyFrame = kfIndex
            
            -- If another target is detected, the target is stopped playing.
            for i =1, #targets do
                if i~= luaIndex then
                    if targets[i]['onPlay'] then
                        if(targets[i]['ref'] ~= null and targets[i]['isScenette']) then
                            if targets[i]['ref']:getAnimationCount() > 0 then
                                anim = targets[i]['ref']:getAnimation(0)
                                anim:stop()
                            end
                        end
                        if targets[i]['sound']~=null then
                            targets[i]['sound']:stop()
                        end
                        if targets[i]['object']~=null then
                            targets[i]['object']:setVisible(false)
                        end
                        targets[i]['onPlay'] = false
                    end
                end
            end
            if targets[luaIndex]['status'] ~= false then
                if targets[luaIndex]['sound']~=null and targets[luaIndex]['onPlay']~=true then
                    LOG(luaIndex.." is play sound")
                    targets[luaIndex]['sound']:play()
                end
                
                -- The recognized target is started playing.
                if targets[luaIndex]['object']~=null then 
                    if not targets[luaIndex]['object']:getVisible() then
                        targets[luaIndex]['object']:setVisible(true)
                        if targets[luaIndex]['has2d'] then
                            setTextureToPlane(targets[luaIndex]['plane2d'], targets[luaIndex]['texture'])
                        end
                        if(targets[luaIndex]['ref'] ~= null and targets[luaIndex]['isScenette']) then
                            if targets[luaIndex]['ref']:getAnimationCount() > 0 then
                                anim = targets[luaIndex]['ref']:getAnimation(0)
                                anim:setLoop(true)
                                anim:play()
                            end
                        end
                    end
                    targets[luaIndex]['object']:setScale(targets[luaIndex]["scale"])
                    
                    --コメントアウト
                    --targets[luaIndex]['object']:setPosition(position+targets[luaIndex]["pOffset"], camera)
                    --targets[luaIndex]['object']:setOrientation(orientation*targets[luaIndex]["qOffset"], camera)
                    
                    --追加
                    current_pos = position+targets[luaIndex]["pOffset"]
                    
                    if ini_count == 0 then
                        ini_x = current_pos:getX()
                        ini_y = current_pos:getY()
                        ini_z = current_pos:getZ()
                        ini_count = ini_count + 1
                    end
                    
                    if ini_count ~= 0 then
                        current_pos:setX(ini_x)
                        current_pos:setY(ini_y)
                        --80という値は補正値で、たいした意味はありません
                        current_pos:setZ(ini_z - 80)
                    end

                    targets[luaIndex]['object']:setPosition(current_pos, camera)
                    
                    
                end
                
                targets[luaIndex]['onPlay'] = true
            else
                --LOG("targets["..luaIndex.."] is not active")
            end
        else
        -- If any targets aren't detected
            --追加
            ini_count = 0
            
            
            for i =1, #targets do
                if targets[i]['onPlay'] then
                    if(targets[i]['ref'] ~= null and targets[i]['isScenette'])then
                        if targets[i]['ref']:getAnimationCount() > 0 then
                            anim = targets[i]['ref']:getAnimation(0)
                            anim:stop()
                        end
                    end
                    if targets[i]['sound']~=null then
                        targets[i]['sound']:stop()
                    end
                    if targets[i]['object'] ~= null then
                        targets[i]['object']:setVisible(false)
                    end
                    position:set(0, 0, 0)
                    orientation:set(0, 0, 0, 0)
                    targets[i]['onPlay'] = false
                end
            end
            if tFlag == true then
                local luaIndex = g_keyFrame +1;
                if luaIndex > 0 and luaIndex <= #targets then
                    position:set(0, 0, 0)
                    orientation:set(0, 0, 0, 0)
                    local itemId = (targets[luaIndex]['itemId'] ~= null) and targets[luaIndex]['itemId'] or 0
                    trackingCallback(jsNotify, itemId, iTargetIndex-1, -1, position, orientation)
                else
                    eventCallback(0, "ERROR", OUT_OF_ARRAY, "OUT_OF_ARRAY at Lua unFocusFlow : index "..luaIndex, "")
                end
                tFlag = false;
            end
            g_keyFrame = -1
        end
    end
until coroutine.yield()


こんな感じです。







TOP

おまけ

007でコンテンツを作る場合のおまけ素材(for Boy's Life)。

ワルサー PPK モデル








007ロゴ







TOP





トップページ| サイトマップ|