Skip to content

How to create Scene_JP

itotaka edited this page Feb 6, 2015 · 54 revisions

Structure of RAMDanceToolkitにも書かれていますが、自分でシーンを作成する事が出来ます。下記のEmptySceneのコードに書かれているものが基本的なシーンの骨組みになります。

.hファイル

#pragma once

#include "ramMain.h"

class EmptyScene : public ramBaseScene
{

public:
	// GUIに表示されるシーン名をここで指定します。
	string getName() const { return "My scene"; }

    void setupControlPanel();
    void setup();
    void update();
    void draw();

    void drawActor(const ramActor& actor);
    void drawRigid(const ramRigidBody &rigid);
    void onActorSetup(const ramActor &actor);
    void onActorExit(const ramActor &actor);
    void onRigidSetup(const ramRigidBody &rigid);
    void onRigidExit(const ramRigidBody &rigid);
	
private:
    
	float mySlider;

};

.cppファイル

#include "EmptyScene.h"

void EmptyScene::setupControlPanel()
{
	// GUIの設定をここで行います。
	// setup()の後で実行されます。

	// このシーン用のGUIにスライダーを登録しています。
    ramGetGUI().addSlider("Slider", 0.0, 10.0, &mySlider);
}

void EmptyScene::setup()
{
    
}

void EmptyScene::update()
{
    
}

void EmptyScene::draw()
{
    ofSetColor(255,255,255);
    
    //RAMDanceToolkitの座標にあわせるにはramBeginCamera()と
    //ramEndCamera()の間で描画をする必要があります。

    ramBeginCamera();
	//スライダーの値はsetupControlPanel()で指定した変数で取得できます。
    ofDrawBitmapString("Slider value: " + ofToString(mySlider), ofVec3f(0,200,0));
    ramEndCamera();
}

void EmptyScene::drawActor(const ramActor& actor)
{
	// OSCで受信しているramActorの人数の分だけ呼ばれます。
	// それぞれのアクターが、`const ramActor &actor`の形で
	// 引数として渡されます。
}

void EmptyScene::drawRigid(const ramRigidBody &rigid)
{
	// OSCで受信しているramRigidBodyの個数の分だけ呼ばれます。
	// それぞれのアクターが、`const ramRigidBody &rigid`の形で
	// 引数として渡されます。
}

void EmptyScene::onActorSetup(const ramActor &actor)
{
	// 新しいramActorが入ってきた時に呼ばれます。  
	// 新しく入ってきたアクターは`const ramActor &actor`の形で
	// 引数として渡されます。
}

void EmptyScene::onActorExit(const ramActor &actor)
{
	// `const ramActor &actor`のデータが更新されなくなった時に呼ばれます。
	// ramConstants.hのRAM_OUTDATED_DURATION定数に、
	// デフォルトのデータ更新のタイムリミットとして1.0秒が設定されています。
}

void EmptyScene::onRigidSetup(const ramRigidBody &rigid)
{
	// 新しいramRigidBodyが入ってきた時に呼ばれます。  
	// 新しく入ってきたリジッドボディは、
	// `const ramRigidBody &rigid`の形で引数として渡されます。
}

void EmptyScene::onRigidExit(const ramRigidBody &rigid)
{
	// `const ramRigidBody &rigid`のデータが更新されなくなった時に呼ばれます。
	// ramConstants.hのRAM_OUTDATED_DURATION定数に、
	// デフォルトのデータ更新のタイムリミットとして1.0秒が設定されています。
}

{RAM_ROOT}/examples/example-emptySceneがシンプルなシーン実装のサンプルプロジェクトになっているので、参考にしてみてください。

シーンの名前を決める

getName()はシーン管理用に、シーン名を登録するためのメソッドです。 シーン名は同じプロジェクト内の他のシーンと重複しないようにしてください。

string getName() const { return "My new scene"; }

GUIの初期化

setupControlPanel()でGUIのパーツを加える事ができます。 シーンごとのGUIパネルとしてofxUICanvasを使う事が出来ます。詳細はofxUIのサイトか、RAMDanceToolkit内の{RAM_ROOT}/apps/RAMDanceToolkitプロジェクト等を参照してください。

	void setupControlPanel()
	{
		// パネルの設定をします...

		// このシーン用のGUIにスライダーを登録しています。
	    ramGetGUI().addSlider("Slider", 0.0, 10.0, &mySlider);
		
	}

上のsetupControlPanel()のように登録したスライダーの情報は

	//スライダーの値はsetupControlPanel()で指定した変数で取得できます。
    ofDrawBitmapString("Slider value: " + ofToString(mySlider), ofVec3f(0,200,0));

のように登録した変数を使う事で取得する事が出来ます。また下記のようなメンバー関数を用意し、

.hファイル

    void onPanelChanged(ofxUIEventArgs &e);

.cppファイル

void EmptyScene::onPanelChanged(ofxUIEventArgs &e)
{
    const string name = e.widget->getName();
    if (name == "slider") {

    }
    
    // do something...
}

さらにsetupControlPanel()の中で

    ofAddListener(ramGetGUI().getCurrentUIContext()->newGUIEvent, this, &EmptyScene::onPanelChanged);

などとすることで、GUIが変更された時にのみ実行されるイベントリスナーを登録することも可能です。

シーンの登録

シーンをramSceneManagerに登録する事で、GUIへの登録とGUI上でのシーンの操作が出来るようになります。 ここで実装方法を説明します。

まずtestApp.hファイルで作成したシーンのヘッダファイルをincludeします。

	#include "EmptyScene.h"

またtestAppのメンバオブジェクトとしてシーンを宣言します。

	class testApp : public ramBaseApp
	{
	    public:
	      //省略
	    EmptyScene myScene;
	}

testApp.cppでramInitialize(int port)のあとにramSceneManagerへのシーンの登録を行います。これで、GUIへの登録が完了します。

	void testApp::setup()
	{
		ofSetFrameRate(60);
		ofSetVerticalSync(true);
	
		/// ram setup
		// ------------------
		ramInitialize(10000);
	
		ramSceneManager& sceneManager = ramSceneManager::instance();
		sceneManager.addScene(&myScene);
	}

{RAM_ROOT}/examples/example-emptySceneのプロジェクトで実際に実装されているのでチェックしてみてください。

シーンを書くコードには、ramBaseAppでサポートされているRAMDanceToolkitの機能のほかに、openFrameworksの機能もすべて使用する事が出来ます。RAMDanceToolkitでサポートされている機能に関してはRAM API Reference Coreを参照してください。またopenFrameworksに関してはopenFrameworks.ccを参照してください。


Creative Commons License
This Document by YCAM InterLab, Yoshito Onishi, Satoru Higa, Motoi Shimizu, and Kyle McDonald is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.