2016-03-19 23 views
0

私は、ある点の周りに直角プリズムを回転させるプログラムを書いています。 1つの軸(X、Y、Z)の周りの回転を管理する3つの回転メソッドを使用して回転を処理します。コードは次のとおりですJava:回転と3D歪み

スピンは、3つのダブル(回転である)を格納する無駄なクラスです。これらのメソッドは、基本的に回転を2Dベクトル(ポイントをどのように格納するか)に変換し、それらを回転させます。最初のifステートメントは、2Dベクトルの大きさが0でないことを確認します。これらは許可されていますが、その場合は回転計算を実行する必要はありません。他の部分はトリグを処理するだけです。一番下の方法はすべてを結びつけるだけで、回転の順番をすばやく変更することができます(順序は最終回転に影響を及ぼします)。

問題は個々の回転ではなく、すべて一緒に来るときです。直角プリズムを歪ませることなく、1軸回りに簡単に1回転させることができます。 addSpin()を呼び出すかのように、私はそれらをすべてまとめています。

最初にspinYを呼び出すと、回転にY回転が含まれているとプリズムが歪んでしまいます(回転のy成分がゼロで、y軸の周りに回転がなければ歪みは発生しません)。実際、spinY()がいつでも呼び出されますが、最後にキューブの歪みが発生します。

spinZ()も同じです。 spinZ()が最後に呼び出された場合、キューブはワープされません。しかし、spinX()はどこにでも行くことができ、ひずみを引き起こすことはありません。

問題は次のとおりです。どのようにローテーションが起こるかに問題はありますか?もう1つの問題は、すべての回転がX軸とY軸またはX軸とZ軸、またはY軸とZ軸などの別の軸のペアに沿った回転には含まれないことです。明確にするために、X軸とY軸の周りの回転のセットでは到達できない回転に、X軸とZ軸またはY軸とZ軸の周りの一連の回転によって到達することができますか?

私はプリズムを表示するために使用している媒体を信頼します。私が作ったレイトレータは、直角プリズムでうまく動作します。これは数学に基づくより多くの質問ですが、かなり包括的なプログラミングコンポーネントを備えています。

これらは、まだ歪みが生じるいくつかの並列計算です。あなたは部門が精度の壊滅的な損失などにつながる可能性がある場合、二重正確な値は0 ATANもありませんほとんどないよう

x == 0 

のようなもののために

public void spinZ(Spin spin) { 

    double c = Math.cos(spin.yr); 
    double s = Math.sin(spin.yr); 
    double xp = x*c - y*s; 
    double yp = y*s + x*c; 
    x = xp; 
    y = yp; 
} 
public void spinY(Spin spin) { 

    double c = Math.cos(spin.yr); 
    double s = Math.sin(spin.yr); 
    double zp = z*c - x*s; 
    double xp = z*s + x*c; 
    x = xp; 
    z = zp; 
} 
public void spinX(Spin spin) { 

    double c = Math.cos(spin.yr); 
    double s = Math.sin(spin.yr); 
    double yp = y*c - z*s; 
    double zp = z*c + y*s; 
    y = yp; 
    z = zp; 
} 

答えて

1

あなたのチェックが不要と危険ですよく

なぜ不要なのですか?以下は、クリーナー(数値的に安定)な方法であなたの回転を実行するので:もちろん

double c = Math.cos(spin.yr); 
double s = Math.cos(spin.yr); 
double zp = z*c - x*s; 
double xp = z*s + x*c; 
x = xp; 
z = zp; 

、私の例では、右利きの向きとyの回転を扱う前提としていますが、あなたのサンプルコードから、あなたはそれを処理しているように見えます左手として。とにかく、Rotation matrixのウィキペディアの記事で数学が説明されています。

+0

私は0をチェックする理由はそれほど多くないので、xとzが等しいときは計算は必要ありません。 Javaで0を0で割ったときにNaNが得られます。これは物事をねじ込みます。そして、それは歪みを引き起こしている右利き対左利きの回転でしょうか?私はそうは思わないでしょうが、私は間違っている可能性があります... –

+0

放射状角度の計算で(+、+)と( - 、 - )を区別しないので歪みが発生しているとは思いません(+、 - )と( - 、+)座標の組 なぜゼロをチェックしているのか分かりますが、私が言ったように、座標変化の代わりに回転行列計算を使用すると、分岐条件がなくても安定した計算ができます。 –

+0

さて、私はあなたの計算方法を私の代わりに置き換えました(それぞれを回転行列のものに合わせるように修正して)。プリズムはまだ歪んでいました。私はトリグがチェックアウトすることを確認するために、適応された方法を貼り付けます。 –