English
FAQプログラム全般
戻る|   ■
FAQ/プログラム全般

その他



SH2がクラッシュした時に。

Q)
SH2がクラッシュした時には、何をチェックすべきでしょうか。

A)
SH2 がクラッシュした時には、PRをチェックし、ルーチンからのリターン アドレスが正しいか調べることがベストです。
これによって、どのルーチンが クラッシュしたのかを知ることが出来ます。
これはCで書かれたコードでも 有効です。


SH2のレジスタって足りないと思いません。

Q)
アセンブリを使ったちょっと姑息なテクニックをひとつ。

A)

  1. MACL,MACH, 及び GBR をテンポラリーとして使用します。

  2. pr をレジスター内に保存します。(sts.l pr,r14)

このテクニックは、ライブラリの挙動やSHのアセンブリに精通している方のみお使いください。 これらの操作は、きちんと使わないとライブラリ内部での暴走を引き起こす可能性があります。


GCCでの(アセンブラレベルでの)パラメータルールは?

Q)
Cで作った関数をアセンブラのプログラムに組み込みたいと考えていますが、 Cの関数の引数や返数は、どういう形でコーディングされているのでしょうか?
又、内容を退避させておかなければならないレジスタはどのレジスタ なのでしょうか?

A)
詳細は次のようになります。

r0:
ファンクションが返す値。

r0-r3:
テンポラリー。ファンクションをコールすることによって壊される可能性があります。- セーブ&リストアーをする必要はありません。

r4-r7:
最初の四つの引数。callee によって壊されます。

r8-r15:
使用可能なテンポラリー。ファンクションコール間においてこれらは保存されなければなりません。gcc 上で扱われるアセンブリのファンクションではこれらのレジスタを保存しなければなりません。

pr:
プロセッサリターン 必ず保存されなければなりません。

gbr:
Cコンパイラは普通gbrを使用するコードを作成いたしません。したがって、gbrレジスタは自由に使うことが出来ます。(但しSGLはシステムでgbrを使用しています。もしSGLシステムとアセンブラを両立させる際には、十分な注意が必要になります。具体的にいうと、gbrは常にシステム変数領域の先頭アドレスを指しています。)

mac?:
破壊されます。又、5つめ以降の引数は、全てスタックに保存されるため、Cの関数は出来るだけ引数を4つ以内におさめておくと、パフォーマンスが向上します。

※C ファンクションをコールする前に r4-r7 の中の char、及びshortは 必ず符号付きにするか0で拡張するかしてください。 gccの場合レジスタ内の引数は符号付きで int に拡張したものである事を 期待します。

SH2の除算器を使用する上での注意点はありますか。

Q)
SH2の除算器を使用する上での注意点はありますか。

A)
SH2の除算器は、除算を39サイクル程度で行うことができるユニットを持っています。
除算器を使用する上で注意しなければならないことは、メイン処理で除算器を使用中に割り込みが入り、割り込み処理内で除算器が使用された場合、 割り込まれたメイン処理側の計算結果が不正になってしまうことです。

この対処としては、

  1. 割り込み処理が除算器を使用する場合、メイン処理は割り込み禁止にしたする。

  2. 割り込み処理では除算器を使用しない。

があります。

SH Cコンパイラには、除算器を使用するオプションスイッチがあるため、この 注意を意識したくない場合は、使用しないオプション(-div=cpu)か、除算器使 用時には割り込みを禁止するオプション(-div=peripheral)を指定するように してください。

gccは、Cコンパイル時コード中に明示的に(例えばインラインアセンブラ) 使わない限り除算器を使用するコードを生成しません。


CPU、DMA(CPU/SCU)等のデータ転送にかかる時間を教えて欲しい。

Q)
データ転送にかかる時間をプログラム転送、CPU-DMA転送、SCU-DMA転送ごとに教えてくれませんか?

A)
VDP1とVDP2とSCSP(Sound RAM)に256バイト転送するのにかかる時間(計測値) を記します。この計測は、以下の条件で行いました。

  1. VBlank中である。(VDP2に常に書き込み可能な期間中)

  2. SCSPは、68000も内部のDSPも止まった状態。

  3. VDP1は描画も表示も行っていない状態。

  4. CPU-DMA転送とSCU-DMA転送には、レジスタへのデータの登録時間は含まれていません。

●WORKRAM-H-->SCSP(256バイト)
プログラム転送 78.14マイクロ/sec(4バイトあたり32.80クロック)
CPU-DMA転送  77.74マイクロ/sec(4バイトあたり32.70クロック)
SCU-DMA転送  63.89マイクロ/sec(4バイトあたり26.80クロック)
どの転送でもかなり時間がかかる。256バイト以下の転送でも、4バイトあたりの速度はあまり変わらない。

●WORKRAM-H-->VDP1(256バイト)
プログラム転送 36.75マイクロ/sec(4バイトあたり15.40クロック)
CPU-DMA転送  29.56マイクロ/sec(4バイトあたり12.40クロック)
SCU-DMA転送  5.36マイクロ/sec(4バイトあたり 2.25クロック)
SCU-DMA転送の速度がかなり早い。但し、256バイト以下の転送時に、4バイトあたりのクロック数は悪くなる。
(16バイト転送にかかる4バイトあたりのクロック数は5.97)

●WORKRAM-H-->VDP2(256バイト)
プログラム転送 36.58マイクロ/sec(4バイトあたり15.40クロック)
CPU-DMA転送  17.98マイクロ/sec(4バイトあたり 7.60クロック)
SCU-DMA転送  5.20マイクロ/sec(4バイトあたり 2.20クロック)
SCU-DMA転送の速度がかなり早い。但し、256バイト以下の転送時に、4バイトあたりのクロック数は悪くなる。
(16バイト転送にかかる4バイトあたりのクロック数は5.00)

SCU-DMAには、実行時に前処理(20クロック以上)と後処理(12クロック以上) が入るため、特にVDP1やVDP2への大量のデータ転送時に有効です。SCSPは 外部からの転送にウエートが入るため、CPU-DMAかプログラム転送で行う 方がベターです。(SCU-DMAはバーストモードのため、実行後キャッシュミス ヒットや書き込みが起こると処理がSCU-DMA転送終了まで止まってしまうか らです。)

SEGASATURNのソフトを開発する時の注意点は?

Q)
今度、SEGASATURNでゲームソフトを開発する事になったのですが、どんな グラフィックの機能があるか調べようとハードウェアマニュアルを 見ているのですがあまりに沢山あり過ぎて、選択のしようがありません。
そこでなのですが、実際SATURNには、どんな機能があって、どんな制限が あるのかについて簡単でいいので教えてください。

A)
確かにSATURNにはさまざまな機能がありどう使うべきなのかという事については 非常に迷う所ですが、グラフィックの設計という観点でどうすればいいのか について説明すると、グラフィックの設計上注意しなければならない点は、

パレット:
パレットはスクロールとスプライトで共有します。従って、限定された カラーデータを何処にどう割り振るかというのは非常に重要な 問題となります。サターンでは1024色又は、2048色のパレットデータ を使います。その中で何処にどのパレットを使うという事を、 絵を書く前に決めておくべきでしょう。

VRAM:
VDP1とVDP2では、それぞれ違う使われ方をするのでそれぞれ別に説明すると、

まず、VDP1ではVRAM内に画像データ、スプライト表示用コマンド、 カラールックアップテーブル、グーローシェーディングテーブル を入れます。これら全てを含めて512KB以内に収めなければなりません つまり絵のデータだけで512KB使えるという訳ではありません。 当然、絵のデータが多くを占めてしまえば、コマンドの入るスペース が減りますので、その描画できる枚数が減ってしまいますし、その逆 もいえるのです。そういった事を頭に入れておいた上で仕様を固める た方がいいでしょう。

次にVDP2ですが、ここには、ビットマップデータ又は、キャラクタ パタンデータ、パターンネームデータ、場合によっては、回転係数 データ(このデータは、カラーRAMに置く事も出来ます。)が入ります。 これらのデータが全てVRAM内に収まるのは勿論ですがそれ以外に アクセスの問題があります。

ただ気をつけて欲しいのは、ビットマップを使う場合大量のRAMを 必要とするため、気をつける必要があります。

描画:
VDP1、VDP2はそれぞれ、ハイレゾリューション、 ローレゾリューションでは、描画能力が違います。ハイレゾを使用 した場合描画能力はローレゾの半分になります。従って、ハイレゾを 使用した場合でかつ1 Int以内に収めるといった要求に応じるには、 かなり厳しい制限が付くことを考慮に入れてください。

VDP1:
VDP1はスプライトの処理を担当しています。スプライトの表示において 問題となるのは半透明です。
半透明は、スプライト同士又は、スプライトとスクロールに対して 行なう事が出来ますが、あるスプライトと別のスプライト、スクロール の両方に対して同時に半透明を使用する事が出来ませんので、 最初の設計段階でこの点を十分に注意しなければなりません。
もしスプライトとスクロール両方同時に半透明的な処理を行なう場合 メッシュにしなければなりません。(メッシュと半透明でどれほど効果 が違うものなのかを開発の初期に於いて知っておくのは非常に良い 事です。ついでにハイレゾとローレゾの時の違いも知っておくと 良いでしょう。)
もう一つ問題は、グーローシェーディングです。 グーローシェーディングは、ポリゴンの繋ぎを滑らかに見せる事の 出来る便利な機能ですが、これはスプライトの画像データが RGB形式又は、カラールックアップモードでかつ、 ルックアップテーブルの中がRGBになっている時のみ有効な機能です。 パレットモードの場合、 グーローシェーディングはかかりませんので、設計段階でどの スプライトをどのモードで使うかについてある程度の見込みを 立てておく必要があります。

VDP2:
VDP2は主にスクロールの処理を担当しています。 VDP2の使用に当たって注意しなければならないのは、 サイクルパターンと呼ばれるVRAMアクセスの順序などを設定する パラメータです。
基本的に表示するスクロールのデータを何処におけるかというのは、 このサイクルパターンに依存します。
]]]]]]< SGLを使うとこの設定をslAutoDispで自動的に設定しますが、 設計する際に、VRAMをどう使うかについてしっかりと知っておく 必要があります。サイクルパターンに影響を与えるパラメータとしては 回転スクロール面、セル、マップのVRAM上での位置、VRAMの分割、 色数、縮小設定、縦セルスクロール、ハイレゾ/ローレゾ、 画面表示期間中のVRAMへのCPUアクセス、になります。これらは全て、 サイクルパターンを消費あるいは制限するものですので、どういう スクロールを使いそれらのデータ何処におくかという設計や、 これらの仕様は実現できるのかといった問題について、予め 見通しを立てておいてください。

利用できるトラップベクタは?

Q)
利用できるトラップ例外処理ベクタを教えてください。

A)
ベクタ20H〜3FHのユーザベクタのみ現在、将来ともアプリの動作中 はBOOT-ROMで使用しませんので自由に使用して結構です。
他のベクタは本来の目的以外にアプリケーションで勝手に使用することは できません。48H〜7FHは、ユーザ側では使用することができませんので 使用している場合は変更をお願いします。
ベクタを使用するにあたって以下の点を注意して行ってください。

  1. ベクタ領域のアクセスは、BOOT-ROMに内蔵のシステムプログラムを使用しなくてはなりません。SYS_SETSINT()

  2. NMIベクタは書き換え禁止です。これは、リセットボタンの処理のため。


IPを作ってもブートしない。

Q)
コンパイラを SH Series C Compiler Ver.3.0B にしたところ、今までと同じ様に "IP"を作ってもブートしなくなりました。
IPの作成には御社のサンプルファイルを使用しています。
(ただし、エリアコードは日本のみをリンクしています)

¥SATURN¥SEGASMP¥SYS¥MK.BAT
                    SMPSYS.C
                    SMPSYS.LNK
                    SYS_ID.SRC

どうやら ASSEMBLER と LINKAGE EDITORのバージョンは関係無いようです。
コンパイラで何か変更しなければならない部分などあるのでしょうか。

A)
SMPSYS.Cの114行目を

 Sint16 vbIcnt = 0;

から、

 volatile Sint16 vbIcnt = 0;

のように、書き換えてください。


PAL版を作る際の注意事項。

Q)
日本版やUSA版に作成したタイトルを、PAL版に変更する際に、プログラムや グラフィック、サウンドのデータに関してどの様な変更が必要に なるでしょうか?

A)

●ドットのアスペクト比に関する問題
PAL版になるとドットのアスペクト比がNTSCより横長になります。
従ってグラフィックデータもそれを考慮したものにしなくてはいけません。

●V-Blankに関する問題
PALでは、NTSCと比べてV-blankが短くなります。従ってblanking中の処理が 重すぎてしまうと、処理落ちを起こしてしまいます。
又、PALの周期は50Hz、NTSCは60Hzですので、NTSCのゲーム等をそのまま移植 してしまうと、(一秒間に60回処理していたものが50回になってしまうので) 全体として5/6の速度になりますのでそれを補正するような工夫が、 必要になります。

●Cinepak、TrueMotionについて
Cinepak、TrueMotionについては、基本的には問題はありません。
これらは、ムービー作成時、時間情報を取り込んだ形で圧縮されるからです。
但し、アスペクト比が変わりますので、絵が縮んでみえますので、注意が 必要です。

又、VDPに負荷の掛かりすぎるような、データの場合表示が正しく 行われない事もあります。(つまり、フレーム落ちしてしまいます。)


SATURN開発で使えるANSI Cライブラリは?

Q)
インクルードファイルで使用出来るANSI規格準拠のCライブラリ 関数をお教えください。

A)
基本的には、fopen、fget、fscanf等のファイル入出力関係
(これは当然の事ながらセガサターンのライブラリについてくるCDアクセス関係の関数を お使いください。)、又printf、scanf等のコンソールから入出力を要求する関数は 使えません。
(たとえコンパイルが通ったとしても動作の保証は出来ません。 但し、SNASM環境でlibcross.aを使った場合問題なく使用出来ます。その際、 標準出力は、snbugsat上に現れる標準出力ウインドウになります。)

また、calloc、malloc、sprintfなどのメモリに絡んだ関数はコンパイルも 通りますし動作もしますが、ゲームマシンのプログラミングとしてはふさわしい 組み方ではありません。
calloc、mallocなどは、もともとOSに深く依存した 関数ですので、Saturn上で使用した場合、違法なアドレスへのマッピング等 したときにも、エラーは帰ってきません。これらのことはSaturnがOSを積んだ マシンでないということを考えれば当然の結果だと思います。
(これは、SBL、SGLどちらでも同じ事です。)


クロックチェンジ時のVDP、SCU、SCSPのデフォルト値について。

Q)
クロックチェンジ実行時、VDP1,VDP2,SCU,SCSPは、パワーON時のデフォルト値 になると、SMPCユーザーズマニュアルに記載されておりますが、 このデフォルト値を教えてください。

A)
クロックチェンジを行うと、SCU・VDP1・VDP2がリセットされますが、 設定値は各ハードウェアマニュアルの初期値が設定されます。
設定値は、各ハードウェアマニュアルを参考にしてください。

クロックチェンジ後の処理は、『プログラマーズガイド』のシステムプログラム ユーザーズマニュアルに記載されていますので参考にしてください。
簡単に記述しますと、

<リセット後再初期化処理について>

●SCU
バス、割り込みマスクなど再初期化が必要。ただし、割り込みマスク値にはSYS_GETSCUIMの値を使用する。

●VDP2
TVモードを比較的早く設定する必要がある。デバイス自体はリセット後320/640モードになるため、特にシステムクロックを352/704モードに変更した場合、TVに対して、同期信号がずれており、画面が乱れる場合がある。

●VDP1、VDP2、SCSP
以前の設定がすべて無効になるので再設定が必要になります。
ライブラリをご使用の場合は、アプリケーションの初期化と同様の内容を行う必要があります。


CDのプログラムエリアの記録範囲について。

Q)
プログラムエリアの記録範囲について質問です。
現状最大63分04秒となっていますが、これを越えてデータを作成しても宜しいのでしょうか?
宜しいのであれば、最大何分まで可能なのでしょうか?

A)
この制限は、CD-ROM上にセキュリティエリアを確保する為のもので、 最大時間を越えたデータは、セキュリティエリアを浸食する為、 製品に出来ません。

以上の理由から、最大63分04秒以上のデータを作成することは出来ません。
もし、作られたソフトが63分04秒以上あった場合、当然のことながら 製品化する事は出来ません。


データカートリッジについて。

Q)
データカートリッジに関する質問です。

  1. カートリッジ部分のエミュレーションを行う場合、CartDev、Programming Box上でのアドレス設定はROMイメージのアドレスを指定する事は可能なのでしょうか?

  2. Cart DevではSIMMのメモリーを使用してエミュレーションを行うのでしょうか?

  3. その場合、ファイルシステムとの共存は可能なのでしょうか?

  4. ROMカートリッジへのアクセスはバイト単位で行えるのでしょうか?

  5. SCUの制限は通常のA-Busへのアクセスと変わりはないのでしょうか?

  6. SCUのウェイトを設定しますが、アクセスはLOW-RAMに比べどのくらい遅いのでしょうか?

  7. データカートリッジを使用したサンプルプログラムはありますでしょうか?

  8. CDの場合、ライトワンスライターで作成した物を提出しますがデータカートリッジ部分のデータはどの様にして提出すればよろしいのでしょうか?
    (フロッピーで圧縮して提出、ROMライターでROMを作成する等)

A)
お答えします。

  1. 使用するROM空間は決まっているので、ROMイメージのアドレスを指定することはできません。

  2. SIMMシステムで使用する専用カートリッジ(亜土電子で販売しています)にSIMMをセットしてエミュレーションを行うことになります。

  3. SIMMシステム(GFSのデバッグモード)とカートリッジのエミュレーションはGFMC_Baseの設定アドレスがカートリッジ使用アドレスとぶつからなければ、可能かと思われます。

  4. バイト単位でも行うことができます。

  5. 変わりありません。ただし、CDバッファと違って読み込みアドレスの更新がありますので(つまり、通常のメモリコピーのように読み込みアドレスの更新がある)、DMAの設定には注意してください。

  6. 3クロック・ウェイトに設定します(マニュアルに記載)が、実測で16ビットのデータを得るのに、25クロックほどかかっています。
    WORKRAM-Lとの対比で約4倍遅いということになります。

  7. サンプルプログラムは用意していません。CDからの読み込みとカートリッジの読み込みが重ならないように注意してプログラミングしてください。

  8. MegaDriveなどの昔のカートリッジソフト同様、基本的にはROMでの納品となります。この形態については、納品時に変更がある事はあるかもしれません。


自己起動するCDを作成したい。

Q)
自己起動するCDを作りたいんですがどうやって作ったらいいのでしょうか?

A)
自己起動するCDを作成する際の、作業手順は、次の様になります。

  1. 実行ファイルをBIN形式で作成する。

  2. IPを作成する。

  3. バーチャルCDのスクリプトファイルを作成し、ディスクイメージを作成する。

  4. バーチャルCDにて、動作を確認する。

  5. VCDMKTOC.EXEを使用し、TOCファイルを作成する。

  6. SEGACDW.EXE を使用し、ライトワンスCDを作成する。

IP自体についての解説と、自己起動するようなCDのスクリプトファイルの 記述方法については、

参照
『プログラマーズガイド』DISCフォーマット規格仕様書/ブートシステム

をご参照ください。

各項目の実行手順は以下の通りです。

  1. BINファイルの作成
  2. ○GNU環境の場合
    まず普通通りにcoffファイルを作った後、objcopy(IRIXの場合sh-objcopy)コマンドで次のように

     objcopy -O binary input output

    とするか、GCCのリンクオプションで

     -Xlinker -oformat -Xlinker binary

  3. IPの作成
  4. サンプル版のIPでは、1stREAD FILE のアドレスを0x06010000 に設定しており、 サンプルのイニシャライズプログラムから1stREAD FILEの先頭番地へジャンプしています。

    もし、1stREAD FILE のリードアドレスを変更する場合には、IPをコンパイルし直す必要があります。
    現在ご提供しておりますIP用のソース及び、セキュリティオブジェクトは、 SH-C用ですので、日立製SH-CにてIPを作成する必要があります。
    または、GNU用のIP作成に必要なファイルを電子メールにてご提供 できますので、必要な場合にはご連絡ください。

  5. スクリプトファイルを作成
  6. プログラマーズガイドのDISCフォーマット規格仕様書の「付録A・各種サンプルリスト」ご参照ください。

    IPのロード後に自動的にロードされるファイル(1ST READ FILE)は、 CD-ROM上のファイル名が、アスキー順で一番最初のファイル (ファイル識別子が2のファイルと同義)です。
    CD-ROM上のファイル名は、Fileコマンドで指定し、DOS上のソースの指定は、 FileSource コマンドで行います。この時、CD上のファイル名とソースの ファイル名は、一致させる必要はありません。
    また、システムエリアに登録するテキストファイルの意味については、 別紙資料をご参照ください。(これらのテキストファイルは、開発中はダミー でも構いませんが、権利関係のテキストファイルについては マスターアップ時までに必ず入れるようにしてください。) なお、自己起動する実行方法では、SNASMデバッガは使用できませんので ご注意ください。


バイト境界でビッグエンディアンとしてデータをおく方法は?

Q)
相対値をバイト境界でビックエンディアンデータとして確保する方法を教えてください。

A)
一例として日立コンパイラ環境のASMSHを使う例を御紹介しましょう。
日立アセンブラ環境では絶対値に対して除算器シフトが使えます。この機能を 利用して、

.DATA.B ¥data >> 24
.DATA.B ¥data << 8 >> 24
.DATA.B ¥data << 16 >> 24
.DATA.B ¥data << 24 >> 24

といったマクロを定義してください。


1st Read Fileのロードアドレスは、どこに設定するの?

Q)
1stリードファイルのロードアドレスは、どこに設定すればいいのでしょうか?

A)
1stリードファイルとは、IP.BINに続いてアプリケーションとして最初に ロードされるファイルを指します。ロード可能な領域は以下のように なっています。

6002000H + IPサイズ┏━━━━━━━━━━━━┓
                ┃ 1stリードファイル ┃
                ┃   ロード可能領域  ┃
                ┃            ┃
                ┃            ┃
60FF000H        ┣━━━━━━━━━━━━┫
                ┃  システム使用領域  ┃
60FFFFFH        ┗━━━━━━━━━━━━┛

60FF000H〜60FFFFFHは、システムが使用しますので、絶対に1stリードファイル をロードしてはいけません。

1stリードファイルをロード完了後は、アプリケーションへ開放されます。
また、6000000H〜6001FFFHは、システムが使用しますので、アプリケーション では使用してはいけません。
ただし、600E00H〜6001FFFHのスタックの使用はできます。
IP処理が完了し、アプリケーション起動後は、

マスタSHのスタックを他にも用意すれば、6001000Hまで、
スレーブSHのスタックを他に用意すれば、6000E00Hまで、

それぞれ使用可能です。

6000000H     ┏━━━━━━━━━━━━┓
             ┃ ベクタ、常駐ルーチン ┃
6000E00H     ┣━━━━━━━━━━━━┫
             ┃ スレーブSHスタック ┃
6001000H     ┣━━━━━━━━━━━━┫
             ┃ マスターSHスタック ┃
6002000H     ┣━━━━━━━━━━━━┫
             ┃            ┃


SEGAロゴからブラックアウトした瞬間にトレイを開けると暴走する。

Q)
1st Read Fileを読み込んだ後SEGAロゴが出てきますが、これがBlackOutして 画面が黒くなった直後に、CDトレイを開けるとプログラムが暴走します。
普段のゲーム中はCDトレイを開けても問題なくマルチプレイヤ画面に 飛ぶんですが、この時だけCDトレイを開けると暴走します。何故でしょう?

A)
このような症状の際考えられる原因として最もなのは、 CDトレイオープンチェックを怠っている場合です。
細かな原理から説明すると、 画面がブラックアウトした時点で制御は、アプリケーションプログラムに 移っています。
この後、もしプログラムを新たにロードするような場合、 トレイオープンチェックが行なわれていないと、プログラムデータが 不完全にロードされた状態で、プログラムがコールされる事になります。
その後の結果は自明の事とは 思いますが、アプリケーションは暴走します。
つまり、アプリケーション側では常にトレイオープンをしなければなりません。
又、ごく稀に(相当シビアなタイミングですが)GFSライブラリのバグとして、 この様な症状になる事が確認されています。
もし、上記のような対策を行なっているにも関わらず、同様の症状が 発生する場合、GFSのバグも考えられますので、最新のGFSライブラリ (SGLの場合lincd.aファイル)に差し替えてください。


3Dモデルの階層構造について教えて下さい。

Q)
今度3Dの多関節のゲームを作ろうと思っているのですが、3Dの間接構造を持つ データの操作など良く分かりません。
3Dのゲーム作成について教えてください。

A)
一般に階層構造を持つような3Dゲームを作成する際にはモデルの親子構造から 子どものデータを算出するような方法をとります。
つまり、子どもは親からの相対成分のみを持ち親の演算が終了した時点で、 親のデータを使って子どもの座標を計算します。
親の位置情報を行列で持っている場合、子どもの座標を計算するには、子どもの 親の行列に対して子どもの相対成分を3Dのアフィン変換を施して生成します。 これがSGLの場合だとシステムの持つ関数で容易にできます。
勿論SBLでは出来ないというのではなくSGLのほうがより容易に出来ます。 ※SGLには、Virtua FighterのAKIRAモデルを使用したサンプルがありますが、 このサンプルプログラムの階層構造は、非常に特殊な方法を用いており、 そのまま参考にするのには大変不向きです。
もし、階層構造のサンプルにしたいのであれば、s_8_12(IRIXの場合 sample_8_12)を御覧ください。この考え方自体はSGLでもSBLでも同様に 使えます。


戻る|   ■
FAQプログラム全般
Copyright SEGA ENTERPRISES, LTD,. 1997