なるように、なる

徒然なつぶやき、備忘録です。

3Dモデルを描画する(ofxAssimpModelLoader)

気付いたら(気付いてたけど)最後にブログを書いてから半年過ぎてしまっていました。なので最近やった3Dモデルの描画についてちょっと書いてみます。

きっかけ

先日、テクノ法要のVJを観ていて自分も神様を描画したくなり、3Dモデルの描画にトライしました。アドオンのofxAssimpModelLoaderをサンプル通りに使えばできたのですが、1点だけハマった箇所があったので記録しておきます(調べたけど出てこなかったので)。誰かのお役にたちますように。。

※コードの全文はgithubにあげてます。

※3Dモデル初心者なので、間違ってたら(正しいアプローチじゃないとか)あったらゴメンナサイ

課題

 

3DモデルをdrawVertices()やdrawWireframe()で描画すると、テクスチャの色がついてて、コレジャナイ感がつよい。

対応

描画の前にdisableTextures()をコールする。

これで思った通りのワイヤフレーム(や頂点)が描画された。

で、出来た絵がこれ。すき。

f:id:Shampagne:20190708224854j:plain

 

 

 

 

Flyng Tokyo #21

Kyleさんのワークショップに参加してきました。
特に印象に残ったことをメモに残しておきます。


What is art?
  • 関係性を問い直すこと、問い直す機会を与えるもの
  • コンセプトが一番大事
  • artと他のもの(デザイン、広告など)との違いを意識しておくとよい
    (ただし、"違い"は0/1ではない)
Machine Learning
  • 機械化(自動化)により淘汰され、残るものは人と人との関係性があるもの
  • AIが判断や推定をしたりすることや、AIか人間か見分けがつかなくなっていくことに、驚きとともに不安などの否定的な気持ちを感じる人がいる。
  • AIと人間との関係性について「問い」を発信し、(説明的ではなく)人に考えてもらえるような作品により、理解に繋げていきたい。

 

あと、広告代理店などへ作品を提案する過程や見積書など、普通じゃ絶対見れないものを見せてもらえて、ぬぉ!っていう感じでしたん。

あとあと、Kyleさんはめちゃめちゃ優しくてフレンドリーな人でした。
日頃ライブラリ使わせてもらっている感謝を伝えられて感無量。

FFTとちょっとだけ仲良くなる夏

今年の夏はFFTの気持ちを理解することに費やした夏でした。
まだまだ片思いのままなので、これからもアプローチをつづけます。。

Box

youtu.be

「タイムベンド」@かずち (カズチ)様

https://github.com/thinpedelica/FFTTS/tree/master/FftBox/FftBox/src

Triangle

youtu.be

「Floor_Monster」@MFP【Marron Fields Production】様

https://github.com/thinpedelica/FFTTS/tree/master/FftTriangle/FftTriangle/src

GPUCircle

youtu.be

「Homework」@MFP【Marron Fields Production】様

https://github.com/thinpedelica/FFTTS/tree/master/FftGpuCircle/FftGpuCircle

Grid

youtu.be

「Wave_Domination」@MFP【Marron Fields Production】様

https://github.com/thinpedelica/FFTTS/tree/master/FftGrid/FftGrid/src

ヨガ2018

ヨガポーズの推定 2018年版。

  • KinectV2で取得したスケルトンを、
  • CNNで学習させたモデルでポーズ推定して、
  • ヨガポーズと一致していたらパーティクルを出す

youtu.be

 

昨年vvvvで作ったやつをOpenFrameworksに移植しましたん。

 

 

ofxFaceTrackerハマリ記録

FaceTrackerは画像から顔を検出し、顔のパーツ(特徴点)の座標を取得できるライブラリです。C++OpenCVで実装されていますが、Pythonのラッパーもあるようです。

今回私はopenFrameworksのアドオンとして提供されているofxFaceTrackerを利用しました。毎度のことですが、利用するまでにいくつか(いくつも?)ハマったので、記録として残しておきます。

 

開発環境
  • Windows10
  • VisualStudio2015
  • openFramewowks (nightly builds)
ハマり1 インストールするものたちのバージョン

openFrameworksの安定バージョンが0.9.8から0.10.0に移行しようとしている真只中の現在、ofxFaceTrackerとofxCvをgithubのmasterからそれぞれ落としてくると、ビルドエラーになります。これらのmasterは0.10.0向けとなっているためです。
もし、openFrameworksを0.9.8のstable版で使用している場合、ofxFaceTrackerとofxCvは、masterではなくstableブランチから落としてくる必要があります。


ハマり2.1 プロジェクト設定(ofxCvの追加のインクルードパス)

新規プロジェクトを作成してofxCvを利用しようとすると、追加のインクルードパスが以下のように設定されていました。このままだとインクルードファイルが見つからないので、それぞれフルパスに修正する必要があります。

  • libs/ofxCv/include
  • libs/CLD/include/CLD
  • src

 

ハマり2.2 プロジェクト設定(追加の依存ファイル)

つづいて追加の依存ファイルを見ると、依存ファイルの行頭に「%3b」という文字が付与されていました。このままだとリンクエラーになるので、「%3b」を削除します。

 

ハマり2.3 プロジェクト設定(出力ファイル/オブジェクトファイル)

ここまで実施しても、まだリンクエラーが出ます。ぐぬぅ。
最後はエラーメッセージをググってみたら、こちらの記事にあたりました。
出力ファイル名を「$(IntDir)」から「$(IntDir)/%(RelativeDir)」に変更しました。

 

ここまでで、無事にofxFaceTrackerをビルド出来るようになってるはずです。
もしまだ別のエラーに困っているようであれば、それは新規の案件かもしれないので、解決したらぜひ周知してください♪

 

おまけ

f:id:Shampagne:20180502001200p:plain

多摩美の田所先生が公開しているサンプルを使わせて頂いて、歌舞伎Faceをやりました。かなりしっかり顔にフィットしてますね。

mastodonインスタンスを立てた(@さくらVPS)

mastodonが流行り出してからほぼ1年が経ちました。僕自身は2017年のニコニコ超会議に相撲と歌舞伎を観にいった際にfriends.nicoに登録してからズブズブです。

mastodonとは


 

建てたインスタンス(mastodosukoi)

 

はじめてのことだらけで、稽古つけてもらった感じです。いい勉強になりました。
ごっつぁんです。

C++にPythonを組み込むメモ(Boost.python)

C++からPythonを呼びたいのです。
逆に比べると大分ニーズが少ない。
以下を参考にさせて頂きました。
Embedded Python in C++ / C++からPythonスクリプトを呼び出す - Qiita
Boost.PythonでC++からPythonの関数を呼び出す
C++からPythonを叩きつつ、boost.numpyを使ってC++とPython間でndarrayをやりとりする - verilog書く人

初期化
Py_Initialize();
auto main_mod = boost::python::::import("__main__");
auto main_ns = main_mod.attr("__dict__");
スクリプトの読み込み
std::string script((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
boost::python::::exec(script.c_str(), main_ns);
関数の実行
auto func = main_ns["func"];
auto result = func(1.0);
Pythonからの値のパース
boost::python::::extract<double>(result)
例外処理
try {
//
} catch (boost::python::error_already_set) {
    PyErr_Print();
}
リスト/タプルで引数渡し
boost::python::list list_val;
list_val.append(1.0);
list_val.append(2.0);
auto result = main_mod.attr("func")(list_val);
タプルを受け取る
using input_iterator = boost::python::stl_input_iterator<double>;
input_iterator begin(result), end;

std::vector<double> vals(begin, end);
for (auto val : vals) {
    std::cout << val << std::endl;
}