Случайное движение - Windows Pipe Screensaver - PullRequest
2 голосов
/ 06 августа 2011

Многие из вас могут знать классическую заставку Windows . Кто-нибудь знает, как это было запрограммировано в 3D или 2D? Никакого реального кода не требуется - просто общее объяснение алгоритма было бы здорово.

Ответы [ 2 ]

4 голосов
/ 06 августа 2011

Это - скриншот из Chrome. В хроме это программируется очень легко:

file_util::AppendToPath(&path, L"sspipes.scr");
  CreateProcess(NULL, ...

или: откройте файл заставки Windows Pipe и запустите его.

Источник версии xscreensaver: xscreensaver-4.16 / hacks / glx / pipe.c в xscreensaver-4.16.tar.bz2 (или другой версии того же пакета). Онлайн версия файла .

ОБНОВЛЕНИЕ: Как это работает: он использует OpenGL, чтобы сделать вещи красивыми

Каждая трубка добавляется в виде цилиндра и сферы:

    glBegin(GL_QUAD_STRIP);
    for (an = 0.0; an <= 2.0 * M_PI; an += M_PI / 12.0) {
            glNormal3f((COSan_3 = cos(an) / 3.0), (SINan_3 = sin(an) / 3.0), 0.0);
            glVertex3f(COSan_3, SINan_3, one_third);
            glVertex3f(COSan_3, SINan_3, -one_third);
    }
    glEnd();

Вращение в пространстве осуществляется glRotatef до glBegin. Все повороты только на 90 градусов.

Конечная сфера является объектом:

    quadObj = gluNewQuadric();
    gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
    gluSphere(quadObj, radius, 16, 16);
    gluDeleteQuadric(quadObj);

Для изгибов много кода используется для рисования (функция myElbow).

Чтобы не пересекаться, используется массив 3d с флагами "эта точка пространства содержит трубу". Все трубы имеют целочисленные координаты и параллельны оси. Коррекция перспективы из библиотеки 3d (opengl / direct3d).

Основная функция с логикой: draw_pipes.

Рисует сферу, выбирает направление в случайном порядке, и начинается запуск трубы. На каждом шаге наблюдается случайное отклонение (с вероятностью 20%) изгиба. Кроме того, neiborhods проверяется на каждом этапе, чтобы предотвратить столкновения. Если нет свободного места для продолжения трубы, или труба достаточно длинная (может быть и случайной), она остановится, и новая труба начнется со случайной точки.

0 голосов
/ 06 августа 2011

Это было сделано с использованием OpenGL (тогда, когда MS была взволнована по поводу OpenGL в Windows).Хотя я не могу авторитетно говорить об остальном (не уверен, что когда-либо видел исходный код), он выглядит как довольно простой вопрос выбора направления (вверх, вниз, влево, вправо, вперед,в обратном направлении) и расстояние, с некоторыми границами, чтобы держать все это в кубе.

Труба имеет некоторый определенный диаметр, и вы можете выбрать растровое изображение для текстурирования на трубе, если хотите.Если вы не используете текстуру, она может / будет выбирать цвета.Он достаточно старый, я полагаю, что он написан для использования только 20 (16?) Цветов, определенных Windows в качестве базовой палитры, обычно поддерживаемой практически на любом графическом адаптере, - но прошло довольно много времени, так как основное оборудование было почти таким ограниченным.

...