Dim3 チュートリアル

(対応バージョンは Version 2.2 , スクリーンショットは一部β版時点のものが含まれています。 2007年8月現在)

Dim3概要 [》 続きを読む]
Dimension3 (Dim3)はオープンソース開発による3Dエンジンです。(日本語文字は使えません)。
UnityやTorqueのような市販のゲームエンジンのように高機能ではないですが。
自分の作った3Dデータをただ眺めるだけではなく、3D空間上で、自由に動かしたりできるという魅力があります。

dim3のパッケージには、サーバとエンジンはMacOSX版とWindowsXP版が用意されています。
設定データはテキストファイルになっているので、JavascriptスクリプトやHTMLタグを書くようにテキストエディタを使って編集することができます。
ただし、エンジンの開発環境(マップエディタと3Dアニメータ)はMacOSX版しかありません。配布する場合はEngineとDataだけが必要です。

◆内容
◆いくつかの特徴
◆普通の人向け紹介 ◆プログラマ向けの紹介
[注意事項]
・ フォントはビットマップテクスチャのみです。日本語入力や表示機能はありません。英数字ONLYです。
・バージョンアップなどにより、仕様が変わることがあります。
・dim3付属デモに付いてくるデータ素材は原作者がいるため、スクリプト以外のデータ(モデル/テクスチャ/効果 音)は流用しないで下さい。スクリプトのみ流用OKだそうです。
・dim3はユーザーのホームの「書類」フォルダに、ユーザー用のフォルダを作成します。 その中にセーブデータやスクリーンショット、環境設定が作成されます。
・モデルデータのプロテクト(暗号化)機能は無いそうです。
・Data フォルダは、dim3 Engineと同じ階層にあります。以下この文書内で「Data/.... 」とフォルダ名を指す場合はこの階層を起点として考えて下さい。
・また、フォルダ名やモデル名、MAP名などには、日本語は使えません。


付属デモで遊ぶ [》 続きを読む]
付属デモをプレイする時の操作方法。キーボードとマウスを使います。

第1部 基本的な制作工程


環境構築/素材の準備 [》 続きを読む]
まず、テクスチャ素材、OBJ形式の3Dモデルを準備します。テクスチャのサイズや画像形式に関する話。
はじめは、Dim3に付属のデモマップにファイルを追加して、結果を試すのが一番簡単です。

使うテクスチャを用意して、入れる。

MAPに張付けるためのテクスチャは、みんな下記のフォルダに入れます。
Data/Bitmaps/Textures
【サンプルデータ】
解凍フォルダ内のテクスチャファイルを Data/Bitmaps/Texturesフォルダへ入れて下さい。
  • ダウンロードする: サンプルテクスチャ  
  • このテクスチャをData/Bitmaps/Textures フォルダへ全部入れて下さい。 これで準備が整いました。


    ★制作前のひと工夫
    dim3 Editorでは、編集中のマップやモデルに対応するスクリプトを直接開くことができます。それには外部テキストエディタとスクリプトファイルを関連づけておく必要があります。

    やり方は、Finderでdim3フォルダ内の、 Data/Scripts/以下にある各スクリプト(.js)をすべて選択。 次に、Finderメニューバーからファイル>情報を見る」で開き、「このアプリケーションで開く」で好きなテキストエディタに関連づけて下さい


    ■どんな素材が必要か?
    • モデル[3D]: 背景物、武器、弾、キャラクター
    • テクスチャ[2D]: 壁、床、空、天井に貼るもの。
    • テクスチャ[2D]: ボタン、アイコン等
    • テクスチャ[2D]: 爆発パターン(パーティクル )
    ポスターやじゅうたんなど、平面的な背景物は、モデルではなく、マップのアンビエント要素として壁や床に貼るテクスチャと同じ扱いにします。

    [テクスチャサイズと画像形式] 》 続きを読む

    自分で テクスチャを作る時の注意。テクスチャは、壁、床、空、爆発バターン、フォント、ボタン 、アイコン、タイトル背景など、あらゆるものすべてがこの条件にあてはまります。

    ■どこにファイルを入れるか?
    マップ用のテクスチャや、 ボタンはData/Bitmaps以下のそれぞれ定められたフォルダに入れる必要があります。 「ファイル構成」を参考にして下さい。


    ■フリーのテクスチャ素材を利用する方法もあります。
    ↓Blender用のCD(パブリックドメイン)
    Blender Texture CD

    [自分で3Dモデルを作成する場合] 》 続きを読む
    アニメータの使い方も参照。

    [ファイル構成] 》 続きを読む
    Data フォルダ内にあるフォルダや、ファイルの詳細

    アニメータでモデルを読込む [》 続きを読む]
    Animatorを使い3Dデータを「モデル」として読込みます。これは後でマップに関連付けます。(3Dアニメーション作成は第2部で)

    モデルについて

    モデルは、木や石のような背景物や、キャラクターに用いられます。
    【サンプルデータ】(dim3形式変換済み・アニメーション設定済)

  • サンプルデータ(フォルダ名:Sample1)
    ポリゴンに1枚のテクスチャを貼った例
  • サンプルデータ (フォルダ名:Sample2)
    3Dモデル例

    サンプルデータが入ったフォルダごと Data/Models/フォルダへ入れます。
  •  Animatorは、 OBJ形式の3Dモデルを読込んでdim3形式(XML)で使えるようにします。 それらはDim3内の下記のフォルダ内に保存されます。
    Data/Models/
    [自分で3Dモデルを作成する場合] 》 続きを読む
    一般的に、dim3で読込んめる変換可能な3Dモデルの形式は、 WaveFront OBJ形式とLightWave形式です。

  • OBJ形式のデータ

  • テクスチャはPNG形式で書出すように設定しておいて下さい。ただし、PaperMarioのようなビルボード状のキャラクターを作る場合、必ず厚みをもった立体にして下さい(Z-Fightingが発生するため)。
     


    [モデルデータを新規追加するには] 》 続きを読む
     Choose Model ダイアログでキャンセル後、Animatorで File メニューからNew...を選び。モデルを作成しておき 、そこへ  OBJ形式のデータを読込みます。これをメッシュ(Mesh)と呼びます
    [Animator]》 続きを読む
    簡単な概要。もっと詳しい使い方は第2部で説明予定です。
     

    アニメータを起動し、モデルを読込もう

    フローチャート:
    dim3 Animatorを起動して下さい。すると必ず「Open Model ダイアログ」が出ます(右図)。

    既存モデルから選択(サンプルデータから)
    "Data/Model"フォルダに入っているモデル名がリストされています
    サンプルデータを入れた人は、「Sample1」「Sample2」という項目を探し選択して下さい。
      ここでOPENボタンを押せば、選択したModelを読込みます。
    (フローチャートの一番左側のルートを辿ります)
     
    新規モデル作成
    もし、OBJモデルを読込んで、モデルを新規作成するなら Cancel を選択して Choose a Model ダイアログから抜けてください。
    (フローチャートの右側のルートを辿ります)

    File メニューから 「Save..」を選ぶと保存できます(新規作成した場合は、必ず保存しておきましょう)。
    [Animatorのインターフェイス詳細] 》 続きを読む

    マップエディタを使ってマップを作る
    フローチャート | テクスチャを登録 | テクスチャを貼る | MAPにモデルを置く | MAP、モデル、スクリプトの関連づけ

    1-エディタを起動し、MAPを読込もう [》 続きを読む]

    dim3 Editor (マップエディタ、以下エディタと略す)はマップを編集するためのツールです。 Dim3で使うマップは下記の場所に保存されます。
    Data/Maps/
      [フローチャート] 》 続きを読む
    (マップエディタ起動〜テクスチャ登録まで)。
    dim3 Editor を起動します。すると、既存マップを読込むための「Choose MAP ダイアログ」が出てきます。

    ここには"Data/Maps"フォルダに入っているマップ名(=フォルダ名)がリストされています。

    もし、自分でマップを新規作成する場合は、ここでCancel を選んで、Fileメニューから New...を選び、マップに名前(英数字のみ可)を付けて下さい。

    ・File メニューから 「Save..」を選ぶと保存できます。

    ( ポータルは、セグメント(ポリゴン)で出来た部屋や廊下を包む領域です)

    オブジェクトやセグメントをダブルクリックすると、それぞれの詳細設定ができます。 [張りつけたテクスチャの設定] 等を参考に…。

    ★少しだけ便利な使い方
    MAPを新規作成し、必要なテクスチャを登録した直後の何も無い状態で保存します。 この時、 Data/Maps/にはマップファイル(new_map.xml)が、Data/Scripts/Courses/には同名のコーススクリプト(new_map.js)が作られます。

    作成されたコーススクリプトとData/Maps/内の MAPファイルを(new_map_template.xml などの名前で)複製しておきます。
    次回マップを作る時はこの雛形を元にコピーを作り、それぞれファイル名を変えておきます、これでEditor を起動すればChoose MAP リストに、既存マップとして認識されます。このマップには最初のマップと同じテクスチャが登録済みになっているので、テクスチャ登録をしなくても済みます。
    ■マップの編集について
    Editorで、何も無い所からマップを作るには
    • 他の3Dデータを読込む
    • マップを自動生成
    • Editor上で人の手で作成。
     の方法があります。
    単純なマップなら人の手でも作れます。
    おおよそ次のような工程になります。
    • 新規ポータルを使って廊下と部屋を作る。
    • ポータル同士をつなげる。
    • 視点経路(SightPath)で接続
    • 柱などのプリミティブを配置
    • テクスチャなどを張る


    [視点経路(SightPath)について] 》 続きを読む
    今いる場所から、どこの領域を眺める事ができるかの設定
    [Editorインターフェイス詳細]
    工程に応じてviewメニューで編集モードを切替え、 Compass と Angle を使って見やすい視点で制作します。

    2-最初に、MAPに必要なテクスチャだけを登録する [》 続きを読む]

    テクスチャデータ(Texture Settings)に関すること。半透明テクスチャやアニメーション等。

    さっき用意した画像のなかから、このMAPに必要なものだけを登録します。

    【Textureウインドウ】

    テクスチャを変更・登録するには、Textureウインドウの欄をダブルクリックして TextureSettingダイアログを出して行います。
    テクスチャを新規登録する場合は何も無い欄をダブルクリックして下さい(上図)

    【Texture Settings ダイアログ】
    【 Choose a Bitmapダイアログ】

    (1)
    まず、「Add New Frame」 をクリック。 Choose a Bitmap ダイアログが出現。


    (2)
    すると、 一覧が出るので、登録したいものを選択してOK。(Data/Bitmaps/Textures フォルダへ入れておいたテクスチャの一覧です )

    新規Frameが作成され、テクスチャ画像が登録されます(左図)

    [テクスチャ補足1] 》 続きを読む
    透過テクスチャと、半透明テクスチャの話

    [テクスチャアニメーション] 》 続きを読む
    アニメーションするテクスチャについて。


    [MAPを自動作成してみよう] 》 続きを読む
    もっと複雑なMAPを作ったり自動生成する方法も用意されています。

    自動作成が行われると、現在編集中のマップデータに上書きされるので、新規マップ作成直後に自動作成を行うのが一番良いと思われます。


    その前に→MAPに必要なテクスチャだけを登録する
    ( 新規ポータル作成や、自動生成する際に壁、床、天井に使うテクスチャを指定しなければいけません。そのため 先に、マップで使うテクスチャの登録を済ませておくと楽です。 )

    3-テクスチャを張りつけよう [》 続きを読む]

    張ったセグメント(Segment Settings) に追加効果。テクスチャのタイリング、半透明、回転等。
    できること
    • 1. MAP上のセグメント(ポリゴン)を選択する。
    • 2. 登録したテクスチャの中から選んで適用する
      【Textureウインドウ】

      (Texturesウインドウで、適用したいテクスチャ欄をクリック)
    テクスチャが規則正しく並んでいると不自然さが出るような場合、セグメントの形を部分的にわざと歪ませたり、変化を出すと、より自然ぽく見えます。
    [張りつけたテクスチャの設定] 》 続きを読む
      Segment Settings ダイアログでは、セグメントに貼ったテクスチャに色々な効果を与えます。

    【アンビエントに注意】
    ポスターやじゅうたんのように、厚みをもたない二次元状の物体に対しては、アンビエント(装飾セグメント)を作成しそこに貼ります。

    左にあるTextureウインドウの画像では、蒼い背景になっているテクスチャ(ツタやゲロ)は、アンビエントに貼付けられています。

    アンビエントは特殊なセグメントで、壁や床にぴったり重なるように貼付けることができます。このとき、PUSHをどの方向にするか指定します。 これは、2DView における 上方向 -Z、下方向+z、左方向-x, 右方向+x、( 天井方向-y , 床方向 +y) を表します。


    (なぜ PUSHの必要があるかというと、3Dの世界ではテクスチャがぴったり重なってしまうとZ-Fighting という現象が発生し、おかしな模様が出現するからです。dim3ではPUSHでオフセット位置を1ピクセルずらすことで、これを防ぎます。)

    4-モデルを配置するためにMAPに関連づける [》 続きを読む]

    モデルをエンジンの3次元空間内に表示させるには、マップ上のScenery または Spotと関連づけます。
    他にはキャラクター、武器、弾と各スクリプトの関連づけしたり、武器タイプに応じて、ボーンに対し弾の発射位置等を設定。

    Animatorの使い方もあわせて読んでおきましょう。 厳密にはスクリプトとも関連づけます。


    • Sceneryはモデルを背景物として用います。
    • Spotはプレイヤーや敵キャラなど複雑なもの。

      新規作成には、エディタ右端に縦に並んだアイコン群からクリックします。
      (人型=新規Spot作成、
      樹木=新規Scenery作成)

      アイコン一覧は、[Editorインターフェイス] の説明で、確認して下さい。

    この工程は、バラバラになっていたデータを関連づけ、ひとつに組み立てていきます。 完成予想図をイメージ的に表すと、ちょうど左の絵のようになります。

    Sceneryと関連づける場合

    これは、MAP上のScenary要素--と--モデル を関連づけます。
    Spotと比べて簡単です。 [やり方を見る]》 続きを読む

    Spotと関連づける場合

    これは、MAP上のSpot要素---と---スクリプト---と---モデル を関連づけます。
    たとえば、 Data/Model フォルダ内に、Pig というフォルダ(=モデル名)でモデルが保存されている。
    Data/Scripts/Objects/ フォルダ内に A.js というスクリプトがあるとします。 (既存のJoefoe.jsを複製、リネームしたもの。)
    このとき、Pig A.js を MAP上のスポット「Enemy」に出現させるように関連づけるには次の手順を踏みます。 [やり方を見る]

    武器と弾を関連づける(☆)

    これは、キャラクタースクリプト(&モデル)---と---武器スクリプト(&モデル)---と---弾スクリプト(&モデル)を関連づけます。
    データの関連づけ応用編。最初は読み飛ばして構わないので、スクリプトについてある程度慣れて来てから読んで下さい。
    ここが一番重要な部分です。
    [やり方を見る]》 続きを読む

    武器のタイプについて(☆)

    発射のタイミング、ダメージ範囲や、弾の発射位置を設定するには、Weaponスクリプトを編集します。
    Weaponスクリプトは、実体を持つ武器、持たない武器、問わずスクリプトが必要です。

    この部分は、3Dアニメーションとも関連するので、そちらを読んでからにして下さい。[武器タイプとその指定方法]》 続きを読む
    関連項目:3Dアニメーション作成[携帯武器の扱い Weapon Mesh]


    5-テストする

    ・基本的な手順は、上で説明した STEP1〜4の工程となります。
    ・制作途中でも良いので、作ったマップが動作するかテストモードで実行することができます。 ツールバーからエンジン実行ボタンを押します。
    ・テストモードを終了するには、テストモード実行中に"ESCキー"を押して、エンジン上の選択リストから"Quit"を選びます。
    ・デバッグ、テキスト出力は、第3部で説明します。

    第2部 アニメーションを作ろう

    テクスチャアニメーション作成 [》 続きを読む]

    マップのテクスチャアニメーションに関する設定は、ほとんどマップエディタで編集します。

    [テクスチャアニメーション] 》 続きを読む
    アニメーションするテクスチャについて。 Editorで、テクスチャウインドウをダブルクリックして、TextureSettings ダイアログを出して下さい。

     1つのテクスチャに対し、さらにFrameを追加することで、テクスチャを、パターンアニメーションさせることができます。例えば、基地のモニター画面が砂嵐表示にしたりです。


    [張りつけたテクスチャの設定] 》 続きを読む
      Segment Settings ダイアログでは、セグメントに対しどんなふうにテクスチャを貼るのかを設定します。 並べ方や、特殊な効果(半透明/色調変更/スクロール等)を与えることができます。 セグメントをダブルクリックしてダイアログを出します。

    3Dアニメーション作成 [》 続きを読む]

    ボーン、ポーズ、アニメーション作成フローチャート。プレイヤーキャラクターを作る際の注意点。アニメータを使います。

    はじめに

    アニメータでモデルを読込んですぐには、アニメーションテストはできません。
    なぜならアニメーションが作成されていないからです。まず、ボーン、ポーズ、アニメーションをひととおり作る必要があります。
    (サンプルファイルではこれらは設定済みです。)
    【サンプルデータ】(dim3形式変換済み)

  • サンプルデータ (フォルダ名:Sample2):読込んだ直後
  • サンプルデータ (フォルダ名:Sample3):ボーンによる3Dアニメーション例

    Sample3で、設定されている名前
  • Bone: Tail4,Tail3,Tail2,Tail1(タグも同じ)
  • Pose:wait,wait2,wait3 walk1,walk2
  • Animation : New Animation, walk

    サンプルデータが入ったフォルダごと Data/Models/フォルダへ入れます。
  • [フローチャート]》 続きを読む
    [携帯武器の扱い Weapon Mesh]》 続きを読む
    プレイヤーキャラクターを作る際の注意点。 1st Person視点(1人称視点のFPSタイプ)と3rd Person視点(3人称視点のTPSタイプ)で、武器モデルデータの構造が違います。 どの視点を中心にするかで、必要な3Dモデルの数や形も変わります。
    【Tips】
  • 既存のポーズを元にポーズ作る場合は、メニューからポーズを複製(Pose>Duplicate Pose)すると便利。
  • ボーン、ポーズ、アニメーションに関する編集や情報確認は、Settingsウインドウのタブから行います。
  • ボーンには、必ずボーン名と、タグ(Tag)を設定して下さい。タグは4文字から成る文字列です(英数字の使用可)。
  • タグは、弾がモデルのどこから発射されるかを、スクリプトで指定する時に使われます。
  • ボーンにはウェイト(Weight)を付加することができます。

  • 2Dアニメーション作成(その他) [》 続きを読む]

    パーティクル(炎や煙)や、エンジン実行画面のインターフェース(HUD - Head-Up Display)要素。テキストエディタでXMLデータを編集。

    2Dアニメーションはパーティクル(炎や煙や爆発パターン)にも使用されています。 これらは、武器発射時の効果やMAP上に配置することもできます(Sceneryとは別の扱い)。

    パーティクルに必要なのものは
  • Data/Settings/Particles.xml の設定。
  • Data/Bitmaps/Particles/ 内の画像
  • (スクリプトで、パーティクル発生関数の引数に、パーティクル名を指定。)
  • 1-パーティクル画像の準備と、設定データの編集

    [2Dパーティクルアニメーションの仕様]》 続きを読む
    dim3ではパーティクルのアニメーションを、Data/Settings/Particles.xml というXMLファイルで定義しています。
    このファイルの編集は、テキストエディタを使います。

    2-パーティクルをマップ上に配置する

    パーティクルをマップ上に配置するには、右端、縦に並んだアイコン群から、新規パーティクル作成ボタンをクリックします。 Particle Setting ダイアログが出るので、プルダウンメニューからパーティクル名を選択して、新規作成して下さい。
    [Editor インターフェイス] 》 続きを読む
    簡単な概要(おさらい)

    HUDインターフェース上のアニメーション

    HUDとは Head-Up Displayの略称で、パイロットのために戦闘機やヘリコプターのガラスなどに情報を投影する表示装置からきています。 dim3では、3D画面上に、HP表示やメッセージなどの情報や、ボタン等のインターフェース表示をオーバーラップさせて表示します。
    これらはすべてData/Settings/Interface.xml で定義されます。
    	<Bitmap name="Animation Icon">
    		<Image file="particle_smoke" count="4" time="250" loop="true" /> 
    		<Position x="250" y="250" />
    		<Size width="128" height="128" />
    		<Settings alpha="1.0" flip_horizontal="false" flip_vertical="false" hide="false" flash="false" />
    	</Bitmap>
    		

    このなかで、Bitmap要素をアニメーションさせるには、パーティクルと同じようにパターン画像を作成したものを指定し、count属性にパターン数を記述しておきます。 また、表示/非表示、点滅、反転、回転、拡大縮小、移動などの効果を与える事ができます。これらはスクリプトからも操作することができます。

    しかし基本的には Interface.xml で定義されたものだけが使え、 スクリプトで動的にBitmap要素を生成するということはできません。

    第3部 スクリプトで制御しよう。

    スクリプトの概要 [》 続きを読む]

    スクリプトシステムの概要。dim3には JavaScript 1.6 相当が組み込まれています。
    dim3では、スクリプトはそれぞれ、
    つまり、プレイヤーにさせたいことは、プレイヤーに対応する Player.js スクリプトに書きます。
    敵キャラにさせたいことは、敵キャラに対応する Joefoe.js に書く、といった案配です。

    ■ オブジェクトについて - dim3の仕組み
    dim3のすべてのもの(ボタンや画像、3Dモデル、色、カメラ等)は、オブジェクト(対象)という概念で管理されています。
    オブジェクトには大きく分けて2種類あります。
  • weap , proj , obj , course から始まるものは「Specific script Object」 と呼ばれ、特定(自身)のスクリプトからしか使えません。
  • Map , Camera , Sound , iface から始まるものは 「Global Object」 と呼ばれ、どのスクリプトからも使うことができます。
  • 書式に従って対象のありかを指定すれば、その対象に関するあらゆる特徴を自由に操作する事が出来ます。
    公式のマニュアルのスクリプトリファレンスには、オブジェクトとメソッドの一覧が載っています。

    ■ イベント発生について - dim3はどのように動いているのか?
    dim3エンジンは、キーが押された、プレイヤーが行動した、MAPが読込まれた、モデルが構築された、ぶつかった、ダメージを受けた、といった状況の変化に対して、「イベント定数」というものを発行します。 イベント定数は、「DIM3_EVENT_」 で始まる定数で、メインイベントとサブイベント(さらに分類されたもの)を持っています。
    DIM3_EVENT_CONSTRUCT
    DIM3_EVENT_MAP_OPEN
    DIM3_EVENT_JUMP
    DIM3_EVENT_CLICK
    DIM3_EVENT_DAMAGE
    DIM3_EVENT_COLLIDE
    公式のマニュアルのスクリプトリファレンスには、イベント、サブイベント一覧が載っています。

    ■ イベント・ループについて
    一方、各スクリプトは、それがいつ起きるか、いつも監視しています。実際に Data/Setting/以下のスクリプトには必ず、event 関数による、 次のようなコードが含まれています。 スクリプトは実行されると、このevent 関数の中をえんえんと廻り続けることになります、何かイベントが発生すると swith &case 文で捕捉され 各処理にまわされます。
    各処理にまわされる関数には、通常引数はobj , サブイベントがある場合はsubEventも渡します。
    //メインループ
    function event(obj,mainEvent,subEvent,id,tick)
    {
    switch (mainEvent) {

    case DIM3_EVENT_CONSTRUCT: // データ構築時に呼ばれます(一番最初)
    joeFoeConstruct(obj);
    return;

    case DIM3_EVENT_SPAWN: // MAP上に生成された時
    joeFoeSpawn(obj);
    return;

    case DIM3_EVENT_DIE: 死んだ
    joeFoeDie(obj);
    return;

    case DIM3_EVENT_DAMAGE: //ダメージを受けた
    joeFoeDamageStart(obj,tick);
    return;

    case DIM3_EVENT_WATCH: //索敵中
    joeFoeWatch(obj,subEvent);
    return;

    case DIM3_EVENT_WAIT://攻撃など、一定時間後に行なうべき行動 は DIM3_EVENT_WAIT が発生した時に行ないます。
    joeFoeWait(obj,id,tick);
    return;

    case DIM3_EVENT_TIMER ://一定期間毎に起こしたい行動は DIM3_EVENT_TIMER が発生した時に行ないます。
                 joeFoeTimer(obj,id,tick);
    return;

    }
    }

    ここで、制作者が行なう事は、 発行されたイベントに対して、どんな処理をするのかをスクリプトに書くことです。例えば「イベント定数」に対するアニメーションや条件判断、フラグの取捨選択などが挙げられます。 dim3付属のデモについてるスクリプトには、様々な関数やメソッドの使用例があるので、参考にして下さい。

    ■ウエイト・タイマーの使い方
    これは、その処理の一例です。 ウェイトやタイマーを使うには、スクリプトの最初で用途ごとにIDという定数を定義しておきます。 これはタイマーとウェイトのサブイベント定数にあたるもので、ユーザーが自由に作れます。ただし値は重複してはいけません。

    そして、メインループのswitch〜case文でタイマー/ウェイトイベントを絞り、そこから更にIDごとに各関数へ振り分ける処理を書いておきます。 後は呼び出したい部分にウェイト/タイマーを発行する関数(startTimerやstartWait)を書いておけば、実行時にイベントが発行された時にメインループでそれを捕捉してくれます。
    時間単位は「tick」。

    タイマー  : 一定時間毎にタイマーイベントとIDを発行する。
    ウェイト  : 一定時間後にウェイトイベントとIDを発行する。

    これらを定義するメソッド:
    startTimer(frequency_ticks,id);
    startWait(wait_ticks,id);
    startWaitRandom(wait_low_ticks,wait_high_ticks,id);

    例えば、上で説明した Event ループで考えてみます。
    スクリプトの最初で、ユーザーIDをいくつか作っておきます。
    //ユーザーID :
    var ID_ENEMY_ATTACK = 1;//攻撃する
    var ID_ENEMY_WALK = 2; //歩く
    var ID_ENEMY_JUMP = 3; //ジャンプする

    この時 実行時には、キャラクターがマップ出現後に 500tick 時間毎にタイマーイベントが発生し DIM3_EVENT_TIMER と共に ID_ENEMY_JUMPが発行されます。それがメインループで捕捉され、 ID_ENEMY_JUMPの時に、実際のジャンプ obj.motionVector.jump(); が実行されます。
    (なお、 obj.motionVector.go();で移動開始、 obj.motionVector.stop();で止まります)、

    結果:
    ※joeFoeSpawn(obj);関数 はDIM3_EVENT_SPAWNイベントによって、マップ上に出現した時に呼び出されます。
    ※joeFoeTimer(obj,id,tick);関数 は タイマーイベントが発生した時に呼び出されます。
    ※このキャラクターはマップ上に出現されるや否や、600tick 毎にジャンプし続けることになります。

    アニメーションの制御 [》 続きを読む]

    スクリプトによる2D/3Dアニメーション制御。テキストエディタでスクリプトファイルを編集。

    スクリプト制御による2Dテクスチャの変更 [》 続きを読む]

    テクスチャの切替えには model.fill.change メソッドを使います。

    スクリプト制御による3Dアニメーションの切替え [》 続きを読む]

    スクリプトを使えばアニメーションの再生順序やタイミングを制御することができます。

    スクリプトでインターフェース要素を制御 [》 続きを読む]

    ※Iface オブジェクトは、どのスクリプトにも書く事ができます。

    ムーブメント [》 続きを読む]

    ムーブメントとは、マップ上で自動ドアやエレベータのように、背景物(障害物)を一定の方向へ動かすことをいいます。

    テキスト表示とデバッグログ [》 続きを読む]

    dim3には、テキスト出力が2種類あります。

    カメラワーク とキー操作 [》 続きを読む]
    スクリプトに関連したカメラと、プレイヤー操作の話。
    dim3で3次元空間を思いのままに見てあるくには、カメラオブジェクトを使います。このオブジェクトは、すべてのスクリプトから使う事が出来ます。 カメラというよりビデオカメラに近いですね。

    ■(カメラの種類)の部分に定数を指定すると、カメラの機能を切り替えられます。
    dim3のスクリプトでは、カメラオブジェクトの設定ために次の書式が用意されています。これはコーススクリプトで定義されることが多いです。
    camera.setting.type=(カメラ定数);
    指定するカメラ定数 説明 用途 最適なinput mode設定
    DIM3_CAMERA_TYPE_FPP (1人称視点・主観カメラ) FPSのプレイヤ−視点 DIM3_INPUT_MODE_FPP
    DIM3_CAMERA_TYPE_CHASE (3人称視点・追尾カメラ) 日本製の3Dアクション DIM3_INPUT_MODE_FPP
    DIM3_CAMERA_TYPE_STATIC (3人称視点・固定カメラ) パズル、固定移動 DIM3_INPUT_MODE_TOP_DOWN
    DIM3_CAMERA_TYPE_CHASE_STATIC (3人称視点・固定追尾カメラ) 横スクロール DIM3_INPUT_MODE_SIDE_SCROLL
  • 1人称視点というのは、自分がカメラを覗いているような視点です。3人称視点は自分の後ろ姿がカメラに映っているような視点です。
  • 追尾カメラは、プレイヤーの背後にずっと付いて来るカメラです。
  • 固定カメラは、ビルの監視カメラのように一カ所に視点が固定されたものをいいます。
  • 最適なinput mode設定というのは、カメラの視点に最適な、プレイヤーを動かすためのキー操作系統です。

    ■プレイヤーのキー入力設定(Player.js で設定)これはObjectオブジェクトなので、 Player.jsで定義する必要があります。
    obj.setting.inputMode=(imput mode定数);
    指定するimput mode定数 キー入力の説明
    DIM3_INPUT_MODE_FPP 前後移動(↓,↑) 横歩き(←, →,A,D) と ジャンプ(スペースキー)
    DIM3_INPUT_MODE_TOP_DOWN 前後左右(矢印キー←, ↓,↑,→ ) と ジャンプ(スペースキー)
    DIM3_INPUT_MODE_SIDE_SCROLL 左右移動(矢印キー ←, →) と ジャンプ(スペースキー)
    DIM3_INPUT_MODE_FLY  離陸(↑)、着陸( ↓)
  • DIM3_INPUT_MODE_FPP の場合、常に前方を向いています。前後移動は(W,S)キーを使っても可能です。
  • DIM3_INPUT_MODE_TOP_DOWN の場合、前後左右移動するたびに、方向転換します(手前方向に進むときはこっちを向く)。
  • dim3デモでは、F9キーでFLY Mode になります。
    ■ 設定例:
    DIM3_CAMERA_TYPE_STATIC 固定カメラは、スポットを利用してカメラ位置を複数持つという特殊な使い方ができます。
    camera.staticPosition.moveToSpot メソッドを工夫すると、場面転換やカットインのような演出も可能?
    // Course Script

    //Player:Static Camera Map
    obj.setting.inputMode=DIM3_INPUT_MODE_TOP_DOWN;


    // Map: Static Camera Map
    camera.setting.type=DIM3_CAMERA_TYPE_STATIC;
    camera.staticPosition.follow=true; // -----  trueにすると、固定視点のままカメラは強制的に対象を追尾するようになる。
    camera.staticPosition.moveToSpot(map.spot.find('View1','Camera')); // ------カメラ位置を指定したスポット位置へ移動※

    // map.spot.find(name,type); 指定した name/type の最初のスポットのID を返す
    // スポットには、ユーザーが用途に応じてType属性を追加できます。
    // ここでは View1という 名前で、Camera タイプのスポット位置を検索しています。
    // スポットのType属性には Bot や Player 、 Teleporter などを付けることができます。


    //Player: Side Scroller Map
    obj.setting.inputMode=DIM3_INPUT_MODE_SIDE_SCROLL;


    // Map: Side Scroller Map
    camera.setting.type=DIM3_CAMERA_TYPE_CHASE_STATIC;
    camera.chaseAngle.x=0;
    camera.chaseAngle.y=270;
    camera.chaseAngle.z=0;
    camera.chase.distance=14000;

    //Player: Map: Big Outdoor Map
    obj.setting.inputMode=DIM3_INPUT_MODE_FPP;


    // Map: Big Outdoor Map
    camera.setting.type=DIM3_CAMERA_TYPE_CHASE;
    camera.chase.distance=10500;
    camera.chase.trackSpeed=5; // 追尾スピード
    camera.chaseAngle.x=0;
    camera.chaseAngle.y=0;
    camera.chaseAngle.z=0;

    //Player: default(DIM3_INPUT_MODE_FPP)
    // Map: Big Indoor Map
    camera.setting.type=DIM3_CAMERA_TYPE_FPP;

  • その他のスクリプト [》 続きを読む]
    テレポータの作り方。
    マップ上にはTagというものを設定できます。また、キャラクターが今居る場所のTag を取得するメソッドがあります。 これを利用すると、プレイヤーや他のキャラクターが、その床を踏むと、別の場所にテレポートさせるといった事ができます。

    ■テレポーターの作り方
  • 1.マップエディタで、マップ上の任意の床セグメントをダブルクリックしSegment Settingsダイアログを出す。
  • 2. Segment Settings ダイアログを開き、Tag に"8888" を指定する(この床を踏むとワープする)。
  • 3. 同じく、マップ上に、移動先の新規スポットを作る。( name='Teleport02' type ='TYPE_TELEPORT' を指定 )
  • 4. キャラクターのスクリプトを編集し、つぎのコードを追加する。
    (キャラクターのスクリプト、 switch (mainEvent) の前あたりでも追加 )
    // teleporter
    if ( obj.status.floorTag=='8888' ){ // 現在キャラクターが踏んでいる床のTagを判別
    var get_id=map.spot.find('Teleport02','TYPE_TELEPORT'); // 指定した name と type を持つスポット'Teleport02'を取得。
    var get_pos=map.spot.getPosition(get_id); // 'Teleport02' の位置データを取得する。
    var get_ang=map.spot.getAngle(get_id); // 'Teleport02' の角度を取得する
    obj.position.place(get_pos.x , get_pos.z , get_pos.y , get_ang.y); // キャラク位置を 'Teleport02' の位置と角度に変更する。
    return;
    }
    ■仕組み:
    キャラクターがTagが 8888 の床に触れると、スクリプトは'Teleport02' というスポットを検索し、その情報をキャラクターの位置情報に渡すことで、テレポートさせます。



  • <arolf_infoseek_jp> Tsukubado