Какую простейшую 3D-программу нарисовать в окне? - PullRequest
2 голосов
/ 17 июля 2009

Я программирую в 3D, используя C ++, OpenGL и wxWidgets. Не зная, что происходит в других языках программирования / фреймворках, я получил этот вопрос:

Какой язык программирования (или платформа программирования) является самым простым сегодня для начинающего программиста 3D сегодня? ( Не обязательно игровой программист !) Продемонстрируйте ваш случай, продемонстрировав самый простой ( не маленький) фрагмент кода на этом языке, который нарисует квадрат / куб в окне Код должен быть полным и компилируемым / интерпретируемым.

Для C ++, OpenGL и GLUT, вот первый пример (1-2) из ​​ Красной книги ( Руководство по программированию OpenGL ):

#include <GL/gl.h>
#include <GL/glut.h>

void display(void)
{
/*  clear all pixels  */
    glClear (GL_COLOR_BUFFER_BIT);

/*  draw white polygon (rectangle) with corners at
 *  (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)  
 */
    glColor3f (1.0, 1.0, 1.0);
    glBegin(GL_POLYGON);
        glVertex3f (0.25, 0.25, 0.0);
        glVertex3f (0.75, 0.25, 0.0);
        glVertex3f (0.75, 0.75, 0.0);
        glVertex3f (0.25, 0.75, 0.0);
    glEnd();

/*  don't wait!  
 *  start processing buffered OpenGL routines 
 */
    glFlush ();
}

void init (void) 
{
/*  select clearing (background) color       */
    glClearColor (0.0, 0.0, 0.0, 0.0);

/*  initialize viewing values  */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

/* 
 *  Declare initial window size, position, and display mode
 *  (single buffer and RGBA).  Open window with "hello"
 *  in its title bar.  Call initialization routines.
 *  Register callback function to display graphics.
 *  Enter main loop and process events.
 */
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize (250, 250); 
    glutInitWindowPosition (100, 100);
    glutCreateWindow ("hello");
    init ();
    glutDisplayFunc(display); 
    glutMainLoop();
    return 0;   /* ISO C requires main to return int. */
}

Как вы можете очень хорошо видеть, он использует GLUT, который является архаичной оконной структурой для OpenGL.

Ответы [ 4 ]

2 голосов
/ 17 июля 2009

Я не уверен, как или почему вы хотите, чтобы код был меньше этого ...

Есть много вещей, которые вам действительно нужно явно указать.

Ваш код состоит из:

  • Указание квадрата
  • Настройка режима отображения и проецирования
  • Указание размера и положения окна

У вас не больше кода, чем указанная вами информация, что является отличным определением для эффективного выражения. Если бы код был немного меньше, вы бы не указали достаточно информации, чтобы описать, что вы хотите сделать.

1 голос
/ 18 июля 2009

GLUT может быть архаичным, но я не думаю, что ему уделяют достаточно внимания. Фреймворк чрезвычайно универсален, и я не уверен, что какой-либо другой язык или интерфейс превзошел его, сохранив при этом его универсальность. Я думаю, что это также лучший 3D-графический язык для начала - вы узнаете много вещей, которые другие языки могут скрыть за кулисами, как изучение C ++ до Java.

1 голос
/ 17 июля 2009

Если вы хотите уменьшить этот и другие примеры из Красной книги, не кодируйте информацию о цвете, вершине, освещенности и т. Д. Определитесь с форматом и прочитайте информацию о модели из файла. Это облегчит понимание примеров, и в конце концов вы не захотите, чтобы подобные вещи были жестко запрограммированы.

Остальная часть кода, как указывали другие авторы, необходима. Вам не нужно использовать GLUT, хотя в этом нет ничего плохого - я вроде как GLFW . Вы также можете попробовать Tao Framework , набор привязок Mono / .Net к GLUT, OpenGL, SDL, GLFW и многим другим. Оба кроссплатформенные.

1 голос
/ 17 июля 2009

Если вы хотите что-то помимо GLUT, вам нужно использовать контекстные элементы управления OpenGL, предоставляемые вашей операционной системой. Это значительно варьируется от платформы к платформе. NeHe Productions предоставляет десятки учебных пособий по OpenGL на своем сайте, и в самом начале они показывают, как создать контекст OpenGL в нескольких операционных системах.

Если вам все еще не хватает кроссплатформенной совместимости, то, вероятно, вам лучше всего будет SDL , что очень похоже на GLUT, поскольку это довольно тонкий слой над основными абстракциями, но он обеспечивает немного более богатая система событий и больше возможностей для взаимодействия с аппаратными средствами, такими как звук и джойстики.

Как говорится, в GLUT нет ничего особенно архаичного. Существует множество реализаций GLUT. Приятно то, что он почти наверняка присутствует на даже странно настроенных хостах, тогда как любое другое решение потребует либо кода для конкретной платформы, либо наличия некоторого уровня кроссплатформенной совместимости. Если бы я хотел упростить программу, которая должна отображать только трехмерную графику и взаимодействовать только с помощью мыши и клавиатуры, то я, вероятно, был бы полностью доволен GLUT.


Но если вы хотите еще проще, чем это? ну, я бы, вероятно, указал вам на библиотеку графов сцен с привязками к некоторому интерпретируемому языку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...