C++ ミサイルの回転プログラム

2015/07/12

以前作ったミサイルの軌跡を描画するC++プログラムで、ミサイル部分をつけました。とりあえずダミーの三角錐を描画したものです。

ミサイルの前のフレームの座標と今のフレームの座標の方向に向かせるようにしただけです。Maya でいうエイムコンストレイン的なやつです。

ある対象の方向を向かせるための回転行列を取得する関数を載せておきます。


void LookAt(
    float *o_matrix4x4,
    float eye_x, float eye_y, float eye_z,
    float target_x, float target_y, float target_z,
    float up_x, float up_y, float up_z)
{
    target_x = eye_x - target_x;
    target_y = eye_y - target_y;
    target_z = eye_z - target_z;
    float length = sqrtf(target_x * target_x + target_y * target_y + target_z * target_z);
    o_matrix4x4[2] = target_x / length;
    o_matrix4x4[6] = target_y / length;
    o_matrix4x4[10] = target_z / length;

    target_x = up_y * o_matrix4x4[10] - up_z * o_matrix4x4[6];
    target_y = up_z * o_matrix4x4[2] - up_x * o_matrix4x4[10];
    target_z = up_x * o_matrix4x4[6] - up_y * o_matrix4x4[2];
    length = sqrtf(target_x * target_x + target_y * target_y + target_z * target_z);
    o_matrix4x4[0] = target_x / length;
    o_matrix4x4[4] = target_y / length;
    o_matrix4x4[8] = target_z / length;

    o_matrix4x4[1] = o_matrix4x4[6] * o_matrix4x4[8] - o_matrix4x4[10] * o_matrix4x4[4];
    o_matrix4x4[5] = o_matrix4x4[10] * o_matrix4x4[0] - o_matrix4x4[2] * o_matrix4x4[8];
    o_matrix4x4[9] = o_matrix4x4[2] * o_matrix4x4[4] - o_matrix4x4[6] * o_matrix4x4[0];

    o_matrix4x4[12] = -(eye_x * o_matrix4x4[0] + eye_y * o_matrix4x4[4] + eye_z * o_matrix4x4[8]);
    o_matrix4x4[13] = -(eye_x * o_matrix4x4[1] + eye_y * o_matrix4x4[5] + eye_z * o_matrix4x4[9]);
    o_matrix4x4[14] = -(eye_x * o_matrix4x4[2] + eye_y * o_matrix4x4[6] + eye_z * o_matrix4x4[10]);

    o_matrix4x4[3] = o_matrix4x4[7] = o_matrix4x4[11] = 0.0f;
    o_matrix4x4[15] = 1.0f;
}

  このエントリーをはてなブックマークに追加    

<<「ソフトウェア開発」の記事一覧に戻る

関連記事