Meshlab で平行移動・回転・縮尺

前回のエントリのときは実はやり方わからなかったのですが、これもフィルタメニューの奥にありました。

「Filters」→ 「Normals, Curvatures and Orientation」で出るサブメニューのサブメニューに「Transform: 」で始まる項目がいくつかあります。

ぱっと見てすぐに使えそうなのは、この三つですね。

Transform: Move, Translate, Center

移動、平行移動、中心…三つの機能があるわけではなく、同じ意味です(^^;
X, Y, Z軸の三つのパラメータでモデルの位置を変化させます。

プレビューもあるので、決まったところで Apply ボタンを押して反映させます。
失敗したらDefault で元に戻せるし、やっぱやめたというときはClose で抜けます。

Transform: Rotate

回転。

Rotation on で回転軸を選びます。 X, Y, Z軸の他にcustom axis(任意軸?)がありますが深入りしません。

Center of rotation は回転の中心。origin(原点)、bary center(重心), custom point(任意座標)が選べます。ここはとりあえず原点で。

Rotation Angle は回転角度で、数値入力とスライドバー操作ができます。

これもプレビューを使って確認でき、Applyで決定します。

custom axis, custom centor の設定はビューから取り込むこともできるようです。

Transform: Scale

縮尺。

X, Y, Z軸の三つの項目がありますが、デフォルトではどれも同じです。
個別に倍率を変更したいときは「Uniform Scaling」をオフにします。

Center of rotation は拡大の中心点で、Rotation と同様、origin(原点)、bary center(重心), custom point(任意座標)が選べます。

これも例によってプレビューを使って確認でき、Applyで決定します。


Meshlab 便利ですね!

usermod -G でユーザに新しいサブグループを追加してはいけない

例えば subversion サーバを設定するとき、subversion グループを作成する。

 % sudo groupadd subversion

ここで、作成したグループをユーザーに追加するのに、決して usermod -G を使ってはいけない。

 % sudo usermod -G subversion user # ダメ!

「確かに」これでユーザーは subversion グループに設定できる。だが誤った使い方である。何がいけないか。

既に設定されていた他のグループの設定が全部飛ぶのだ!

特に怖いのが、個人でUbuntuを使っている場合に唯一のユーザである本人が admin グループから外れること。
不具合に気がついて vigr で修正しようにも、sudo が利かない!

もちろんリカバリーモードで復旧は可能*1だし(/etc/group- というバックアップファイルが作られるようだ)、あらかじめ設定済みのグループを確認して

 % sudo usermod -G group1,group2,...,newgroup user # おすすめしない

というコマンドラインを書いてもいいが、億劫だし間違いそうだし万一漏れがあると後で困る。
ここは gpasswd -a をおすすめする。

 % sudo gpasswd -a user subversion # オススメ!

これなら当初の意図通り、user の設定ずみのグループに影響を与えずに、新しく subversion グループに設定することができる。

「is not in the sudoers file」などでぐぐるといろいろ対策ページがひっかかるので、まあよくあるトラブルなのだけど、要するにコマンドの仕様を理解せずに、Howtoページに書いてあるまま usermod -G を実行するからこうなるのである。

俺のことなんだけどね……orz

*1:余談だがいくらシフトキーを押して起動してもGRUB2のメニューが出なくて困った。右シフトキーを押して起動したら出た。そういうもの?

3Dモデルを軽量化したいときは

今はMeshlabというべんりなものがあるんですね。
Ubuntu ソフトウェアセンターにも入っているのでインストールもすぐ。

で、そのMeshlabを使って3Dモデルを軽量化するデモがこちら。
http://youtu.be/w_r-cT2jngk

かいつまみますと、メニューバーの「Filters」→「Remeshing, simplification and reconstruction」→「Quadric Edge Collapse Decimation」を選び、

ダイアログの
1.「Target number of faces」でポリゴン数を直接指定する
または
2.「Percentage reduction (0..1)」で小数値を入れる
などして、「Apply」ボタンを押す。

2の方で小数値を0.5としてやれば、Applyを押すたびにポリゴン数が半分になります。
当然減らしすぎると形が崩れるので、やりすぎたな、と思ったところで Undo できればいいんですが、残念ながら Meshlab には Undo がまだ実装されてないようです(x_x)

なお、モデルを読み込むにはFileメニューの「Import Mesh...」、軽量化したモデルを保存するには同じく「Export Mesh As...」を使います。

Qtのサブクラスを作ったらundefined symbol が出るときは

Cannot load library /.../lib***.so: (/.../lib***.so: undefined symbol: _ZTVN5***10***E)

undefined symbol が出るときでありがちなのがサブクラス側に実装もれがある場合で、ソースコードをにらんでうんうん悩んだりしたけど、そもそも何がないといわれているのかがわからなければ話にならない。
そこでまずやるべきは nm である。そして、nm --demangle である。
そこで分かるのは、足りないのは vtable であるということ。
つまりメソッドの実装漏れじゃあない。

Qt のサブクラスに vtable が足りないというのはどういうことか。
Qtをはじめよう! にはっきり書いてある。
http://labs.qt.nokia.co.jp/2010/07/07/subclassing-qobject.html
moc を使っていないということだ。

そこでどうするか、は以下に全部書いてあった。
http://d.hatena.ne.jp/opamp_sando/20110423
必要な箇所だけ抜き出すと、

# Qt4のパッケージを使う
find_package(Qt4 4.8.1 REQUIRED)
# QtサブクラスのヘッダをQT4用にラップする
set(qt_headers ***.h)
qt4_wrap_cpp(moc_headers ${qt_headers})
# Qt 関係の設定
add_definitions(${QT_DEFINITIONS})
include(${QT_USE_FILE})
# ターゲットの設定
add_executable(${target} ${sources} ${moc_headers} )
target_link_libraries(${target} ${QT_LIBRARIES})

これによりメタオブジェクトコード moc_***.cxx が生成され、undefined symbolが解決される。

あと一つつけ加えると、connect で実行したいメソッドは単なる private メソッドで宣言してはだめで、

private Q_SLOTS:

として宣言する。

以上、Qt初心者の反省でした。

OpenNI を Mac OSX Lion にインストールするために

http://www.cyber.t.u-tokyo.ac.jp/~take/blog/kinect/install-openni-with-homebrew.htmlhttps://github.com/totakke/openni-formula の通りなのですが、いくつかハマったことをメモ。

libtool

libtool は brew で普通に入る。

 % brew install libtool

libusb-devel は freenect で代用

 % brew install libusb-devel +universal

これがうまくいかなかったので、libusb-freenect を使用することにした。
まずHomebrew のフォーミュラを入手する。

 % cd /usr/local/Library/Formula
 % curl --insecure -O "https://raw.github.com/OpenKinect/libfreenect/master/platform/osx/homebrew/libfreenect.rb"
 % curl --insecure -O "https://raw.github.com/OpenKinect/libfreenect/master/platform/osx/homebrew/libusb-freenect.rb"

libfreenect を brew で入れる。

 % brew install libfreenect

doxygen

 % brew install doxygen

なぜかこれが失敗した。

 % brew update

これもうまくいかない。
エラーの原因、/usr/local/Library/Formula/voldemort.rb を削除すると通った。まさに諸悪の根源。

 % drew update
 % brew install doxygen
 % brew install graphviz

あとは先の手順通り、インストール作業を行えた。

JRuby から Java インスタンスのフィールドにアクセスするには

JRubyjava_class メソッドと declared_method を使って、Javaインスタンス jobj のフィールド field1 にアクセスします。

field1 = jobj.java_class.declared_field("field1")
field1.set_value jobj, value.to_java

これで良いはず。はずというのは、今回 JRuby のメソッドをこの方法で SimpleOpenNI のコールバックメソッドに登録しようとして、set_value の段になってJRubyで定義したメソッドを Java の Method インスタンスに変換する方法が存在しないことに気がついたですよ……orz

参考: JRubyでJavaのクラスをいじり倒す。 - red5server @ ウィキ - アットウィキ

Mac OSX Lion で SimpleOpenNi をビルドする

SimpleOpenNI のソースには OSX用のビルドスクリプト buildOsx.sh が付属するが、Lion に対応してないのかなかなかの難物。

OpenNI をインストール

こちらを参考に。
OpenNIをHomebrewでインストール http://www.cyber.t.u-tokyo.ac.jp/~take/blog/kinect/install-openni-with-homebrew.html

依存パッケージをインストールする

Homebrew で eigen, swig, boost をインストールする。
ただし、単純に brew install xx...ではすまない。

eigen のインストール

eigen のインストールに失敗する場合は、gfortran をインストールしてから再度インストールする。

% brew install gfortran
% brew install eigen 
boost のインストール

SimpleOpenNI は libboost_thread-mt の i386 バイナリを利用するため、--universal オプションを追加すること。

% brew install boost --universal

通常のビルドに比べるとやたら時間がかかる。

swig のダウングレード

swigのバージョンが 2.0.7 だとスクリプトが Segmentation fault を起こして中断してしまう。
そこで、swig が入っている場合一度削除して再インストールする。

% brew unlilnk swig

brew で旧バージョンのswig をインストールするためには、versions コマンドを使う。

% brew versions swig
2.0.6    git checkout 9966773 /usr/local/Library/Formula/swig.rb
2.0.4    git checkout 0d8d92b /usr/local/Library/Formula/swig.rb
fatal: Not a valid object name f5779b8:Library/Formula/swig.rb

ずらずらと出るメッセージは、Homebrew が対応しているバージョンと、そのバージョンを利用するためのコマンドの一覧である。
ここでは2.0.6 にダウングレードする。

% git checkout 9966773 /usr/local/Library/Formula/swig.rb
% brew install swig

CMakeLists.txt の修正

boost_thread.a を使う設定になっているが、これを boost_thread-mt.a に修正する。

===================================================================
--- CMakeLists.txt	(revision 426)
+++ CMakeLists.txt	(working copy)
@@ -67,7 +67,7 @@
   
 	IF(APPLE)
 		# osx
-		set(Boost_LIBRARIES  "boost_thread.a")
+		set(Boost_LIBRARIES  "boost_thread-mt.a")
 	ELSEIF(UNIX)
 		# unix/linux,shared libs of boost should be installed
 		set(Boost_LIBRARIES  "boost_thread.a")

buildOsx.sh の修正

OPEN_NI_INCLUDE と XN_NITE_INCLUDE は、/usr/local/include にある。

===================================================================
--- buildOsx.sh	(revision 426)
+++ buildOsx.sh	(working copy)
@@ -30,9 +30,9 @@
 
 echo "--- generate cmake ---"
 cmake -DCMAKE_BUILD_TYPE=Release \
-	  -DOPEN_NI_INCLUDE=/usr/include/ni/ \
+	  -DOPEN_NI_INCLUDE=/usr/local/include/ \
 	  -DOPEN_NI_LIB=/usr/lib/ \
-	  -DXN_NITE_INCLUDE=/usr/include/nite/ \
+	  -DXN_NITE_INCLUDE=/usr/local/include/ \
 	  -DXN_NITE_LIB=/usr/lib/ \
 	  -DEIGEN3D_INCLUDE=/usr/local/include/eigen3/ \
 	  -DP5_JAR=/Applications/Processing.app/Contents/Resources/Java/core.jar \

スクリプトを実行する

ここまで来てやっとビルドスクリプトが動きます。

% ./buildOsx.sh

山ほどwarningが出るが無視無視無視。

% ./installOsx.sh

インストールスクリプトが何事もなく動くありがたさを噛み締めましょう。

~/Documents/Processing/libraries/SimpleOpenNI 下に SimpleOpenNI がインストールされます。

Processing でexamples を開いて試してみましょう。