6

回転した長方形(2D)の頂点を計算しようとしています。

長方形が回転していなければ、それは十分に簡単です、私はその部分を理解しました。

長方形が回転している場合、頂点を計算する2つの方法を考えました。

  1. 頂点をローカル/オブジェクト/モデル空間(以下で理解したもの)からワールド空間に変換する方法を理解してください。正直なところわかりませんが、それが最善の方法であるとすれば、それを理解できれば、そこから多くのことを学ぶことができると思います。

  2. 三角関数を使用して、長方形の端点がワールド空間内の長方形の位置に対して相対的な位置を何らかの方法で把握します。これは私が今までやろうとしてきた方法でした、私はただその方法を理解していませんでした。

これまでの頂点を計算する関数です。助けてくれてありがとう

void Rect::calculateVertices()
{
    if(m_orientation == 0) // if no rotation
    {
        setVertices(
        &Vertex( (m_position.x - (m_width / 2) * m_scaleX), (m_position.y + (m_height / 2) * m_scaleY), m_position.z), 
        &Vertex( (m_position.x + (m_width / 2) * m_scaleX), (m_position.y + (m_height / 2) * m_scaleY), m_position.z),
        &Vertex( (m_position.x + (m_width / 2) * m_scaleX), (m_position.y - (m_height / 2) * m_scaleY), m_position.z),
        &Vertex( (m_position.x - (m_width / 2) * m_scaleX), (m_position.y - (m_height / 2) * m_scaleY), m_position.z) );
    }
    else
    {
        // if the rectangle has been rotated..
    }

    //GLfloat theta = RAD_TO_DEG( atan( ((m_width/2) * m_scaleX) / ((m_height / 2) * m_scaleY) ) );
    //LOG->writeLn(&theta);

}
4

2 に答える 2

17

それぞれに同じ回転行列を適用して、各点を変換するだけです。2D平面回転の場合、次のようになります。

x' = x*cos(t) - y*sin(t)
y' = x*sin(t) + y*cos(t)

ここで、(x、y)は元の点、(x'、y')は回転した座標、tはx軸からラジアンで測定された角度です。書かれているように、回転は反時計回りです。

私の推薦は一度紙の上でそれをすることです。長方形を描画し、新しい座標を計算し、長方形を再描画して、コーディングする前に正しいことを確認します。次に、この例を単体テストとして使用して、正しくコーディングしたことを確認します。

于 2009-09-24T00:04:48.453 に答える
2

私はあなたがatan()角度を返すために使用して正しい軌道に乗っていたと思います。heightただし、その逆ではなく、分割して通過したいwidth。これにより、長方形の右上の頂点に対するデフォルトの(回転していない)角度が得られます。あなたはこのように残りをすることができるはずです:

// Get the original/default vertex angles
GLfloat vertex1_theta = RAD_TO_DEG( atan(
            (m_height/2 * m_scaleY)
            / (m_width/2 * m_scaleX) ) );
GLfloat vertex2_theta = -vertex1_theta; // lower right vertex
GLfloat vertex3_theta = vertex1_theta - 180; // lower left vertex
GLfloat vertex4_theta = 180 - vertex1_theta; // upper left vertex

// Now get the rotated vertex angles
vertex1_theta += rotation_angle;
vertex2_theta += rotation_angle;
vertex3_theta += rotation_angle;
vertex4_theta += rotation_angle;

//Calculate the distance from the center (same for each vertex)
GLfloat r = sqrt(pow(m_width/2*m_scaleX, 2) + pow(m_height/2*m_scaleY, 2));

/* Calculate each vertex (I'm not familiar with OpenGL, DEG_TO_RAD
 * might be a constant instead of a macro)
 */
vertexN_x = m_position.x + cos(DEG_TO_RAD(vertexN_theta)) * r;
vertexN_y = m_position.y + sin(DEG_TO_RAD(vertexN_theta)) * r;

// Now you would draw the rectangle, proceeding from vertex1 to vertex4.

わかりやすくするために、明らかに必要以上に長蛇の列になっています。もちろん、変換行列を使用したduffymoのソリューションは、おそらくよりエレガントで効率的です:)

編集:これで私のコードは実際に機能するはずです。に変更(width / height)(height / width)、長方形の中心から一定の半径を使用して頂点を計算しました。http://pastebin.com/f1c76308cで動作するPython(タートル)コード

于 2009-09-24T00:39:39.107 に答える