3

多くの操作を行うことなく、水平軸の角度を反転する方法を知りたいです。角度が 0 (コードの座標系で「右向き」) であるとします。反転した角度は 180 (左向き) である必要があります。90 (上向き) の場合、反転しても 90 のままです。89 は 91 などです。角度によって暗示される X/Y 速度で操作できますが、それでは速度が低下し、適切な方法ではないと感じています。私はあまり数学を知らないので、間違った名前で呼んでいるかもしれません...誰か助けてくれますか?

編集:申し訳ありませんが、時間がかかりました。長い間コンピューターから離れなければなりませんでした... http://img215.imageshack.us/img215/8095/screenshot031v.jpg

このスクリーンショットで十分かもしれません。上の構造は、2 つの衛星と、中央の白い点にリンクされたビームです。2 つのサテライトは白い点の角度を継承する必要があります (デバッグ目的で表示されます)。左の衛星が映っているので、こちらも初挑戦でしたが、おっしゃる通り180度で計算してみました。ご覧のとおり、ミラーではなく反転しています。そして、白い点が回転すると逆回転します。もう一方は大丈夫です。

これは、何か他のものにリンクされたものの角度の再計算です。pid が親になり、id が現在になります。pin.ang は、オブジェクトが別のオブジェクトにリンクされるときにコピーされる角度オフセットであるため、回転しても位置が保持されます。

if(object[id].mirror)
    object[id].angle = 180 - (object[id].pin.ang + object[pid].angle);
else
    object[id].angle = object[id].pin.ang + object[pid].angle;

そして、これが特定の回転部分です。OpenGL。offx/y は、ビームがそこに出ようとしているように、中心から外れたものを回転させるためのもので、他のすべてを正しくレンダリングします。

glTranslatef(list[index[i]].x, list[index[i]].y, 0);
glRotatef(list[index[i]].angle, 0.0, 0.0, 1.0);
glTranslatef(list[index[i]].offx, -list[index[i]].offy, 0);

回転速度 (次の例のように、現在の角度に再描画ごとに追加される整数。時計回りに回転する場合は正 )

したがって、180 度ではないことは間違いありません。ミラーリングは、テクスチャ座標を逆にするだけで行われるため、角度には影響しません。GL ローテーションの癖かもしれません。

4

7 に答える 7

12

反映された金額(数学を見るだけ)は(180 - angle)

Angle | Reflection
------+-----------
    0 |        180
   90 |         90
   89 |         91
   91 |         89
  360 |       -180
  270 |        -90

「水平平面」を下回った場合のマイナス点に注意してください。そのままにしておくか、特別なケースとして処理することができます。

于 2009-09-03T07:06:30.013 に答える
3

単純じゃないですか

結果 = 180-(あなたの角度)

于 2009-09-03T07:10:18.723 に答える
2

すでに説明したように、180 度から自分の角度を引くと、反対の角度が得られます。例えば:

180 - yourangle

X/Y 速度を直接操作することは、それほど面倒ではありません。X 速度の方向を逆にするだけで、マイナス 1 を掛けることができます。例: speedx = (-1) * speedx. これにより、左右の方向が変わります。たとえば、何かが左に移動すると右に移動し始め、その逆も同様であり、垂直速度は影響を受けません。

サイン/コサイン (sin/cos) を使用して X/Y 速度コンポーネントを再計算している場合、この*(-1)方法はおそらくより効率的です。最終的には、プログラムのコンテキストに依存します。より良い解決策を探している場合は、質問を詳細に更新してください。

于 2009-09-03T07:53:48.963 に答える
2

このソリューションは、-Y 方向の角度 (時計など) 用です。+X 方向 (学校の数学など) の場合、X と Y を入れ替える必要があります。

public static float FlipAngleX(float angle)
{
    angle = NormalizeAngle(angle);

    angle = TwoPi - angle;

    return angle;
}

public static float FlipAngleY(float angle)
{
    angle = NormalizeAngle(angle);

    if (angle < Pi)
    {
        angle = Pi - angle;
    }
    else
    {
        angle = TwoPi - angle + Pi;
    }
    return angle;
}

/// <summary>
/// Keeps angle between 0 - Two Pi
/// </summary>
public static float NormalizeAngle(float angle)
{
    if (angle < 0)
    {
        int backRevolutions = (int)(-angle / TwoPi);
        return angle + TwoPi * (backRevolutions + 1);
    }
    else
    {
        return angle % TwoPi;
    }
}
于 2019-01-10T13:41:56.377 に答える
0

ああ、問題は結局負の数から来たようです、私はそれらが正であることを確認しました、そして今回転はうまくいきます、私は角度を再計算する必要さえありません...みんなのおかげで、私はすべてのビットのために理解しました応答。

于 2009-09-03T19:01:25.133 に答える
-1

360-angle角度を水平方向に反転させますが、垂直方向には反転させません

于 2016-08-07T16:23:16.240 に答える