質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

644閲覧

float型でのベクトル計算

phantom.man

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/29 09:51

こんにちは、現在 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); //これらの計算結果がほしい

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkuri

2018/11/29 09:58

なぜfloatの必要が?doubleで最近のPCは問題ないと思います。オーバーフローとかそういう問題なら治るはずです。
izmktr

2018/11/29 13:11

Vect_palm_nail1は処理されているけど、Vect_palm_nail2は処理されてないんでしょうか? そもそも、angle0を嫌う理由がわからないんですが、なぜそんな処理が入っているんでしょう?
phantom.man

2018/11/30 05:21

yukkuriさんへ Dxlibにおいて図形描画の座標指定はすべてfloat型で指定するという決まりがあります。ベクトルの計算結果をdoubleからfloatへ変更する際、丸め誤差がおきると考えfloat型で計算しようしています。
phantom.man

2018/11/30 05:26

izmktrさんへ 紛らわしい記述ですみません。Vect_palm_nail2だけでなくすべてのベクトルに当てはまる問題です。コメントの位置が悪かったです。また、angle=0を嫌う理由ですがゲーム内にangleでの割り算が入る箇所がありセグメンテーション違反になるためです。
fana

2018/11/30 08:10 編集

「たまに」って何ですか? 同じ回転角度を与えて計算させてもその時々で結果が異なるということですか? それとも,ある特定の回転角度を与えたときにだけ変化しないベクトルがあるということですか?
izmktr

2018/11/30 08:21

floatで0割りの場合は、結果がInfになるだけで、セグメンテーション違反は起こりません また、angleで割り算をする処理が思いつかないし、Lerpだとしたらこのコードでも問題があります
guest

回答2

0

自己解決

皆さん、ご協力ありがとうございました。
エラーの原因は提示したソースがクリティカルセクションになっているのに、他からのアクセスがあったことでした。
ご協力ありがとうございました。

投稿2018/12/06 03:12

phantom.man

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

特定の条件でangle_X, angle_Y, angle_Zへの代入忘れがあるのではありませんか?

投稿2018/12/01 05:48

katahiromz

総合スコア186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2018/12/01 10:19

ありますね。 > //angleから0を除外する の if文が成立(真)した時。 単純に angle_X,.. に代入した後に、それぞれ、判定した方が分かり易いと思いますが、、。
phantom.man

2018/12/04 04:17

pepperleafさんへ わかりやすさはとりあえず置いておいて、このソースでは代入忘れがあるということでしょうか?
pepperleaf

2018/12/04 11:30

"Angle_G[0] == 0 " の時、angle_Y, angle_Z に値が入るでしょうか ? Angle_G[1], Angle_G[2] が 0で無い場合です。
phantom.man

2018/12/06 03:04

入ってませんね、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問