0

OpenGLでポーンを生成するためのコードがあります。ただし、そのパーツをドラッグ可能にしたい。私の質問はもっと一般的なものですが、これが私のポーンのコードです。これにより、私が何をしているのかがわかります。

int main()
{
    /* open gl initialization */

    while(running())
    {
        glClear(GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();

        glColor3ub(0, 0, 0);

        /* the basis of the pawn */
        glPushMatrix();
        glScalef(1.6, 1.6, 0.8);
        glTranslatef(0.0, 0.0, -2.7 - offset);
        drawSmoothUnityEllipsoidPatch(0, 2*M_PI, 0, M_PI /2 );
        glPopMatrix();

        /* upped ellipsoid */
        glPushMatrix();
        glScalef(0.8, 0.8, 0.15);
        glTranslatef(0.0 - offset, 0.0, 6.0);
        drawSmoothUnitySphere();
        glPopMatrix();

        /* lower ellipsoid */
        glPushMatrix();
        glScalef(1.2, 1.2, 0.15);
        glTranslatef(0.0 - offset, 0.0, -10.0);
        drawSmoothUnitySphere();
        glPopMatrix();

        /* the cone */
        glPushMatrix();
        glScalef(1.0, 1.0, 3.5);
        glTranslatef(0.0 + offset, 0.0, -0.5);
        drawSmoothUnityCone();
        glPopMatrix();

        /* the sphere on top of the pawn */
        glPushMatrix();
        glScalef(0.7, 0.7, 0.7);
        glTranslatef(0.0, 0.0, 2.3 + offset);
        drawSmoothUnitySphere();
        glPopMatrix();

    glfwTerminate();
    return 0;
}

ここで、オフセットは関係ありません。関数drawSmoothUnity(shape)は、座標系の中心に単一の形状を描画するだけです。これらの図形のいずれかを表示領域(800x600、私のウィンドウサイズ)にドラッグアンドドロップできるようにしたいです。

4

1 に答える 1

2

gluUnprojectを使用して、カーソル位置を画面空間からワールド空間にマッピングできます。(ドラッグ後に) マウス ボタンが最初に現在の位置にクリックされたときの 3D ワールド座標のデルタを追跡することにより、オブジェクトの移動に使用する x、y、z 値が得られます。

また、「glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);」にする必要があります。

これは私の頭のてっぺんから外れているようなもので、偽物です。これは、選択やそのいずれも考慮していません。そのため、クリックしたときにオブジェクトがマウス カーソルの下になくても、マウスを下にクリックして移動すると、オブジェクトが移動します。明らかに、マウス ハンドラーを追加する必要があります。

glm::dvec3 original_position;//position of object when we start moving
glm::dvec3 world_anchor;//world space coordinates of where we left clicked
glm::ivec2 screen_anchor;//screen space coordinates of where we left clicked
Object object;
OnLButtonDown(int x, int y)//x,y = where we clicked
{
   original_position = object.GetPosition();
   screen_anchor = ivec2(x,y);//screen coords where we clicked
   gluUnproject(x,y,0,modelview_matrix,projection_matrix,viewport,&world_anchor.x,
   &world_anchor.y,&world_anchor.z);
}
OnMouseMove(int x, int y) //x,y = current mouse cursor position
{
   if(left_button_down)
      MoveObject(screen_anchor.x-x,screen_anchor.y-y);
}


}
MoveObject(int dx, int dy)//dx,dy = distance from current mouse position to screen_anchor
{
    glm::dvec3 world_position;//current mouse position in world coordinates
    gluUnProject(dx,dy,0,modelview_matrix,projection_matrix,viewport,&world_position.x,
    &world_position.y,&world_position.z);

    glm::dev3 world_delta = world_anchor-world_position;
    object.SetPosition(original_position+world_delta);

}
于 2013-02-01T19:46:46.777 に答える