Как установить размер объекта opengl? - PullRequest
1 голос
/ 30 октября 2019

Мне нужно отобразить объект в opengl (это домашнее задание), и я нашел хороший код в Интернете, но размер отображаемого объекта очень мал, и я не знаю, как изменить его, чтобы отобразитьобъект большего размера.

Я думаю, что мне нужно изменить функции reshape, drawObject и display, но я не знаю opengl и его функций, поэтому я не знаю, какую часть кода мне следует изменить.

#include<stdio.h>
#include"glut.h"

GLuint object;
float objectrot;
char ch = '1';

void loadObj(const char* fname)
{
    FILE* fp;
    int read;
    GLfloat x, y, z;
    char ch;

    object = glGenLists(1);
    fp = fopen(fname, "r");

    if (!fp)
    {
        printf("can't open file %s\n", fname);
        exit(1);
    }
    glPointSize(2.0);
    glNewList(object, GL_COMPILE);
    {
        glPushMatrix();
        glBegin(GL_POINTS);
        while (!(feof(fp)))
        {
            read = fscanf(fp, "%c %f %f %f", &ch, &x, &y, &z);
            if (read == 4 && ch == 'v')
            {
                glVertex3f(x, y, z);
            }
        }
        glEnd();
    }

    glPopMatrix();
    glEndList();

    fclose(fp);
}

void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60, (GLfloat)w / (GLfloat)h, 0.1, 1000.0);
    glMatrixMode(GL_MODELVIEW);
}

void drawObject()
{
    glPushMatrix();
    glTranslatef(0, -40.00, -105);
    glColor3f(255, 255, 255);
    glScalef(0.1, 0.1, 0.1);
    glRotatef(objectrot, 0, 1, 0);
    glCallList(object);
    glPopMatrix();
    objectrot += 0.001;
    if (objectrot > 360)objectrot -= 360;
}

void display(void)
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    drawObject();
    glutSwapBuffers(); 
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(800, 450);
    glutInitWindowPosition(20, 20);
    glutCreateWindow("ObjLoader");
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutIdleFunc(display);
    loadObj("cat.obj");
    glutMainLoop();
    return 0;
}

Я ожидаю, что в окне появится более крупный объект, но он очень маленький

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Вам нужно увеличить масштабный коэффициент.

void drawObject()
{
    glPushMatrix();
    glTranslatef(0, -40.00, -105);
    glColor3f(255, 255, 255);
    glScalef(1.0, 1.0, 1.0);
    glRotatef(objectrot, 0, 1, 0);
    glCallList(object);
    glPopMatrix();
    objectrot += 0.001;
    if (objectrot > 360)objectrot -= 360;
}

Вы должны передать большее число glScalef(). Попробуйте 1.0 и посмотрите, сработает ли это.

0 голосов
/ 30 октября 2019

Отцентрируйте и масштабируйте входящую геометрию до известного / фиксированного размера, а затем установите преобразование просмотра соответствующим образом:

// return the min/max points of pts
template< typename Vec >
std::pair< Vec, Vec > GetExtents( const Vec* pts, size_t stride, size_t count )
{
    unsigned char* base = (unsigned char*)pts;
    Vec pmin( *(Vec*)base );
    Vec pmax( *(Vec*)base );
    for( size_t i = 0; i < count; ++i, base += stride )
    {
        const Vec& pt = *(Vec*)base;
        pmin = glm::min( pmin, pt );
        pmax = glm::max( pmax, pt );
    }

    return std::make_pair( pmin, pmax );
}

// centers geometry around the origin
// and scales it to fit in a size^3 box
template< typename Vec > 
void CenterAndScale( Vec* pts, size_t stride, size_t count, const typename Vec::value_type& size )
{
    typedef typename Vec::value_type Scalar;

    // get min/max extents
    std::pair< Vec, Vec > exts = GetExtents( pts, stride, count );

    // center and scale 
    const Vec center = ( exts.first * Scalar( 0.5 ) ) + ( exts.second * Scalar( 0.5f ) );

    const Scalar factor = size / glm::compMax( exts.second - exts.first );
    unsigned char* base = (unsigned char*)pts;
    for( size_t i = 0; i < count; ++i, base += stride )
    {
        Vec& pt = *(Vec*)base;
        pt = ( ( pt - center ) * factor );
    }    
}

Пример использования .

...