注意: 以下の質問を編集しました。これは、すぐ下のテキストよりも実際の問題に関連しています。必要に応じてスキップできますが、歴史的な理由からここに残しておきます。
これが正しいかどうかを確認するにはfloat
、C の a はラジアンの値と同じですよね? つまり、360º = 6.28318531 ラジアンであり、OpenGL アプリで完全な回転が 0.0 から 6.28 になることに気付きました。これは正しく加算されているようです。私はそれが正しいことを確認したいだけです。
私は0.0 から 360.0 まで ( とfloat
呼びましょう) を使用しています (度単位で読みやすく、常にキャストを避けることができます)。Web で見られるすべてのコードは、 として定義されている何らかのマクロを使用しています。最終的には次のようになります。anglePitch
int
float
DEG2RAD()
DEG2RAD 3.141593f / 180
anglePitch += direction * 1; // direction will be 1 or -1
refY = tan(anglePitch * DEG2RAD);
これは実際には 1 回転しますが、その 1 回転は と の場合になりますanglePitch = 180
がanglePitch * DEG2RAD = 3.14
、1 回転は 360|6.28 である必要があります。マクロを次のいずれかに変更した場合:
#define DEG2RAD 3.141593f / 360
#define DEG2RAD 3.141593f / 2 / 180
期待どおりに動作し、anglePitch = 360
.
ここで何が欠けていますか?角度をラジアン/フロートに適切に変換するには何を使用すればよいですか?
重要な編集 (本当の質問):
私は今、私がウェブ上のどこでも見ているコードを理解しています.私DEG2RAD
は数学が苦手です. だから私は私の質問を言い換えるつもりです:
これをコードに追加しました:
#define PI 3.141592654f
#define DEG2RAD(d) (d * PI / 180)
ここで、ピッチ/ヨーン角度を度単位で操作する場合、繰り返しになりますがfloats
、常にキャスティングを避けるために、DEG2RAD
マクロを使用するだけで、度数の値が正しくラジアンに変換されます。これらの値は sin/cos/tan 関数に渡され、GLUT カメラで使用される適切な値を返します。
さて、本当の質問です。以前は本当に混乱していましたが、自分自身をうまく説明できませんでした:
angleYaw += direction * ROTATE_SPEED;
refX = sin(DEG2RAD(angleYaw));
refZ = -cos(DEG2RAD(angleYaw));
このコードは、LEFT/RIGHT キーを押すと実行され、それに応じてカメラが Y 軸で回転します。1 回転は 0° から 360° までです。
anglePitch += direction * ROTATE_SPEED;
refY = tan(DEG2RAD(anglePitch));
これは同様のコードで、UP/DOWN キーを押すと実行され、カメラは X 軸で回転します。しかし、この状況では、完全な回転は 0° から 180° まで変化し、それが私を本当に混乱させます。接線関数と関係があると確信していますが、頭がわかりません。
sin/cos を使用して (あくびのコードで行っているように) 同じ回転を実現する方法はありますか? 正しい方法、追加/修正できる最も単純なコード、および 0° から 360° までのフルピッチ回転を作成するためのより理にかなった方法は何ですか?