2014/04/21 STAFF BLOG

 パノラマ再生エンジンのデファクトスタンダードとして、世界的にシェアの高いKRPanoですが、その大きな特徴の一つとして、スクリプティングを前提としていることが挙げられます。プログラミングに馴染みのないユーザには敷居が高く感じられる特徴でもあるのですが、一方でこのスクリプティングの自由度の高さのおかげで、パノラマコンテンツに多くの可能性を与えることができています。
 さて、このKRPanoスクリプトですが、実はプログラマーにとっても難物です。基本的にはパノラマVRを定義するための設定スクリプトが発展してきたという経緯があるため、プログラミング言語としては、なかなかクセのある仕様になっているのです。例えば

  • インタプリタが変数とリテラルを区別できない
  • 変数・関数のスコープは全てグローバル

などの特徴があります。一つ目の件ですが、具体的には変数にリテラルを代入する場合と、変数の値を代入する場合で異なる命令を使う必要があります。

<!-- 変数にリテラルをセットする -->
set( valA, 123 );

<!-- 変数に変数の値をセットする -->
copy( valB, valA );

オペレータイコールで代入という便利な仕様はないので、変数操作時には都度setだのcopyだの書かなければなりません。(なんとなくアセンブラを思い出す作りです)これは関数の引数として変数の値を渡したい場合も同様で、以下のように記述しなければなりません。

<!-- 関数hogeの引数としてvalAの値を渡す -->
hoge( get( valA ) );

普通のプログラムの感覚だとつい「hoge( valA );」と書いてしまうのですが、これだとリテラルで「valA」という文字列が渡るので値を取得することができません。私自身もこの仕様には何度もハマってしまい「あれー、ちゃんと渡してるのにおっかしいなあ。」という事が何度かあります。ただ、考えてみるとそもそも変数が全てグローバルなので、引数で変数の値を渡す意味はないのかもしれません。

こう書くと不自由な言語のように見えますが、KRPanoにはひとつ非常に面白い特徴があります。それはマニュアルに記載されているタグ以外にユーザー定義のタグを使うことができる点です。KRPanoの構文は基本的にはxmlになっているのですが、スクリプト上から任意のxml要素にDOM的にアクセスすることができます。

<!-- KRPano User Defined Tag Test -->
<krpano version="1.16" onstart="startup();">

	<!-- 独自定義のタグ -->
	<userdata attribute1="123" />
	
	<action name="startup">
		showlog();
		<!-- 独自定義のタグからデータを読み込む -->
		trace( 'attribute1:', userdata.attribute1 );
	</action>

</krpano>

このコードで定義されている<userdata>というタグは、KRPanoで用意されているタグではなく独自に定義したものです。このタグに記述されている情報に、スクリプトからアクセスすることができます。

fig01
コードの実行例。読み取った値をトレース出力している。

上記のように独自のXmlタグを定義することで、各種情報を自由にスクリプト上に配置することができます。さらに、参照ばかりでなく変更、ノードの追加についても、スクリプトから動的に実行することができます。このKRPanoが備えているDOMアクセス機能は非常に強力で、KRPanoに標準添付されるバーチャルツアーエディタやKolor社のPanoTourProなどでも、ツアー情報など内部的な情報を独自タグの形で展開して保存しています。弊社PanoCreatorのツアーエディタでは独自タグのデータ構造をJavaScriptを使ってサーバに送信し、ツアーデータを保存しています。

このDOMアクセス機能を駆使するとかなり高度なことができるのですが、どういうわけか公式マニュアルには特に記載されていません。