ページ 11

float型によるベクトル計算

Posted: 2018年11月29日(木) 19:04
by daikichi
こんにちは、現在 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); //これらの計算結果がほしい
    

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

Posted: 2018年11月29日(木) 21:53
by みけCAT
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でない要素に対応するものは更新されません。
これは意図した仕様ですか?

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

Posted: 2018年11月30日(金) 14:49
by daikichi
回答ありがとうございます。
はい、意図した仕様です。

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

Posted: 2018年11月30日(金) 17:01
by usao
マルチポストですかな?
https://teratail.com/questions/161096

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

Posted: 2018年12月04日(火) 13:26
by daikichi
マルチポストの条項は本サイト内に限らない話なのですね、理解が浅くてすみません。
以後気をつけます。

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

Posted: 2018年12月06日(木) 10:52
by daikichi
エラーが解決しました。
どうやら、別部分でクリティカルセクションへのアクセスがあったようです。
ご協力ありがとうございました。