Как добавить текстуру в эту сферу? - PullRequest
2 голосов
/ 16 апреля 2020

Я создал вращающуюся проволочную сферу. Я сделал текстуры для куба, но сфера кажется проблемой. Я хочу добавить карту мира в качестве текстуры к этой сфере. Любые предложения?

#include <iostream>
#include <stdlib.h>
#include <GL/glut.h>
#include <thread>
#include <chrono>
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
using namespace std;
GLuint texture;
int start = 1;
GLfloat xRotated, yRotated, zRotated;
GLdouble radius = 1;
void init() {
    glOrtho(-1000 / 2, 1000 / 2, -1000 / 2, 1000 / 2, -500, 500);
}


GLuint glInitTexture(char* filename)
{
    GLuint t = 0;
    int width, height, nrChannels;
    stbi_set_flip_vertically_on_load(true);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    unsigned char* data = stbi_load(filename, &width, &height, &nrChannels, 0);

    glGenTextures(1, &t);
    glBindTexture(GL_TEXTURE_2D, t);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    //unsigned char data[] = { 255, 0, 0, 255 };
    if (data)
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    else
        std::cout << "fail";
    return t;
}



void drawImage(GLuint file, float x, float y, float w, float h)
{

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    glPushMatrix();
    //glTranslatef(x, y, 0.0);
    //glRotatef(angle, 0.0, 0.0, 1.0);
    //glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glBindTexture(GL_TEXTURE_2D, file);

    glEnable(GL_TEXTURE_2D);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0, 0.0, -4.5);

    glRotatef(yRotated, 0.0, 1.0, 0.0);

    glEnable(GL_TEXTURE_2D);
    GLUquadric *qobj = gluNewQuadric();
    gluQuadricTexture(qobj, GL_TRUE);
    gluSphere(qobj, radius, 20, 20);
    gluDeleteQuadric(qobj);
    glDisable(GL_TEXTURE_2D);

    glFlush();

    yRotated += 0.01;
    //glBindTexture(GL_TEXTURE_2D, 0);
    glFlush();
    glPopMatrix();
    glDisable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);



}
//Plots points of both graphs together


//Displays map on screen
void drawMap() {
    std::cout << "\nDraw map\n";

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();
    const double w = glutGet(GLUT_WINDOW_WIDTH);
    const double h = glutGet(GLUT_WINDOW_HEIGHT);
    gluPerspective(90.0, w / h, 0.1, 1000.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0, 0, -15);

    for (int i = 0; i < 10000; i++) {
        glClear(GL_DEPTH_BUFFER_BIT);
        drawImage(texture, 0, 0, 100, 200);
        //std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
    glutSwapBuffers();
    glEnd();
    glFlush();

}
void render()

{





    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glEnable(GL_DEPTH_TEST);



    //glFlush();


    glPointSize(5);
    glColor3f(1, 1, 1);
    glBegin(GL_LINES);
    glVertex3f(-450, -450, 10);
    glVertex3f(-450, -250, 10);
    glEnd();
    glBegin(GL_LINES);
    glVertex3f(-450, -450, 10);
    glVertex3f(-250, -450, 10);

    glEnd();






    drawMap();

    //plotPoints();
    glFlush();



}
void Kbevent(unsigned char key, int x, int y) {
    if (key == 's') {
        start = start % 2;
        glutPostRedisplay();
    }

}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(1560, 810);
    glutCreateWindow("Applying Textures");
    init();
    xRotated = yRotated = zRotated = 30.0;
    xRotated = 33;
    yRotated = 40;


    char fn[] = "map.jpg";
    texture = glInitTexture(fn);
    glutDisplayFunc(render);
    //glutReshapeFunc(reshapeFunc);
    //glutIdleFunc(idleFunc);
    glutKeyboardFunc(Kbevent);
    glutMainLoop();

    return 0;
}

Проблема с применением 2D-текстуры заключается в том, что при наложении 2D-текстуры на сферу, верхнюю и нижнюю области сферы, текстура выглядит сжатой.

1 Ответ

0 голосов
/ 16 апреля 2020

Я предлагаю использовать gluSphere и gluQuadricTexture вместо glutSolidSphere. Например:

glEnable(GL_TEXTURE_2D);

GLUquadric *qobj = gluNewQuadric();
gluQuadricTexture(qobj, GL_TRUE);
gluSphere(qobj, radius, 20, 20);
gluDeleteQuadric(qobj);

glDisable(GL_TEXTURE_2D);

Для непрерывного вращения необходимо увеличить угол поворота и постоянно обновлять окно (glutPostRedisplay). например:

void redisplayFunc(void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0, 0.0, -4.5);

    glRotatef(yRotated, 0.0, 1.0, 0.0);

    glEnable(GL_TEXTURE_2D);
    GLUquadric *qobj = gluNewQuadric();
    gluQuadricTexture(qobj, GL_TRUE);
    gluSphere(qobj, radius, 20, 20);
    gluDeleteQuadric(qobj);
    glDisable(GL_TEXTURE_2D);

    glFlush();

    yRotated += 1;
    glutPostRedisplay();
}
...