Войти
ПрограммированиеФорумГрафика

Граница дня и ночи на плоской карте Земли (2 стр)

Страницы: 1 2 3 Следующая »
#15
15:26, 22 мар 2020

LG_SLICE_CNT - число разбиений, theta - широта (lat)  , phi - долгота (lon)

void Globus::createSphere(GLdouble xc, GLdouble yc, GLdouble zc, GLdouble r)
{
    int
            i,j;
    GLdouble
            theta, phi,
            stepAngle   = M_2PI / LG_SLICE_CNT,
            stepTexture = 1.0 / LG_SLICE_CNT;


    for(j = 0; j < LG_SLICE_CNT / 2; j++)
    {
        // -pi/2 .. +pi/2
        theta = j * stepAngle - M_PI/2.0;

        for(i = 0; i < LG_SLICE_CNT; i++)
        {
            // -pi .. +pi
            phi = -M_PI + i*stepAngle;
            //X - вверх , Y - на нас, Z - вправо

            coordVertexSphere.push_back( xc + r * cos(theta+stepAngle) * sin(phi));
            coordVertexSphere.push_back( yc + r * sin(theta+stepAngle));
            coordVertexSphere.push_back( zc + r * cos(theta+stepAngle) * cos(phi));
            normalVertexSphere.push_back( cos(theta+stepAngle) * sin(phi));
            normalVertexSphere.push_back( sin(theta+stepAngle));
            normalVertexSphere.push_back( cos(theta+stepAngle) * cos(phi));
            texturVertextSphere.push_back( i * stepTexture);
            texturVertextSphere.push_back( 2.0 * (j+1)* stepTexture);


            coordVertexSphere.push_back( xc + r * cos(theta) * sin(phi));
            coordVertexSphere.push_back( yc + r * sin(theta));
            coordVertexSphere.push_back( zc + r * cos(theta) * cos(phi));
            normalVertexSphere.push_back( cos(theta) * sin(phi));
            normalVertexSphere.push_back( sin(theta));
            normalVertexSphere.push_back( cos(theta) * cos(phi));
            texturVertextSphere.push_back( i * stepTexture);
            texturVertextSphere.push_back( 2.0 *j * stepTexture);

            coordVertexSphere.push_back( xc + r * cos(theta) * sin(phi+stepAngle));
            coordVertexSphere.push_back( yc + r * sin(theta));
            coordVertexSphere.push_back( zc + r * cos(theta) * cos(phi+stepAngle));
            normalVertexSphere.push_back( cos(theta) * sin(phi+stepAngle));
            normalVertexSphere.push_back( sin(theta));
            normalVertexSphere.push_back( cos(theta) * cos(phi+stepAngle));
            texturVertextSphere.push_back( (i+1) * stepTexture);
            texturVertextSphere.push_back( 2.0 *j * stepTexture);



            coordVertexSphere.push_back( xc + r * cos(theta+stepAngle) * sin(phi+stepAngle));
            coordVertexSphere.push_back( yc + r * sin(theta+stepAngle));
            coordVertexSphere.push_back( zc + r * cos(theta+stepAngle) * cos(phi+stepAngle));
            normalVertexSphere.push_back( cos(theta+stepAngle) * sin(phi+stepAngle));
            normalVertexSphere.push_back( sin(theta+stepAngle));
            normalVertexSphere.push_back( cos(theta+stepAngle) * cos(phi+stepAngle));
            texturVertextSphere.push_back( (i+1) * stepTexture);
            texturVertextSphere.push_back( 2.0 * (j+1)* stepTexture);
        }
    }
}
#16
15:36, 22 мар 2020
void Globus::initializeGL()
{
    initializeGLFunctions();

    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    glShadeModel(GL_SMOOTH);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

    glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
    glDisable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);

    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);

    createEarth();

}

void Globus::createEarth()
{

    loadTexture();
    createSphere(0.0, 0.0, 0.0, LG_RADIUS);

    earthList = glGenLists(1);
    glNewList(earthList, GL_COMPILE);

    // Отрисовка сферы
    glEnable(GL_TEXTURE_2D);
    glColor4d(1.0, 1.0, 1.0, 0.0);

    glBindTexture(GL_TEXTURE_2D, earthText);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glVertexPointer(3,GL_DOUBLE,0,coordVertexSphere.data());
    glNormalPointer(GL_DOUBLE,0,normalVertexSphere.data());
    glTexCoordPointer(2,GL_DOUBLE,0,texturVertextSphere.data());
    glDrawArrays(GL_QUADS,0,2*LG_SLICE_CNT*LG_SLICE_CNT);

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    glDisable(GL_TEXTURE_2D);
    glEndList();


}

void Globus::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    setModelViewMatrix();

    drawSunLight();

    // Рисуем сферу с наложенной на неё текстурой.
    glCallList(earthList);

    glDisable(GL_LIGHTING);
    glDisable(GL_LIGHT0);
}
#17
16:09, 22 мар 2020

urii
> код должен выполняться на очень старом железе
надо сначала обновить железо, потом создать трехмерный шар, сделать для него текстурную развертку, загрузить шарик в графический движок, там сделать источник света "Солнце" и немножко амбиент (типа свет от галактики), и запечь свет в текстуру.

#18
16:16, 22 мар 2020

programina
Увы в части железа приходится работать с тем что есть.
Есть версии почему освещение не отрабатывает?

#19
16:44, 22 мар 2020

urii
> Есть версии почему освещение не отрабатывает?
по-моему сфера неправильно строится.

#20
16:49, 22 мар 2020

Затенение на сфере  (класс Globus) как раз работает. Не работает тень на плоской карте (CMap)

#21
18:14, 22 мар 2020

urii
Может у тебя просто нормали автоматом пересчитываются. Разница должна быть только в позиции вершин.

#22
20:59, 22 мар 2020

Что понимается под автоматом? нет. более того после ряда экспериментов принудительно написал glDisable(GL_AUTO_NORMAL)

Идея была такая: карта собирается из квадратных кусочков в зависимости от масштаба (зума) и вьюпорта.  карта плоская, т.е. для всех вершин кусочка (тайла и мельче) координата Z == 0.0. Для каждой вершины находятся широта и долгота, а по ним вектор нормали...

Несмотря на то что точки лежат на плоскости,  нормали имеют направления как будто они находятся на поверхности шара и цель получить такую же тень как на картинке в начале темы.

#23
21:50, 22 мар 2020

Ivashka

ты сктати та и непробовал вводить одинаковую нормаль для всех вершин

В void CMap::updateScene()
подмена вычиленных для точек значений на:
lat = 0; lon = M_PI /4.0;
lat = 0; lon = M_PI /2.0;
lat = 0; lon = M_PI *3.0/2.0;

не привела к заметному потемнению ил осветлению изображения.

Может в инициализации что то еще я забыл?

#24
23:14, 22 мар 2020

попробовал принудительно отключить автоматические нормали и включить на всякий случай нормировку:

glEnable(GL_NORMALIZE);
glDisable(GL_AUTO_NORMAL);

Не помогло. Остальные пункты в том или ином виде есть...

#25
23:27, 22 мар 2020

Ivashka

Загадка

Скорее просто невнимательность. ведь света нет совсем...

#26
23:39, 22 мар 2020

Ivashka

забей на недельку с этим освещением и делай следующее по списку

Так и делаю, спасибо!

#27
5:23, 23 мар 2020

urii
> qglClearColor(Qt::black);
> С шейдерами картина такая: старое железо в лучшем случае поддерживает OpenGL 2.0 и не без глюков, поэтому не хочется даже связываться.
Qt по дефолту держит OpenGL ES2 (в том числе, через ANGLE), который есть покоцанный аналог OpenGL 3+.
Так что завязывай с некрофилией и переходи на шейдеры.

#28
8:42, 23 мар 2020


}:+()___ [Smile]

Так что завязывай с некрофилией и переходи на шейдеры.

Ну смотри: массивы текстур я в этой версии  opengl в шейдер не передам. Линии траектории тоже придется отдельно рисовать. Смысл в шейдере тогда, только ради тени? Еще есть большие сомнения насчёт работоспособности шейдерa на операционке российского вендоров, там все через ж...

x

Ты определись, у тебя даблы или флоаты.

А где float ?

#29
11:40, 23 мар 2020

urii
Давно бы уже рассчитал свет вручную и раскрасил через glColor.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.