※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

DirectX及びそれに関係する数学知識とその他。
メモ帳なので間違ってなかったり間違ってたり。


マクロ
  • デグリーをラジアンに変換
D3DXToRadian( degree ) ( (degree) * (D3DX_PI / 180.0f) )

  • ラジアンをデグリーに変換
D3DXToDegree( radian ) ( (radian) * (180.0f / D3DX_PI) )

デグリー(degree) 360度が1周
ラジアン(radian) 2π(パイ)が1周


pVの方向に、Angleの量だけ回転した結果をpOutに格納する
D3DXMatrixRotationAxis( D3DXMATRIX *pOut, CONST D3DXVECTOR3 *pV, FLOAT Angle );

第二引数のpVは位置ベクトルではなく方向ベクトル。
なので、原点(0, 0, 0)と第二引数の位置にある点を結んだ直線が回転軸(回転方向)となる。


  • 4x4行列の掛け算

行列の掛け算は、賭ける順序により計算結果が変わる
計算結果 = スケーリング * 回転 * 移動
とすると大体望んだ結果になる。やりたい事次第だけど。

ビルボードをしたい場合
ビルボード = 上記の計算結果 * 逆行列


  • 指定した方向へ向きたい、角度を出したい、回転したい
D3DXVECTOR3 PosA,	// 回転したいオブジェクトの位置
      TargetB,	// ターゲット位置
      AxisC,	// 正面方向 (0.0f,0.0f, 1.0f)など
      AB,		// A→Bベクトル
      AC;		// A→Cベクトル

AB = D3DXVECTOR3( TargetB - PosA );	// A→Bベクトルを作成
AC = D3DXVECTOR3( AxisC - PosA );	// A→Cベクトルを作成

// 正規化
D3DXVec3Normalize( &AB, &AB );
D3DXVec3Normalize( &AC, &AC );

float rot = acos( D3DXVec3Dot(&AB, &AC) );	// 角度(なす角)を算出

// 方向を算出し、-であれば反転する
if( D3DXVec3Cross(&AB, &AC) < 0 )
{
    rot = -rot;
}

// その後は場合に応じてデグリーやラジアンに変換し使用する
例:D3DXMatrixRotationX( &Mat, D3DXToRadian(rot) );


#ifndef NDEBUG
// デバッグコンパイル時のみ通る処理
#endif


  • 1次元配列を2次元配列のように扱い、その2次元配列で扱った場合の配列番号を算出する方法
2次元配列のように扱う設定は以下とする。
Xの大きさ = 10
Yの大きさ = 20
配列の合計は、Xの大きさ * Yの大きさ の200個(0~199)である。

1次元での配列番号 % Xの大きさ = Xの配列番号
1次元での配列番号 / Xの大きさ = Yの配列番号
となり、
1次元配列[ Yの配列番号 * Xの大きさ + Xの配列番号 ]
という計算を行えば、目的の配列にアクセスが可能である。

例:
Xの大きさ = 10
Yの大きさ = 20
合計が200配列
1次元配列[ 135 ]の場合のXとYの配列番号を知りたい。

int x, y;
x = 135 % Xの大きさ;
y = 135 / Xの大きさ;
printf( " 1次元配列での配列番号:X = %d Y = %d" , x , y );


VC++デバッグ実行時のエラー

:場所 0xfeeefeeeを読み込み中にアクセス違反が発生しました。

は、newされたオブジェクトがdeleteされた等により、
無効となったオブジェクトにアクセスをしようとして発生するエラー。