openFrameworks 展示で外部ディスプレイ出力で困るやつ備忘録


背景と目的

PCはmacOSを想定しています、上の図のように、openFrameworksアプリケーションを作って、それを外部ディスプレイにフルスクリーンで表示されなくて困るなんてことありませんか?(この前、自分じゃなくても困ってる現場に遭遇した)

展示系の案件とかで毎回、あれどうやってやるんだったっけと思い出せなくなるので備忘録として残します。

他の手法とか周辺知識に関してはforumで議論されていました

今回のコードはgithubに上がっています

方法

1. SystemPreference

以下の画像の通り、mainをmacOSのPC、subdisplayとして外部のディプレイ(表示に使いたい側)をセットしておきます。
この時、二つのディスプレイの上端が揃っているといろいろコーディングしなくて済みます。

この時右側のディスプレイの大きさ(3440x1440)を覚えておきます。

2. windowSetting

openFrameworksのコード側でwindowSettingというのを変更します。
正確には ofGLFWWindowSettings のことです

変更前

main.cpp

#include "ofMain.h"
#include "ofApp.h"

//========================================================================
int main( ){
    ofSetupOpenGL(1024,768,OF_WINDOW);          // <-------- setup the GL context

    // this kicks off the running of my app
    // can be OF_WINDOW or OF_FULLSCREEN
    // pass in width and height too:
    ofRunApp(new ofApp());

}

変更後

main.cpp
#include "ofMain.h"
#include "ofApp.h"

//========================================================================
int main( ){
    ofGLFWWindowSettings windowSettings;
    windowSettings.decorated = false;
    windowSettings.width = 3440;
    windowSettings.height = 1440;
    ofCreateWindow(windowSettings);
    ofRunApp(new ofApp());
}

windowSettings.decoratedに関しては、縮小拡大閉じるボタンなどを含む外枠をつけるかつけないかの選択肢です、今回フルスクリーンで出したいのでfalseとしています

windowSettings.widthwindowSettings.heightはwindowの幅と高さです、 SystemPreferenceで控えたディスプレイのサイズを入力しています。

ofCreateWindowに今まで設定したwindowSettingを渡してWindowを作ります。

次に、適当なものを描画するために、

ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    ofSetWindowPosition(ofGetScreenWidth(), 0);
    ofSetLineWidth(2);
    ofSetCircleResolution(64);
}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){
    ofBackground(0);
    ofDrawCircle(ofGetWidth()/2, ofGetHeight()/2, ofSignedNoise(ofGetElapsedTimef())*1000);
    ofDrawLine(0, 0, ofGetWidth(), ofGetHeight());
}

ポイントは

ofSetWindowPosition(ofGetScreenWidth(), 0);

で、windowのポジションをmacOSの画面分横にずらしています。
SystemPreferenceで画面の上端を揃えていない場合、第二引数の0が変わってきて、これを計算するのが面倒なので、揃える形をとりました。

実行結果

実行してみると以下のような結果となります

youtube movie