#35 [Tech]
Q. PSでのパレットのアニメーションのさせ方を教えて下さい。

A. <一部修正記事>( KBO さん )

GsSPRITE構造体のcx、cyがclutの位置です。 パレットの何番と言う考え方がないんです。
ですから、VRAMの”どこ”に置くかなんで、cx、cyという 訳です。
付属のTIMユーティリティで、パレット原点っていうのが、 パレットの位置です。 とりあえず、(0、480)からが、オーソドックスな使い方みたいです。
CLUT(カラールックアップテーブル)です。(確か・・・) ここの位置をカラーとして参照しますよ〜んって事だと思います。


#36 [DK Soft]
Q. DXFモデルデータの倍率を変更したいのですが

A. <編集記事>( 加澤さん、KBOさん )

RSDLINKで、倍率は変えられます。

dxf2rsdw で「情報」をみてモデルの大きさを調べ、「倍 率」を適当に設定してます



#37 [DK Soft]
Q. gdb.exe コマンドを使用する場合の注意は?

A. <一部修正記事>( Development Tool FL さん )

 gdb.exe コマンドでデバッグを行う場合、デバッグの対象となるプログラムの
コードサイズが大きい場合、実行中にハングアップするという現象が起こります。
 これは、プログラムの実行前にスタックポインターの再初期化を行っていない為、
スタックがオーバーフローすることによって発生する現象です。

 この問題を解決する為に、プログラムの実行前に以下の設定を行ってください。

	set $sp=0x801ffff0

または、下記の様に gdb.ini の最後に設定行を追加してください。

	\psx\sample\check\gdb.ini file :

	file main
	start-remote-debugging
	load
	set $sp=0x801ffff0


#38 [Tech][Lib]
Q. GsSPRITE構造体について教えて下さい

A. <一部修正記事>( KBO さん )

ライブラリリファレンス(以下、ラブリ)の55ページ
GetTPageでとってきた値を、tpageに入れればOKです。
clut(cx,cy)については、自分で描いた絵のパレットのアドレスを
入れればいいはずです。

u,vですが、・・・これはVRAMの構造が完全に理解できて
ないと解らないはずなので、VRAMの説明をします。
初めてPSやる人の半分は、絶対少しはこんがらがると思うネタ
ですね。(笑)

VRAMの1つの単位を”ピクセル”と言います。
このピクセルは”16ビット”です。
VRAMの大きさは、1024*512ピクセルです。
Y軸方向に関しては、16、256、・・・色、どれをとっても
1ドット1ピクセルです。
X軸は、この色モードで変わります。
(とくに色モードはありません。自分がどう使うかです。)
なぜなら16色は4ビットで十分現せるし、256色なら8ビット、
まぁそれ以上なら、その分のビット。
65536色で使うなら1ドット1ピクセル。
すごく分かり易いですね。
となると、256色で2ドット1ピクセル。
16色として使うと、1ピクセルで4ドット表示できますね。

以下16色固定で説明!!!!!!
1ページの限界は256*256ドットですので、
16色なら64*256ピクセル。

        64   320  384   448   ~1024
  0+----+.....+----+----+...
   |    |     |    |    |
   |    |     | A |    |
   |    |     |    |    |
   |    |     |    |    |
256+----+.....+----+----+...
   |    |     |    |    |
   | P |     |    |    |
   |    |     |    |    |
   |    |     |    |    |
512+----+.....+----+----+...


こんな感じで、図を描いてみてください。
私はMACで、原稿にしてコピーして使ってます。
ナイと不便だと個人的には思うので、とりあえず、まだ解らないと
言う方には、図を描く事を薦めます。その後実作業でも使えると思
います。

通常、ダブルバッファは(0、0)〜(320、480)で使うと
思うので、キャラクター類は、図中の”A”の所から使うと思います。
パレットは、(0、480)から(0、511)で使うのが無難でし
ょう。(図中P)

じゃあキャラクター16*16を描いて見ましょう。描いたら
イメージ原点、(320、0)でセーブしてみましょう。
この時の、u,vは、(0、0)です。
(384、0)でセーブしてもu,vは(0、0)です。
ページはGetTPageで拾います。

もう一つキャラクター8*8で描いてみましょう。
16*16の右隣におきます。
イメージ原点は、絶対座標(?ピクセル単位だと思った。)ですので
16*16ドットは、4*16ピクセルですので、
(320+16/4、0)になります。

(うーん、多分そうだと思います。自分では、こうやらないから
少し不安)

cx,cyは、パレット原点をそのまま、入れればいいと思いますが?
初めて作るなら、(0、480)にパレットにしてみれば、
分かり易いと思います。サンプルとかも、ここから使ってます。
	sp->cy = 480+(i%32);<----コレ


#39 [Tech]
Q. HSS (binary protocol) について教えて下さい。

A. <無修正記事>( Development Tool FL さん )

HSS (binary protocol) について

  HSS (binary protocol) は gdb の original からある remote protocol
  を binary format に独自に拡張した protocol で、HSS は High Speed Serial
  の頭文字から命名しました。original の remote protocol と異なり binary
  data をそのままやり取りするため 8bit すべてが透過である通信路に限り
  使用することが可能です。


・packet format

      +0   +1   +2   +3
    +----+----+----+----+
 +0 |    magic     |code|
    +----+----+----+----+
 +4 |      address      |
    +----+----+----+----+
 +8 | length  |   sum   |
    +----+----+----+----+
 +12| data ...          |
    +----+----+----+----+

  # data 部を含めパケットのすべてのフィールドは little endian です。

  magic - パケットの先頭を示すためのマジックナンバー。
	  先頭から 'H' (0x48), 'S' (0x53), 's' (0x73) の 3 byte。

  code  - パケットコード (0 - 13)

     HSS_ACK	0	直前に受信したパケットの sum 値が正しい
     HSS_NAK	1	直前に受信したパケットの sum 値が正しくない
     HSS_OK	2	コマンドを正常に実行した
     HSS_NG	3	不正なパラメータなどの理由でエラーが発生
     HSS_RDREG	4	レジスタの読み込み
     HSS_WRREG	5	レジスタの設定
     HSS_RDMEM	6	メモリの読み込み
     HSS_WRMEM	7	メモリの設定
     HSS_CONT	8	プログラムの継続実行
     HSS_STEP	9	プログラムのステップ実行
     HSS_SIGNAL	10	プログラムの中断報告
     HSS_QUERY	11	中断理由の問い合わせ
     HSS_SEND	12	メッセージ送信
     HSS_UNIMP	13	インプリメントしていない機能であることを示す

  address - HSS_RDREG,HSS_WRREG の場合はレジスタ番号。
            HSS_RDMEM,HSS_WRMEM の場合はメモリ先頭アドレス。

  length - パケット中の(ヘッダを含まない)データのバイト数。

           パケット全体のバイト数はヘッダの大きさである 12 バイト
           に length を加え、さらに length が奇数である場合には
           0 の padding が 1 バイト追加されます。

	   length が偶数の場合: 12 + length がパケット全体の大きさ
	   length が奇数の場合: 12 + length + 1 がパケット全体の大きさ

  sum - ヘッダおよびデータ部すべてのチェックサム。
        データが奇数バイトの場合は 0 で padding して計算します。
        計算方法は RFC1071 で定義されている方法です(補足参照)。

  data - データ。データの最大長は現在の実装では 1500 byte です。


・protocol

  以下にそれぞれのコードに対する正常な応答の場合のやり取りを示します。
  "->" は host から target へのパケットを示し、"<-" は target から host
  へのパケットを示します。

  HSS_RDREG(address=レジスタ番号,length=0) ->
	<- HSS_ACK
	<- HSS_OK(length=4,data=レジスタ値)

  HSS_WRREG(address=レジスタ番号,length=4,data=レジスタ値) ->
	<- HSS_ACK
	<- HSS_OK(length=0)

  HSS_RDMEM(address=メモリアドレス,length=4,data=バイト数)->
	<- HSS_ACK
	<- HSS_OK(length=バイト数,data=メモリ値)

  HSS_WRMEM(address=メモリ先頭アドレス,length=バイト数,data=メモリ値) ->
        <- HSS_ACK
	<- HSS_OK(length=0)

  HSS_CONT(), HSS_STEP() ->
	<- HSS_ACK
	   (exception が発生するまでプログラムを実行)
	<- HSS_SIGNAL(length=4,data=例外番号)

  HSS_QUERY() ->
	<- HSS_ACK
	<- HSS_SIGNAL(length=4,data=最後に発生した例外番号)

  <- HSS_SEND(length=メッセージのバイト数,data=メッセージ)
	-> HSS_ACK

  未定義(または未インプリメント)のコード() ->
	<- HSS_ACK
	<- HSS_UNIMP(length=0)


・レジスタ番号

   0	$zero
   1	$at
   2	$v0
	...
  31	$ra
  32	$sr
  33	$lo
  34	$hi
  35	$bada
  36	$cr
  37	$epc
  89	$prid


・例外番号

  例外番号	シグナル名	R3000 の対応する例外の名称
     1		SIGHUP		その他
     2		SIGINT		未使用
     3		SIGQUIT		未使用
     4		SIGILL		Sys,RI,CpU,Ovf
     5		SIGTRAP		Bp
     6		SIGABRT		未使用
     7		SIGEMT		未使用
     8		SIGFPE		未使用
     9		SIGKILL		未使用
    10		SIGBUS		AdEL,AdES
    11		SIGSEGV		IBE,DBE
    12		SIGSYS		未使用

  # 現在の実装では Int (外部割り込み) と Sys (システムコール) は
  # remote 側で hook していない。


・HSS_NG

  コマンドの実行の応答として HSS_OK ではなく HSS_NG が返されるのは
  以下のような場合です。

    1) HSS_WRREG,HSS_RDMEM で length が 4 ではない。

    2) コマンド実行中のメモリアクセスで Address Error や Bus Error が発生。

  HSS_NG のパケットの形式は HSS_NG(length=4,data=エラーコード) ですが、
  エラーコードは 0 ではない事が保証されるだけで、その値に関してはこの
  protocol では定めない実装依存です。


*補足   
checksumを計算する部分は下のようになっています。

u_short hss_sum(void *cp, int len){
        u_short *p = (u_short *)cp;
        u_long v = 0;

        while(0 < len)
                v += *p++, len -= sizeof(u_short);
        while(v >> 16)
                v = (u_short)v + (v >> 16);
        return(v);
}


Copyright (C) 1996 by Sony Computer Entertainment Inc.
        Allrights Reserved


#40 [DK Soft]
Q. ld がうまく動いてくれません。

A. <編集記事>( ごう さん )

ld -L/psx/lib ほにゃらら

でリンカは問題なく動きます。 ただ他にもオプションが必要かも知れないので、gcc 経由で使った方が いいかなと思います。

ld のマニュアルはごうさんが集めてページ
http://www.netyaroze-europe.com/~crj00686
において下さっています。御参照下さい。



#41 [Tech]
Q. PSで単純なグラフィックス(lineやcircle)を書くにはどうしたらいいのでしょうか?

A. <一部修正記事>( 佐々木 さん )

概念的なとこだけ説明します。

1.メインメモリに仮想VRAMをallocする。
  allocした領域に描画を行う。
  描画は当然ながらCPUがノロノロと描画する(^^;

2.このVRAM表示を行うために、以下の手順でフレームバッファ転送を
  する。

	RECT	rect ;

   if( GsGetActiveBuff() == 0) {
		rect.x = 0 ; rexr.y = 0 ;
		rect.w = 320 ; rect.h = 240 ;
		LoadImage( &rect, vram) ; /*この関数、結構速いです */
                                    /*仮想VRAM(vram)を描画 */
	 } else {
		rect.x = 0 ; rexr.y = 240 ;
		rect.w = 320 ; rect.h = 240 ;
		LoadImage( &rect, vram) ;
	 }

3.上記の処理をOT描画前に実行し、DrawSync()する。
  ※この処理はOT描画前に毎回行わなければいけない。
  ※効率からいけば、DrawSync()はもったいないような...


4.上記の手順によってBGを使わずに背景描画が出来る。
  また、この処理はスプライトと共存が出来ることが実験で確認済み。

※CPU描画が圧倒的に遅い場合は、VSyncCallback()を
 使って描画フックを行います。


うーん、ごめんなさい。
これで、理解出来るでしょうか?(^^;
リアルタイムゲームでは速度的にきつい描画方法ですが、この方法なら
ばパソコン画面のように描画できます。
下回り関数とか、フリーソフトからひぱってきて描画環境構築出来てた
のですが。申し訳ないです(^^;


#42 [PC][DK Soft]
Q. フリーのモデラ「六角大王」で、個々のポリゴンの表裏を反転させるには?

A. <一部修正記事>( 加澤 さん )

はーい。僕の場合はですね、plyファイルを直接手で編集してポリゴンをひっく り返しています(^^;。ポリゴンの定義は頂点の列でなされているので、第2頂 点と第3頂点を入れ替えます(頂点データの回転方向で表裏を判断しているの で)。ただし、簡単なモデルでないとわけわか状態になるでしょう(法線デー タはどおすんじゃ、コラ→俺)。

それよりは、六角大王でポリゴンを塗るときにすべて同じ向きで塗るようにす ればいいんじゃないでしょうか。ただ、六角は左右対称なモデルしか作成でき ない関係で、ポリゴンの塗りも左右対称(つまり線対称。右と左でポリゴンが 逆になる)に塗りがちです。そこで、四角ポリゴンを三角に割るときに、かな らず対角頂点同士を結んでしまい、すべて同じ向きで塗るようにします(う〜 ん。わかりにくい説明だ)。塗りに関しては左右対称でなくとも OK なんです ね。



#43 [Tech]
Q. 点光源ってサポートされないんでしょうか?

A. <一部修正記事>( Mr.K さん )

詳しいことは私も分からないのですが(最近こればっかだな(^^;)、User's Guide を見てみると、法線ベクトルと光源ベクトルとの内積にて光源計算を行っているよ うなので、光源が点光源だと、光源ベクトルが固定できないから、未サポートなの かもしれませんね。

やはり擬似的に表現するしかないと思います。



#44 [PC][DK Soft][Other]
Q. モデルにきれいにテクスチャを貼れるツールについて教えていただけませんか?

A. <一部修正記事>( Mr.K さん )

私はやったことないんですが、

・ここまでできる「超」テク「六角大王」チュートリアルブック

 サリュート出版局 定価2300円

という本には、STARATA STUDIO Pro1.75j を利用して
六角大王で作ったモデリングデータにテクスチャを貼るという動作を紹介してい
ました。かなりきれいに貼れていました。


#45 [Tech]
Q. TIM形式のファイルはどうやってプログラムに取り込むのでしょう?

A. <一部修正記事>( Mr.K さん他 )

TIMファイルっていうのは、貼り付ける相手によって扱う方法が少し変わるかと
思いますが、基本的には以下のようにやるようです。

1)前もってメインメモリにsioconsなどでロードしておく
2)RECTで矩形を決め、LoadImage()関数でフレームバッファにロード
3)ロードした矩形を、貼り付けられる側から呼ぶ
  GsSPRITEなら、メンバに tpage u v (CLUTがあるなら cx cy も)があるので、
  それにより設定。

流れ的にはこれで問題ないと思います。


#46 [PC][DK Soft][Other]
Q. GNUの開発環境について知りたいのですが

A. <編集記事>( ごう さん他 )

http://www.cygnus.com/misc/gnu-win32/ に案内があります。ただし、英語。

このページの大まかな内容ですが、GNU-WIN32プロジェクトってのがあって、
その最終目的は WIN32 (Windows95,Windows NT)で十分なUNIX環境をそろえる
ことだということが書いてます。
で、興味のある人はMLにどうぞ、ってあんないです。

現在までの成果は公開されています。
そのページのなかほどからたどれますが、
ftp://ftp.cygnus.com/pub/gnu-win32
にあります。最新は beta14 のようです。
ここから、all.zip (または必要なものを個別に)とってきて、ルートで
展開すると、/usr/bin とか /usr/lib とかが作成されて、/usr/bin 以下に
コマンドが展開されます。
ここにパスを切ればそのまま利用できます。

UNIX の基本コマンドのかなりの部分がそろっています。
なんと、WIN32アプリが開発できる gcc(含むg++)およびライブラリ一式まで
はいっています。
# socket まわりはまだ実験中のようです。
また、ごうさんのホームページhttp://www.netyaroze-europe.com/~crj00686/に関連リンクが多数あります。ご利用下さい。


#47 [PC][DK Soft]
Q. 六角大王で色が塗れないのですが

A. <一部修正記事>( UNY さん )

dxf2rsdでコンバートする時に色をつけたい場合、別ファイルで色を
指定したものをスイッチで指定しないと色がつかず真っ白になります。
具体的には、まずDXFファイルで「未定義の色情報をファイルにする」ため、
一度dxf2rsdに−clオプションをつけ、ファイルを作成します。
標準出力なのでリダイレクトでファイルを作成します。
で、できたファイルをエディタでオープンすると、色番号だけがありますから、
そこにRGBの順で色を定義してやります。そしてセーブして、今度は
もう一度dxf2rsdに−cfオプションで色データファイルといっしょに
dxfファイルを食わせますと、色つきのRSDファイルができます。
詳しくはUser's Guide の120ページ(例2 カラー情報の利用)を参照
して下さい。

 実際の色の塗り方ですが、まだ面に色がついてない状態で塗るには、
面を構成する線を全て指定して(赤色にして)から「選択範囲を塗る」とやると
塗れるようです。ちなみに複雑なモデルの場合は全面塗る、とやると全く
意図しない面も塗られ、ひいてはそれがポリゴンになってしまうので、
できれば面倒でも一枚一枚塗る方が確実だと思います。




Tatsumi SAKAGUCHI NY Home Page

[Beginner] [HotNews] [Forum] [Gallery] [Member's Home] [Help]



このページはNetscape Navigator 2.0以降のブラウザに最適化されています。
SAKAGUCHI Tatsumi - tatsu@ee.seikei.ac.jp -