2008年6月25日水曜日
64-bit Mac OSXではSWTがサポートされていないんだね、、、
2008年6月3日火曜日
NyARToolkit Eclipse Plugin 更新
http://www.ylab.ai.kyutech.ac.jp/~shiva/nativecapable/update
2008年5月27日火曜日
Appletからネイティブライブラリをロードする(リフレクション編)
URL url = NativeLoadTest.class.getResource("jogl_awt.dll");まだAppletでは試していませんが、これならかなり簡単。
File file = new File(url.toURI());
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Field f = ClassLoader.class.getDeclaredField("usr_paths");
f.setAccessible(true);
String[] paths = (String[]) f.get(cl);
String[] paths2 = new String[paths.length + 1];
System.arraycopy(paths, 0, paths2, 0, paths.length);
paths2[paths2.length - 1] = file.getParentFile().getAbsolutePath();
f.set(cl, paths2);
f.setAccessible(false);
System.loadLibrary("jogl_awt");
2008年5月21日水曜日
2008年5月20日火曜日
NyARToolkit on Google Android 更新と公開
2008年5月8日木曜日
テキストフィールド等で入力補完を使う
テキストフィールドやリストなどで入力補完を行う方法は見つけ難かったのでメモ。
Text text = ....
IControlContentAdapter contentAdapter = new TextContentAdapter();
IContentProposalProvider provider = new IContentProposalProvider() {
public IContentProposal[] getProposals(String contents, int position) {
IContentProposal[] icps = ....
}
}
ContentAssistCommandAdapter ca = new ContentAssistCommandAdapter(
text, contentAdapter, provider, null, new char[] {}, true);
解ってしまえば非常に簡単。
NyARToolkit Eclipse Plugin 更新 ~ エクスポート機能
NyARToolkitに限らず、NativeなApplet(及びデスクトップアプリ)を開発する環境に方向が変わってきつつあります。
名前をNativeCapableプラグインに変更しました。
Native Capable Eclipse Plugin
ダウンロードしてpluginsフォルダに配置してください。
Eclipseプロジェクトを圧縮したものは以下からダウンロードできます。
Eclipse Project
小さな変更点:
Windows以外のプラットフォームでも利用できるようにネイティブライブラリの配備を変更
(手元に他の環境がないため、Windows以外のライブラリは同封されていません)
大きな機能追加:
NativeCapableModuleを実装したクラスからAppletとアプリケーションを自動生成するExportウィザードを追加しました。
作業中のプロジェクトで
PackageExplorer->右クリックメニュー->Export(エクスポート)
を選びます。
Module: 対象となるNativeCapableModule実装クラスを指定
Create: 生成物を指定
Targets: 対象クラスの設定
Strategy: 対象クラスのロード方法を指定
-Delegate Targets: 対象クラス以外をNativeCapableローダでロード
-Load Targets:対象クラスをNativeCapableローダでロード
次回目標:
Antファイルの自動生成、自動実行でApplet及びJWSとしてデプロイ可能な状態にするExport機能の実装!!
2008年4月27日日曜日
Native library loading framework for Applet (Native Capable)
2008年4月23日水曜日
NyARToolkit on Google Android!!
ものすっごい、お馬鹿なミスで5日ぐらい悩まされましたが。。。
移植自体は非常にスムーズに、行きました。
OpenGL ESがdoubleが扱えなかったので、一部floatで取得する関数などを追加しましたが、NyARToolkit自体はほとんどいじらずに動きました。
これは一重にA虎@さんがシンプルにJavaで記述してくださった結果です。いやー、ありがたい!
とりあえず以下に画像をば。
キャプチャ部分は、JMFを使って書いたJavaサーバアプリにAndroidからソケット接続し画像を取得しています。
Live Camera Previews in Android
こちらを参考にさせていただきました。
ただし、エミュレータでは1つのアプリケーションが使えるメモリが最大16M程度であるらしく、
320*240*3の配列をコピーするのに4秒近く、マーカの認識に7秒かかってしまいます。
結果、一枚の画像がかかれるまでに10数秒です。とても使い物になりません。
(時々なぜか速くなって7秒台がでますが、、、)
2008年4月20日日曜日
限定じゃんけんα!
(既に世の中にあるかもしれませんが、、、)
基本はジャンケン(グー、チョキ、パーのあれ)です。
そこに次のようなルールをつけます。
- プレイヤーは1対1で対戦
- 6ゲーム(あいこも一回とカウントしジャンケン6回)を1セットとし、4セット(計24ゲーム)行う
- グーで勝つと+5ポイント
- チョキ、パーで勝つと+2ポイント
- あいこの場合、負けているプレイヤーが+1ポイント(同点の場合はポイントなし)
- 6ゲーム目であいこの場合は勝敗がつくまで延長(両者のポイントが並んだ時点でセット終了)
- どちらかのプレイヤーが手を出さなかった場合手を出さなかったプレイヤーは無条件にチョキで負けたとし、勝ったプレイヤーが5ポイント獲得
(補足ルール - 当事者間で変更しても大丈夫です)
- ジャンケンは基本的にお互いが手を決めてから行うものとする
- 掛け声は「最初はグー、ジャンケンポン」が好ましい
- どちらが掛け声を発してもいいですが、手が決まっていない場合は即座に「待って」と声をかける事で静止できるものとする
- 「待って」は「最初はグー」を言い終わるまでに言わなければならない
- 掛け声が始まってから「最初はグー」以前に「待って」が言われなかった場合ゲームは開始されたものとみなし、必ず双方ともに手を出さなければならない
(片方が手を出さなかった場合は上記ルールを適用) - 紳士的にプレーすること
これだけでは解りにくいと思うので次に例を示します。
1セット目
ゲーム数 | プレイヤA | プレイヤB | 勝敗 | A獲得ポイント | B獲得ポイント | 解説 |
---|---|---|---|---|---|---|
1 | パー | パー | あいこ | 0 | 0 | |
2 | パー | パー | あいこ | 0 | 0 | |
3 | パー | チョキ | B勝ち | 0 | 2 | |
4 | グー | グー | あいこ | 1 | 2 | 負けているAに+1 |
5 | パー | グー | A勝ち | 3 | 2 | |
6 | パー | グー | A勝ち | 5 | 2 | セット終了 |
1セット目結果:A-5ポイント、B-2ポイント
2セット目
ゲーム数 | プレイヤA | プレイヤB | 勝敗 | A獲得ポイント | B獲得ポイント | 解説 |
---|---|---|---|---|---|---|
1 | パー | パー | あいこ | 0 | 0 | |
2 | グー | チョキ | A勝ち | 5 | 0 | |
3 | パー | チョキ | B勝ち | 5 | 2 | |
4 | グー | グー | あいこ | 5 | 3 | 負けているBに+1 |
5 | パー | グー | A勝ち | 7 | 3 | |
6 | パー | パー | あいこ | 7 | 4 | あいこなので延長 |
7(延長1) | パー | パー | あいこ | 7 | 5 | あいこなので延長 |
8(延長2) | チョキ | グー | B勝ち | 7 | 10 | セット終了 |
2セット目結果:A-7ポイント、B-10ポイント
3セット目
ゲーム数 | プレイヤA | プレイヤB | 勝敗 | A獲得ポイント | B獲得ポイント | 解説 |
---|---|---|---|---|---|---|
1 | パー | パー | あいこ | 0 | 0 | |
2 | パー | パー | あいこ | 0 | 0 | |
3 | パー | パー | あいこ | 0 | 0 | |
4 | パー | グー | A勝ち | 2 | 0 | |
5 | パー | パー | あいこ | 2 | 1 | 負けているBに+1 |
6 | パー | パー | あいこ | 2 | 2 | 同点でセット終了 |
3セット目結果:A-2ポイント、B-2ポイント
4セット目
ゲーム数 | プレイヤA | プレイヤB | 勝敗 | A獲得ポイント | B獲得ポイント | 解説 |
---|---|---|---|---|---|---|
1 | パー | パー | あいこ | 0 | 0 | |
2 | パー | パー | あいこ | 0 | 0 | |
3 | パー | チョキ | B勝ち | 0 | 2 | |
4 | グー | パー | B勝ち | 0 | 4 | |
5 | グー | グー | あいこ | 1 | 4 | 負けているAに+1 |
6 | パー | グー | A勝ち | 3 | 4 | セット終了 |
4セット目結果:A-3ポイント、B-5ポイント
最終結果:A-17ポイント、B-19ポイントでBの勝ち
実際やってみると心理の読みあいがかなりエキサイティングです。
また、1回戦ではパーが常套手段となるなど考えどころも多くあると思います。
(心理)
チョキで負けた場合いきなり5ポイント差がつくから1回戦のチョキはかなり勇気がいる、、、
チョキはほぼ無いと考えれば、パーかグー、、、
パーなら最悪あいこスタート、、、ざわざわ、、、
ってな具合に。
もし遊んでみた方おられましたら、感想や攻略法なんか書き込んでもらえたら嬉しいです!!
では、エンジョイ限定ジャンケンα!!
(Eカード概要)
2人で行うゲームです。
皇帝、奴隷、市民という三つのカードをそれぞれ次のように配り
皇帝側プレイヤーには皇帝×1、市民×4
奴隷側プレイヤーは奴隷×1、市民×4
3ゲーム1セットで皇帝奴隷を入れ替えて合計4セット行うことで勝敗を決めるゲームです。
皇帝は市民に勝ち、市民は奴隷に勝ちます。ただし、皇帝は奴隷に負けます。
1ゲーム5回戦で、それぞれ一枚ずつ手持ちのカードから選んで対戦を行います。
皇帝側プレイヤーが勝つと1ポイント、奴隷側プレイヤーが勝つと5ポイント獲得です。
相手がどのタイミングで、皇帝を通してくるか、また奴隷で皇帝をうちに来るかを探り合う心理ゲームです。
2008年4月17日木曜日
メタセコローダなARなのJWSとApplet
(ご本人からの依頼ありです。なくてもやったかもしれませんが、、、笑)
Webサーバーにあるメタセコイアデータを表示するARプログラムです。 インターネットとARToolkitの連携をコンセプトにした試作品です。
とのことです。相変わらず面白いこと考えるな~と、関心しきり。
オリジナルはこちら
NyARMqoViewer
JWS版
http://www.ylab.ai.kyutech.ac.jp/~shiva/jws/nyartoolkit/mqoloader.jnlp
Applet版
http://www.ylab.ai.kyutech.ac.jp/~shiva/applet/nyartoolkit/mqoloader.htm
マーカーPDFファイル
http://www.ylab.ai.kyutech.ac.jp/~shiva/jws/nyartoolkit/sample/pattHiro.pdf
サンプルURL
起動後の画面に上記URLを入れてConnectをクリックすると、サンプルを試してみることが出来ます。
3Dデータは三次元CG@七葉さんからnh0072.zipをお借りしました。
(追記)
3Dモデルの位置がずれていたようです。
A虎@さんが正しく設定されたものを公開してくださいましたので、こちらをお使いください。
http://nyatla.jp/nyartoolkit/app/NyARMqoViewerAPP/sample/sample.xml
個人発行の証明書なので警告が出ますが、めげずに実行してやってくださいm(_ _)m
ちなみに、設定XMLファイルは次のような形式で記述します。
(A虎@さんのWikiからダウンロードできるソースコード中に詳しい定義が書かれています)
オリジナルのものは、絶対パス(http://やfile:///ではじまる)指定でしたが、
改造して(設定XMLファイルからの)相対パス指定を可能にしてあります。
(絶対パスも使えます。 jar:とかも使えるはず、、、です)
また、mqoファイルをZIPファイルから読み込めるようにも拡張してあります。
2つ以上mqoが入っている場合は先に見つかったほうが選ばれます)
直接mqoファイルを指定することも出来ます。
<?xml version="1.0"?>
<root>
<version>NyARMqoViewer/0.1</version>
<config>
<ar_code>
<url>patt.hiro</url>
<size>80.0</size>
</ar_code>
<ar_param>
<url>camera_para.dat</url>
<screen>
<x>640</x>
<y>480</y>
</screen>
</ar_param>
<frame_rate>15.0</frame_rate>
</config>
<content>
<scale>0.2</scale>
<comment>TEST
<mqo_file>nh0072.zip
</content>
</root>
動作報告とかいただけたら嬉しいです^^
2008年4月8日火曜日
NyARToolkit Eclipse Plugin 開発スタート
「手軽にNyARToolkitでの開発、公開ができる環境づくり」がコンセプトです。
需要あるのか解りませんが、概ね自己満足で(笑)
とりあえず、プロジェクトを作るとライブラリを自動的に設定して、ソース、出力フォルダを生成するところまでを実装してみました。
NyARToolkit Eclipse Plugin
ダウンロードしてpluginsフォルダに配置してください。
Windows XP, Eclipse3.3, JRE 1.6.0_05 でのみ動作を確認しています。
Eclipseを日本語化しないで使っているので日本語版での動作方法は想像で書きます。
英語版:
1.Package Explorer で右クリック
2.New->Project...
日本語版:
1.パッケージ・エクスプローラ で右クリック
2.新規->プロジェクト...
後は共通です。
3.NyARToolkit Project Wizard -> NyARToolkit Project Wizard を選択後 Next(次へ)
4.Project Nameを適当に入力して Finish(完了)
これで、NyARToolkitでの開発に必要なライブラリが設定されたJava プロジェクトが生成されます。
現時点では、ライブラリとしてJMF, JOGL及びJavassistが入っています(ネイティブも含む)
WebStartやAppletとしてエクスポート的な機能をつけようと思っているのですが、中々難しい。。。
Javaプロジェクトを作る
ライブラリをコピーしたりする部分も含まれているが、、、きにしな~い。
private void doFinish(final String projectName, String srcFolderName,
String binFolderName, String libFolderName,
final IProgressMonitor monitor) throws CoreException {
// プロジェクトを作成
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = root.getProject(projectName);
project.create(monitor);
project.open(monitor);
// Java Nature をプロジェクトに追加
IProjectDescription description = project.getDescription();
String[] natures = description.getNatureIds();
String[] newNatures = new String[natures.length + 1];
System.arraycopy(natures, 0, newNatures, 0, natures.length);
newNatures[natures.length] = JavaCore.NATURE_ID;
description.setNatureIds(newNatures);
project.setDescription(description, monitor);
// Java プロジェクトを作成
final IJavaProject javaProject = JavaCore.create(project);
Setentries = new HashSet ();
// Adding source path
IPath sourcePath = javaProject.getPath().append(srcFolderName);
//ソースフォルダを作成
IFolder sourceDir = project.getFolder(new Path(srcFolderName));
if (!sourceDir.exists()) {
sourceDir.create(false, true, null);
}
// 出力先フォルダを作成
IPath outputPath = javaProject.getPath().append(binFolderName);
IFolder outputDir = project.getFolder(new Path(binFolderName));
if (!outputDir.exists()) {
outputDir.create(false, true, null);
}
// ソースフォルダ、出力フォルダを設定
IClasspathEntry srcEntry = JavaCore.newSourceEntry(sourcePath,
new IPath[] {}, outputPath);
entries.add(srcEntry);
// ライブラリ を追加
final IPath libPath = javaProject.getPath().append(libFolderName);
final IFolder libDir = project.getFolder(new Path(libFolderName));
if (!libDir.exists()) {
libDir.create(false, true, null);
}
final IPath conNativePath = javaProject.getPath().append(
libFolderName + "/native");
IFolder conNativeDir = project.getFolder(new Path(libFolderName
+ "/native"));
if (!conNativeDir.exists()) {
conNativeDir.create(false, true, null);
}
// ライブラリをコピー
String[] jars = new String[] { "gluegen-rt.jar", "jmf.jar", "jogl.jar",
"javassist.jar", "NyARToolKit.jar" };
for (String string : jars) {
InputStream is = getClass().getResourceAsStream(
"/resources/lib/" + string);
IFile f = libDir.getFile(string);
f.create(is, true, null);
}
String[] libs = new String[] { "gluegen-rt.dll", "jmacm.dll",
"jmam.dll", "jmcvid.dll", "jmdaud.dll", "jmdaudc.dll",
"jmddraw.dll", "jmfjawt.dll", "jmg723.dll", "jmgdi.dll",
"jmgsm.dll", "jmh261.dll", "jmh263enc.dll", "jmjpeg.dll",
"jmmci.dll", "jmmpa.dll", "jmmpegv.dll", "jmutil.dll",
"jmvcm.dll", "jmvfw.dll", "jmvh263.dll", "jogl_awt.dll",
"jogl_cg.dll", "jogl.dll", "jsound.dll" };
for (String string : libs) {
InputStream is = getClass().getResourceAsStream(
"/resources/native/" + string);
IFile f = conNativeDir.getFile(string);
f.create(is, true, null);
}
IClasspathContainer libContainer = new IClasspathContainer() {
public IClasspathEntry[] getClasspathEntries() {
System.out.println("get!");
Listices = new ArrayList ();
try {
IResource[] rs = libDir.members();
for (IResource r : rs) {
if (r instanceof IFile) {
IFile f = (IFile) r;
System.out.println("\t" + f);
IClasspathEntry entry = JavaCore.newLibraryEntry(f
.getFullPath(), null, null, false);
ices.add(entry);
}
}
} catch (CoreException e) {
e.printStackTrace();
}
return ices.toArray(new IClasspathEntry[ices.size()]);
}
public String getDescription() {
return "Application library container";
}
public int getKind() {
return IClasspathContainer.K_APPLICATION;
}
public IPath getPath() {
return libPath;
}
};
JavaCore.setClasspathContainer(libPath,
new IJavaProject[] { javaProject }, // value for 'myProject'
new IClasspathContainer[] { libContainer }, null);
// no source, no source, not exported
IClasspathEntry libEntry = JavaCore.newContainerEntry(libPath, null,
new IClasspathAttribute[] { JavaCore.newClasspathAttribute(
JavaRuntime.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY,
conNativePath.toString().substring(1)) }, false);
entries.add(libEntry);
// デフォルトJREを追加
entries.add(JavaRuntime.getDefaultJREContainerEntry());
javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[entries
.size()]), monitor);
monitor.worked(1);
}
2008年4月3日木曜日
NyARToolkitをJWSとAppletにする!
JavaWebStart化、及びJava Applet化してみました。
NyARToolkitのページ
http://nyatla.jp/nyartoolkit/wiki/index.php
JWSサンプル
http://www.ylab.ai.kyutech.ac.jp/~shiva/jws/nyartoolkit/simplelite.jnlp
Java Applet サンプル
http://www.ylab.ai.kyutech.ac.jp/~shiva/applet/nyartoolkit/index.htm
マーカー用PDF(NyARToolkitに同封されているものです)
http://www.ylab.ai.kyutech.ac.jp/~shiva/jws/nyartoolkit/pattHiro.pdf
ビデオキャプチャデバイスを接続した状態で起動してください。
デバイス探索に2,3分かかる場合があります。
証明書が個人で発行したものであるため、警告が出ますが無視してください。
JMFインストール済みでない環境での動作が確認されていないので、
動いた!!という方、報告いただけると嬉しいです^^
2008年3月30日日曜日
JMF を Java Web Startから扱う
Java Media Framework(JMF)を使ってJava Web Startからクライアントのカメラデバイスを通じて動画のキャプチャなどを行うとした場合、セキュリティとデバイスの問題がある。
1つの方法としてクライアント側でJMFを事前にインストールしてセキュリティの設定をJMFRegistryを用いて行う方法があるが、いつの時代もインストールは面倒なものだし、JWS使う利点が無くなってしまう。
ということで、色々調べた結果、次のような方法が見つかった。
後に書く方法でデバイスを見つけるとjmf.propertiesに書き込みに行くが、JWSでの実行時にはセキュリティマネージャが次のような例外を出す。
"Exception on commit = java.lang.SecurityException: commit: Permission denied"
jarファイルを署名し、JNLPファイルで<all-permissions/>を設定しても無関係に発生する。
仕方がないので原因を探りにソースコードを覗くと、JMFにはJMFSecurityManagerというやつがいて、Registry#commitなどの際に書き込み権限のチェックなどをやっているらしい。
結果として、JMFSecurityManagerを無効化することは無理のようだが、
System.setSecurityManger(null);
とすることでJWSではJMFSecurityMangerを生成させずにおくことが出来た。
一度でも、JMFSecurityManagerが生成されてしまったら無効化する方法はないようだ。
続いて、デバイスの探索だが、これはJMFRegistryのソースコードから該当部分を拝借した以下のコードで実現できる。
// Check if VFWAuto or SunVideoAuto is available
Class directAudio = null;
Class autoAudio = null;
Class autoVideo = null;
Class autoVideoPlus = null;
try {
directAudio = Class.forName("DirectSoundAuto");
} catch (Exception e) {
}
try {
autoAudio = Class.forName("JavaSoundAuto");
} catch (Exception e) {
}
try {
autoVideo = Class.forName("VFWAuto");
} catch (Exception e) {
}
if (autoVideo == null) {
try {
autoVideo = Class.forName("SunVideoAuto");
} catch (Exception ee) {
}
try {
autoVideoPlus = Class.forName("SunVideoPlusAuto");
} catch (Exception ee) {
}
}
if (autoVideo == null) {
try {
autoVideo = Class.forName("V4LAuto");
} catch (Exception eee) {
}
}
if (directAudio == null && autoAudio == null && autoVideo == null
&& autoVideoPlus == null)
return;
try {
if (directAudio != null) {
directAudio.newInstance();
}
if (autoAudio != null) {
autoAudio.newInstance();
}
if (autoVideo != null) {
autoVideo.newInstance();
}
if (autoVideoPlus != null) {
autoVideoPlus.newInstance();
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
2008年3月20日木曜日
SSHサーバをFTP経由でつかう
で、FTPにも対応してるんだけど、残念ながらSSH(SFTP)は使えない。
サーバ側にFTPが上がってるならSSHでトンネルしてやればいいことだが、
(たぶん)セキュリティ的な問題で大学のサーバではFTPが動いてない(っぽい)
確認しろよ俺!!ん?
http://www.bitvise.com/ftp-bridge
しかも個人使用に関してはフリー。
ってことで、以下に手順を記録。
1. DownloadからTunnelier installerを落としてきてインストール
2. 接続設定
起動画面
Host, Port, Username, Initial Method等を設定して
左下部のLoginで接続
3. ServiceタブからFTP-toSFTP Bridgeを有効化
Enabledにチェック
Listen Portは任意に設定
これで完了。
Loginをクリックした際に出てくるログの最後のほうに次のような一文があれば成功。
Initializing FTP-to-SFTP bridge on 127.0.0.1:10021 succeeded.
後は localhostに対して通常のFTP接続が可能、と。
プラグインにDLLを含める方法
プラグインルートに置けばいいらしい。
dll中で他のdllを指定している場合はJVMが見つけられなくなるので
正しい順序でSystem.loadLibrary("something.dll")を明示的に行う必要がある。
http://dev.eclipse.org/newslists/news.eclipse.platform/msg50613.html
公式な情報どこかにないかな?