float型によるベクトル計算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
daikichi
記事: 4
登録日時: 5年前

float型によるベクトル計算

#1

投稿記事 by daikichi » 5年前

こんにちは、現在 Dxlib を用いて3Dゲームを作成しています。
その中であらかじめ指定した座標を任意点中心に回転し、図形を回転するプログラムを作成しています。そこで起きた問題です。
以下にコードの一部をはりますが、このコードではたまにベクトルが計算されず定義した値がそのまま出力される(もしくは、計算されているけれどアンダーフロー等で代入されてない?)ことが起こります。この計算されない現象を防ぐためにはどの部分をどのように訂正すればよいでしょうか。

環境はVS2017,Windows10です。
なお変数は すべて float型 です。
お力添えよろしくお願いします。

コード:

void Vector(VECTOR *V) {
    //原点中心にベクトル回転
    *V = VTransform(*V, Matrix_hand_X);
    *V = VTransform(*V, Matrix_hand_Y);
    *V = VTransform(*V, Matrix_hand_Z);

    //平行移動
    *V = VTransform(*V, Matrix_hand);
}

        //angleから0を除外する
    if (Angle_G[0] == 0 || Angle_G[1] == 0 || Angle_G[2] == 0) {
        if (Angle_G[0] == 0) {
            angle_X= 0.0000000000000000000000001f;
        }
        if (Angle_G[1] == 0) {
            angle_Y = 0.0000000000000000000000001f;
        }
        if (Angle_G[2] == 0) {
            angle_Z = 0.0000000000000000000000001f;
        }
    }
    else {
        angle_X = Angle_G[0];
        angle_Y = Angle_G[1];
        angle_Z = Angle_G[2];
    }
    ///////////////////////////////////////////

    //行列定義/////////////////////////////////
    Vect_stick_root = VGet(position_X, position_Y, -position_Z); //ここを中心に回転

    //最初からstick_rootとの差を入れておくことで平行移動を1回減らす
    Vect_palm_joint1 = VGet(-55, 0, -205);
    Vect_palm_joint2 = VGet(55, 0, -205);
    Vect_palm_nail1 = VGet(-30, 0, -230);
    Vect_palm_nail2 = VGet(30, 0, -230); //たまにここで定義した値のまま出力される

    //平行移動行列
    Matrix_hand = MGetTranslate(Vect_stick_root);

    //原点中心回転行列
    Matrix_hand_X = MGetRotX(angle_X);
    Matrix_hand_Y = MGetRotY(angle_Y);
    Matrix_hand_Z = MGetRotZ(angle_Z);
    ////////////////////////////////////////////

    //種々の行列計算
    Vector(&Vect_palm_joint1);
    Vector(&Vect_palm_joint2);
    Vector(&Vect_palm_nail1);
    Vector(&Vect_palm_nail2); //これらの計算結果がほしい
    

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: float型によるベクトル計算

#2

投稿記事 by みけCAT » 5年前

daikichi さんが書きました:
5年前

コード:

        //angleから0を除外する
    if (Angle_G[0] == 0 || Angle_G[1] == 0 || Angle_G[2] == 0) {
        if (Angle_G[0] == 0) {
            angle_X= 0.0000000000000000000000001f;
        }
        if (Angle_G[1] == 0) {
            angle_Y = 0.0000000000000000000000001f;
        }
        if (Angle_G[2] == 0) {
            angle_Z = 0.0000000000000000000000001f;
        }
    }
    else {
        angle_X = Angle_G[0];
        angle_Y = Angle_G[1];
        angle_Z = Angle_G[2];
    }
Angle_G[0] == 0 || Angle_G[1] == 0 || Angle_G[2] == 0が成り立つ時、
angle_X, angle_Y, angle_ZのうちAngle_Gの0でない要素に対応するものは更新されません。
これは意図した仕様ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

daikichi
記事: 4
登録日時: 5年前

Re: float型によるベクトル計算

#3

投稿記事 by daikichi » 5年前

回答ありがとうございます。
はい、意図した仕様です。


daikichi
記事: 4
登録日時: 5年前

Re: float型によるベクトル計算

#5

投稿記事 by daikichi » 5年前

マルチポストの条項は本サイト内に限らない話なのですね、理解が浅くてすみません。
以後気をつけます。

daikichi
記事: 4
登録日時: 5年前

Re: float型によるベクトル計算

#6

投稿記事 by daikichi » 5年前

エラーが解決しました。
どうやら、別部分でクリティカルセクションへのアクセスがあったようです。
ご協力ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る