-1

私のコードは次のように機能します。三角形が描画され、「1」をクリックすると三角形がスケーリングされますが、三角形がスケーリングされ、変換されます。

ここに私のコードがあります: グローバル変数

#include <glut.h>

void Display(void);
void MyKeyboard(unsigned char,int,int);
void MyMouse(int,int,int,int);

int x1 =20 .0f;
int y1 = 30.0f;
int x2 = 40.0f;
int y2 = 50.0f;
int x3 = 60.0f;
int y3 = 10.0f;

主な方法

void main(int argc,char** argr)
{
 glutInit(&argc,argr);
 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
 glutInitWindowSize(1000,600);
 glutInitWindowPosition(50,50);
 glutCreateWindow("Mouse and Keyboard");
 glutDisplayFunc(Display);
 glutKeyboardFunc(MyKeyboard);
 glutMouseFunc(MyMouse);
 glClearColor(0.0f,0.0f,0.0f,0.0f);
 gluOrtho2D(0.0,1000.0,0.0,600.0);
 glutMainLoop();
}

表示方法

void Display()
{
 glClear(GL_COLOR_BUFFER_BIT);
 glPushMatrix();

    glBegin(GL_TRIANGLES);
    glColor3f(0.0f,0.0f,1.0f);

    glVertex3f(x1, 600-y1, 0.0f);
    glVertex3f(x2, 600-y2, 0.0f);
    glVertex3f(x3, 600-y3, 0.0f);

    glEnd( );
    glPopMatrix();
    glFlush();
}

キーボードイベント

void MyKeyboard(unsigned char key,int mouseX,int mouseY)
{
    if (key == '1')
    {
        glScaled (0.5f ,0.5f ,1.0f);
        glutPostRedisplay();
        return;
    }
4

2 に答える 2

7

glScaled()基本的に、すべてのポイントが に指定した値で乗算されますglScaled()。これが本質的に意味することは、すべての頂点が原点 (0,0) から離れるということです。スケーリングの問題を克服するには、三角形の中心を (0,0) に定義するだけです。

明らかに、三角形が常にゼロになるとは限らないため、glTranslate()関数を利用する必要があります。

理想的には、おそらくキーボード関数を変更して、まったく呼び出さないようにすることをお勧めしますがglScale()、変数にどれだけスケーリングする必要があるかを格納します。次に、レンダリング ループで、三角形を描画する前に、translate 関数と scale 関数を呼び出します。

トピック外: 即時モードの OpenGL は非推奨です (つまり、glBegin(); glEnd())。最新の OpenGL チュートリアルについては、こちらをご覧ください。

http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-1:-The-Graphics-Pipeline.html

于 2012-09-26T13:59:32.850 に答える
1

三角形を比例してスケーリングする場合は、次を使用します。

glScaled (0.5f ,0.5f ,0.5f); 
于 2012-09-26T12:57:26.983 に答える