#include "sgl.h"
void slInitMatrix( void )
void - 何も与えません。
void - 何も返しません。
マトリクス演算で使用する変数、バッファの初期化
マトリクスバッファの初期化をします。
slInitMatrix();
#include "sgl.h"
Bool slPushMatrix( void )
void - 何も与えません。
Bool - エラーが発生した場合NGが、成功した場合OKが返ります。
マトリクススタックのポインタを進め、カレントマトリクスをそれに
コピーします。
マトリクスは20個までネストできるが、これをオーバーするとエラーを返します。
カレントマトリクスをマトリクススタックにセーブして次の処理にその
マトリクスの内容を流用する。
slPushMatrix();
{
slScale(...);
:
この関数は階層構造のモデルなど過去のカレントマトリクス情報を保存する様な
組み方をする場合に使用します。
#include "sgl.h"
Bool slPushUnitMatrix( void )
void - 何も与えません。
Bool - エラーが発生した場合NG、成功した場合OKが返ります。
マトリクススタックのポインタを進め、そこに単位行列をセットします。
ネストしすぎた場合、エラーを返します。
マトリクスバッファに単位マトリクスを退避させる。
slPushUnitMatrix();
{
slTranslate( ... );
:
slPutPolygonX( ... );
}
slPopMatrix();
この時点でカレントマトリクスは単位行列になる。
#include "sgl.h"
Bool slIncMatrixPtr( void )
void - 何も与えません。
Bool - エラーが発生した場合NGが、成功した場合OKが返ります。
マトリクススタックのポインタを進めます。
マトリクスは20個までネストできるが、これをオーバーするとエラーを返します。
マトリクススタックのポインタを一つ進め、スタックオーバフローを起こして
いないか確認する。
if ( slIncMatrixPtr() == NG ) {
/* Stack Over flow. */
} else {
/* Stack safty. */
}
#include "sgl.h"
Bool slPopMatrix( void )
void - 何も与えません。
Bool - エラーが発生した場合NGが、成功した場合OKが返ります。
マトリクススタックのポインタをひとつ戻します。
戻しすぎた場合には、エラーを返します。
カレントマトリクスに退避したマトリクスを復活させ流用する。
slPushMatrix(); <-- (A)
{
slTranslate( .. );
:
}
slPopMatrix(); <-- (B)
(B)の時点ではカレントマトリクスは(A)と同じ状態になる。
#include "sgl.h"
Bool slDecMatrixPtr( void )
void - 何も与えません。
Bool - エラーが発生した場合NGが、成功した場合OKが返ります。
マトリクススタックのポインタをひとつ戻します。
戻しすぎた場合、エラーを返します。
マトリクススタックのポインタを一つ戻しスタックアンダーフローを起こして
いるか調べる。
if ( slDecMatrixPtr() == NG ) {
/* Stack underflow. */
} else {
/* Stack safty. */
}
slPushMatrix();
{
:
}
slDecMatrixPtr();
slPopMatrixと同様の機能を持つ関数です。
#include "sgl.h"
MATRIX *mtptr;
void slUnitMatrix( mtptr )
MATRIX *mtptr - 単位行列にしたいマトリクスを表すMATRIXデータ型へのポインタ
void - 何も返りません。
指定されたマトリクスを単位行列にします。マトリクスに CURRENTを指定
した場合、マトリクススタックのカレントマトリクスを対象にします。
#include "sgl.h"
MATRIX *mtptr;
void slUnitAngle( mtptr )
MATRIX *mtptr - 単位化したいマトリクスを表すMATRIXデータ型へのポインタ
void - 何も返りません。
マトリクスの回転部分(3×3)を単位行列にする。平行移動部分は変更しません。
マトリクスに CURRENT を指定した場合カレントマトリクスを変更します。
#include "sgl.h"
MATRIX *mtptr;
void slUnitTranslate( mtptr )
MATRIX *mtptr - 平行成分を0にしたいマトリクスを表すMATRIXデータ型への
ポインタ。
void - 何も返りません。
マトリクスの平行移動部分を0にします。回転部分は変更しません。
マトリクスに CURRENT を指定した場合カレントマトリクスを変更します。
マトリクスの平行移動成分を0にする。
MATRIX matr
:
slUnitTranslate( &matr );
#include "sgl.h"
MATRIX *mtptr;
void slLoadMatrix( mtptr )
MATRIX *mtptr - カレントマトリクスにコピーしたいマトリクスを示す
MATRIXデータ型へのポインタ。
void - 何も返りません。
カレントマトリクスに指定されたマトリクスをコピーする。
カレントマトリクスに指定したマトリクスの内容をコピーする。
MATRIX matr = {
:
};
slPushMatrix();
{
slLoadMatrix( &matr );
slRotX( ... );
:
}
slPopMatrix();
#include "sgl.h"
Bool slCopyMatrix( void )
void - 何も与えません。
Bool - エラーが発生した場合NGが、成功した場合OKが返ります。
カレントマトリクスにひとつ前のマトリクスをコピーします。
マトリクスがネストされていない場合にはエラーを返します。
マトリクススタックの内容をカレントマトリクスに入れ、マトリクススタックの
ポインタを一つ減らす。
: <-- (A)
slPushMatrix();
{ <-- (B)
slTranslate( .. );
:
slCopyMatrix(); <-- (C)
}
slPopMatrix();
: <-- (D)
(C)の時点ではカレントマトリクスは(A)と同じ状態になる。
但しマトリクススタックのポインタは操作されないので、(C)の時点でのマトリクス
スタックの状態は(B)と同じ状態で(A)と同じ状態ではない。(D)の時点で始めて、
(A)と同じ状態になる。
#include "sgl.h"
MATRIX *mtptr;
void slRegistMatrix( mtptr )
MATRIX *mtptr - マトリクススタックへ登録したいマトリクスを表す
MATRIXデータ型へのポインタ。
void - 何も返りません。
マトリクスバッファに指定されたマトリクスをコピーします。
マトリクスに CURRENT を指定した場合、マトリクススタックのカレント
マトリクスを対象にします。
指定したマトリクスをマトリクススタックに登録する。
MATRIX matr;
:
slRegistMatrix( &matr );
#include "sgl.h"
MATRIX *mtptr;
void slGetMatrix( mtptr )
MATRIX *mtptr - カレントマトリクスの内容をコピーするMATRIX型データへの
ポインタ。
void - 何も返りません。(但し処理の結果は引数のmtptrで示されるMATRIXデータ
に反映されます。)
カレントマトリクスを指定されたマトリクスにコピーします。
カレントマトリクスの内容を別の場所にコピーする。
MATRIX *matr;
slGetMatrix( matr );
matrにカレントマトリクスの内容がコピーされる。
#include "sgl.h"
FIXED pos[XYZ]
void slGetTranslate( pos )
FIXED pos[XYZ] - 取り出した平行成分を保存するFIXED型配列へのポインタ。
void - 何も返りません。(但し処理の結果は引数のposで示されるFIXED型データ
に反映されます。)
カレントマトリクスから平行移動成分を取り出し、指定されたバッファにコピー
します。
#include "sgl.h"
FIXED x_dif, y_dif, z_dif;
void slLoadTranslate( x_dif, y_dif, z_dif )
FIXED x_dif - 平行移動成分のX値。
FIXED y_dif - 平行移動成分のY値。
FIXED z_dif - 平行移動成分のZ値。
void - 何も返しません。
カレントマトリクスの平行移動部分のみを更新します。
#include "sgl.h"
void slInversMatrix( void )
void - 何も与えません。
void - 何も返しません。
カレントマトリクスを逆行列にする。
#include "sgl.h"
void slTransposeMatrix( void )
void - 何も与えません。
void - 何も返しません。
カレントマトリクスを転置行列にします。
#include "sgl.h"
ANGLE angx;
void slRotX( angx )
ANGLE angx - 回転角
void - 何も返しません。
カレントマトリクスに対し、X軸回りの回転行列を掛けます。
回転マトリクスは
1.0 0.0 0.0 0.0
0.0 cosΘ sinΘ 0.0
0.0 -sinΘ cosΘ 0.0
0.0 0.0 0.0 1.0
slRotXSC |
slRotY |
slRotYSC |
slRotZ |
slRotZSC |
slRotAX |
slZrotR |
mtptr |
#include "sgl.h"
FIXED sin;
FIXED cos;
void slRotXSC( sin, cos )
FIXED sin - 回転変換の際に与えるsinの値。
FIXED cos - 回転変換の際に与えるcosの値。
void - 何も返しません。
サインと、コサインを指定して、X軸回りの回転をします。
1.0 0.0 0.0 0.0
0.0 cos sin 0.0
0.0 -sin cos 0.0
0.0 0.0 0.0 1.0
slRotX |
slRotY |
slRotYSC |
slRotZ |
slRotZSC |
slRotAX |
slZrotR |
mtptr |
#include "sgl.h"
ANGLE angy;
void slRotY( angy )
ANGLE angy - 回転角
void - 何も返しません。
カレントマトリクスに対し、Y軸回りの回転行列を掛けます。
cosΘ 0.0 -sinΘ 0.0
0.0 1.0 0.0 0.0
sinΘ 0.0 cosΘ 0.0
0.0 0.0 0.0 1.0
slRotX |
slRotXSC |
slRotYSC |
slRotZ |
slRotZSC |
slRotAX |
slZrotR |
mtptr |
#include "sgl.h"
FIXED sin;
FIXED cos;
void slRotYSC( sin, cos )
FIXED sin - 回転変換の際に与えるsinの値。
FIXED cos - 回転変換の際に与えるcosの値。
void - 何も返しません。
サインと、コサインを指定して、Y軸回りの回転をします。
cos 0.0 -sin 0.0
0.0 1.0 0.0 0.0
sin 0.0 cos 0.0
0.0 0.0 0.0 1.0
slRotX |
slRotXSC |
slRotY |
slRotZ |
slRotZSC |
slRotAX |
slZrotR |
mtptr |
#include "sgl.h"
ANGLE angz;
void slRotZ( angz )
ANGLE angz - 回転角
void - 何も返しません。
カレントマトリクスに対し、Z軸回りの回転行列を掛けます。
cosΘ sinΘ 0.0 0.0
-sinΘ cosΘ 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
slRotX |
slRotXSC |
slRotY |
slRotYSC |
slRotZSC |
slRotAX |
slZrotR |
mtptr |
#include "sgl.h"
FIXED sin;
FIXED cos;
void slRotZSC( FIXED sin , FIXED cos )
FIXED sin - 回転変換の際に与えるsinの値。
FIXED cos - 回転変換の際に与えるcosの値。
void - 何も返しません。
サインと、コサインを指定して、Z軸回りの回転をします。
cos sin 0.0 0.0
-sin cos 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
slRotX |
slRotXSC |
slRotY |
slRotYSC |
slRotZ |
slRotAX |
slZrotR |
mtptr |
#include "sgl.h"
FIXED vecx, vecy, vecz;
ANGLE ang;
void slRotAX( vecx, vecy, vecz, ang )
FIXED vecx - 回転軸を表すベクトルのX成分
FIXED vecy - 回転軸を表すベクトルのY成分
FIXED vecz - 回転軸を表すベクトルのZ成分
ANGLE ang - 回転角
void - 何も返しません。
原点を通る任意軸回りの回転をする。軸は単位ベクトルで指定します。
NxNx(1-C)+C NxNy(1-C)+NzS NxNz(1-C)-NyS 0.0
NyNx(1-C)-NzS NyNy(1-C)+C NyNz(1-C)+NxS 0.0
NzNx(1-C)+NyS NzNy(1-C)-NxS NzNz(1-C)+C 0.0
0.0 0.0 0.0 1.0
Nx、Ny、Nzは 軸を表す単位ベクトルの成分。
C はコサイン 、S はサイン を表す。
slRotX |
slRotXSC |
slRotY |
slRotYSC |
slRotZ |
slRotZSC |
slZrotR |
mtptr |
#include "sgl.h"
FIXED x_dif, y_dif, z_di;f
void slTranslate( x_dif, y_dif, z_dif )
FIXED x_dif - 平行移動のX成分
FIXED y_dif - 平行移動のY成分
FIXED z_dif - 平行移動のZ成分
void - 何も返しません。
カレントマトリクスに対し、平行移動を行います。
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
tx ty tz 1.0
slGetTranslate |
slRegistTranslate |
mtptr |
#include "sgl.h"
FIXED x_dif, y_dif, z_di;f
void slRegistTranslate( x_dif, y_dif, z_dif )
FIXED x_dif - 平行移動のX成分
FIXED y_dif - 平行移動のY成分
FIXED z_dif - 平行移動のZ成分
void - 何も返しません。
マトリクスバッファに対して、平行移動したものを、カレントマトリクスに
コピーします。ただし、マトリクスバッファは変更されません。
#include "sgl.h"
FIXED scl_x, scl_y, scl_z;
void slScale( FIXED scl_x, FIXED scl_y, FIXED scl_z )
FIXED scl_x - X方向のスケール値。
FIXED scl_y - Y方向のスケール値。
FIXED scl_z - Z方向のスケール値。
void - 何も返しません。
カレントマトリクスに対してスケーリングします。
scl_x 0.0 0.0 0.0
0.0 scl_y 0.0 0.0
0.0 0.0 scl_z 0.0
0.0 0.0 0.0 1.0
mtptr |
#include "sgl.h"
MATRIX mtrx
void slMultiMatrix( mtrx )
MATRIX mtrx - カレントマトリクスに掛けたいマトリクス。
void - 何も返しません。
カレントマトリクスに指定されたマトリクスを掛けます。
#include "sgl.h"
FIXED camera[XYZ];
FIXED target[XYZ];
ANGLE angz;
void slLookAt( camera, target, angz )
FIXED camera[XYZ] - カメラ(視点の位置)
FIXED target[XYZ] - 視線方向を表すベクトル。
ANGLE angz - 視線方向に対する回転成分。
void - 何も返しません。
カメラ位置から目標方向を見るマトリクスをカレントマトリクスに掛けます。
その際、Z軸回りに回転もします。
Y軸に沿うような方向では、XZ平面上でのベクトルが小さくなり、正しく計算
できない場合があります。
mtptr |
#include "sgl.h"
FIXED obj[XYZ];
FIXED size;
FIXED slCheckOnScreen( obj, size )
FIXED obj[XYZ] - オブジェクトの位置。
FIXED size - オブジェクトの半径。
FIXED オブジェクトのZポジション。画面外の時は負数を返します。
指定されたオブジェクトのポジションをカレントマトリクスを通して変換し、
その位置で指定されたサイズの物体が画面に表示されるかをテストし、結果を
返します。
スクリーンよりも手前の場合には -1(FFFFFFFF)、上下左右に出ている場合には
-2(FFFFFFFE)、画面内の場合にはZポジションを返します。
if ( slCheckOnScreen( obj, obj_size ) < toFIXED( 0.0 ) ) {
/* スクリーン内には表示されないので描画しない。 */
} else {
slPutPolygonX( ... );
}
slCheckOnScreen0 |
slConvert3Dto2DFX |
slConvert3Dto2D |
mtptr |
#include "sgl.h"
FIXED size[XYZ];
FIXED slCheckOnScreen0( size )
FIXED size - オブジェクトの半径。
FIXED オブジェクトのZポジション。画面外の時は負数を返します。
ポジション(0,0,0)にあるオブジェクトが指定されたサイズで画面に表示されるか
をテストし、結果を返します。
スクリーンよりも手前の場合には -1(FFFFFFFF)、上下左右に出ている場合には
-2(FFFFFFFE)、画面内の場合にはZポジションを返します。
slCheckOnScreen |
slConvert3Dto2DFX |
slConvert3Dto2D |
mtptr |
#include "sgl.h"
FIXED pos_x, pos_y, pos_z;
FIXED ans[XYZ];
void slCalcPoint( pos_x, pos_y, pos_z, ans )
FIXED pos_x, pos_y, pos_z - カレントマトリクスで変換したい点。
FIXED ans[XYZ] - 演算結果を入れるためのFIXED型配列。
void - 何も返しません。(但し演算の結果は、引数で与えるansに入ります。)
指定されたポイントをカレントマトリクスで座標変換した結果をバッファに
返します。
→
a = ( pos_x, pos_y, pos_z )
→
b = ans
カレントマトリクスが、Mの時、
→ →
b = M・a
の計算を行ないます。
slPushMatrix();
{
slScale( ... );
:
slPutPolygonX( ... );
slCalcPoint( ... );
}
slPopMatrix();
mtptr |
#include "sgl.h"
FIXED pos[XYZ];
FIXED ans_fx[XY];
Sint32 ans_si[XY];
FIXED slConvert3Dto2DFX( pos, ans_fx );
FIXED slConvert3Dto2D( pos, ans_si );
FIXED pos[XYZ] - 画面座標に変換したい座標(但し、カレントマトリクスで
与える座標空間での座標値
つまり相対座標になります。)
FIXED ans_si[XY] - 演算の結果を入れるFIXED型配列。
FIXED ans_fx[XY] - 演算の結果を入れるFIXED型配列。
FIXED 与えた座標のZポジション。(演算結果は引数に与えるansに返ります。)
カレントマトリクスを使用して、3D相対座標posから実際画面上に表示する際の
画面座標値ans_fx/ans_siを返します。関数値として、Z値を返します。
あるモデルの中心位置の画面座標を求める。
FIXED pos[ XYZ ] = { toFIXED( 1.0 ), toFIXED( 2.0 ), toFIXED( 3.0 ) };
FIXED ans[ XY ];
:
slPushMatrix();
{
slTranslate( toFIXED( 3.5 ), toFIXED( 6.2 ), toFIXED( 2.1 ) );
slRotX( DEGtoANG( 20.0 ) );
slRotY( ang_para_y );
slRotZ( ang_para_z );
slPutPolygon( ... );
slConvert3Dto2D( pos, ans );
}
slPopMatrix();
slCheckOnScreen |
slCheckOnScreen0 |
mtptr |