三角関数を使うとフリーズする

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

三角関数を使うとフリーズする

#1

投稿記事 by メカ » 10年前

3Dポリゴンがアナログパッドを傾けた方向に向く(回転する)ようにしたいのですが、
model[15]{x,y,z}が3Dポリゴンの固定座標で、modelchar[15]{x,y,z}が実際に3Dポリゴンを描画するときの座標です。
padxがアナログパッドのx軸、padyがアナログパッドのy軸とするとき、

コード:

for(int i=0;i<15;i++){
	modelchar[i].x=model[i].x * cos(atan2f(pady,padx));
	modelchar[i].z=model[i].z * sin(atan2f(pady,padx));
}
この部分です。
三角関数をはずすと正常に動きます。
計算上何か問題はありますか?
この部分はC言語の標準関数(?)なので関係ないかもしれませんが、一応PSPSDKを使ってます。
また、三角関数を使わずにこれと同じ処理が出来れば一番いいのですが、
下手な説明で申し訳ありませんが、ご回答お待ちしております。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 三角関数を使うとフリーズする

#2

投稿記事 by beatle » 10年前

なんでそれでフリーズするのか分かりませんが、取り敢えずその処理なら三角関数なしで計算可能です。
cosは底辺/斜辺、sinは垂直辺/斜辺で計算できますから、pady,padxの符号で条件分岐して4つの象限それぞれで計算すれば、正しくcos、sinの値が出ます。
例えば第一象限(グラフの右上)では
cos(atan2f(pady,padx)) = padx / tmp;
sin(atan2f(pady,padx)) = pady / tmp;
ただし、tmp = padx * padx + pady * pady;
と計算できます。

かずま

Re: 三角関数を使うとフリーズする

#3

投稿記事 by かずま » 10年前

beatle さんが書きました:cos(atan2f(pady,padx)) = padx / tmp;
sin(atan2f(pady,padx)) = pady / tmp;
ただし、tmp = padx * padx + pady * pady;
と計算できます。
tmp = sqrt(padx * padx + pady * pady); でしょう。
beatle さんが書きました:pady,padxの符号で条件分岐して4つの象限それぞれで計算すれば、正しくcos、sinの値が出ます。
なぜ条件分岐が必要なんですか?

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 三角関数を使うとフリーズする

#4

投稿記事 by beatle » 10年前

かずまさん、訂正ありがとうございます。
tmpの計算と条件分岐がいらないことはその通りです。

閉鎖

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