python opengl draw 3d object

I presume that you have some knowledge of OpenGL. Otherwise, read "Introduction to OpenGL with 2nd Graphics".

Example 1: 3D Shapes (OGL01Shape3D.cpp)

This example is taken from Nehe OpenGL Tutorial Lesson # five (@ http://nehe.gamedev.net/), which displays a 3D color-cube and a pyramid. The cube is made of of half-dozen quads, each having different colors. The hallow pyramid is fabricated up of 4 triangle, with different colors on each of the vertices.

i 2 3 four 5 six 7 viii 9 x eleven 12 thirteen 14 15 sixteen 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 forty 41 42 43 44 45 46 47 48 49 l 51 52 53 54 55 56 57 58 59 sixty 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 fourscore 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
                    #include <windows.h>   #include <GL/overabundance.h>      char title[] = "3D Shapes";    void initGL() {    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);     glClearDepth(ane.0f);                       glEnable(GL_DEPTH_TEST);       glDepthFunc(GL_LEQUAL);        glShadeModel(GL_SMOOTH);       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   }    void display() {    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     glMatrixMode(GL_MODELVIEW);               glLoadIdentity();                     glTranslatef(1.5f, 0.0f, -7.0f);        glBegin(GL_QUADS);                                     glColor3f(0.0f, 1.0f, 0.0f);            glVertex3f( 1.0f, ane.0f, -1.0f);       glVertex3f(-ane.0f, ane.0f, -1.0f);       glVertex3f(-i.0f, 1.0f,  1.0f);       glVertex3f( 1.0f, 1.0f,  one.0f);                glColor3f(1.0f, 0.5f, 0.0f);            glVertex3f( 1.0f, -1.0f,  1.0f);       glVertex3f(-ane.0f, -1.0f,  1.0f);       glVertex3f(-ane.0f, -1.0f, -ane.0f);       glVertex3f( 1.0f, -1.0f, -1.0f);                glColor3f(1.0f, 0.0f, 0.0f);            glVertex3f( i.0f,  1.0f, i.0f);       glVertex3f(-1.0f,  1.0f, 1.0f);       glVertex3f(-1.0f, -1.0f, ane.0f);       glVertex3f( 1.0f, -1.0f, one.0f);                glColor3f(1.0f, 1.0f, 0.0f);            glVertex3f( ane.0f, -1.0f, -1.0f);       glVertex3f(-1.0f, -1.0f, -i.0f);       glVertex3f(-one.0f,  1.0f, -i.0f);       glVertex3f( i.0f,  1.0f, -1.0f);                glColor3f(0.0f, 0.0f, 1.0f);            glVertex3f(-1.0f,  1.0f,  1.0f);       glVertex3f(-i.0f,  1.0f, -1.0f);       glVertex3f(-one.0f, -1.0f, -one.0f);       glVertex3f(-1.0f, -one.0f,  1.0f);                glColor3f(1.0f, 0.0f, 1.0f);            glVertex3f(1.0f,  ane.0f, -1.0f);       glVertex3f(i.0f,  one.0f,  1.0f);       glVertex3f(1.0f, -one.0f,  1.0f);       glVertex3f(i.0f, -ane.0f, -1.0f);    glEnd();            glLoadIdentity();                      glTranslatef(-one.5f, 0.0f, -half dozen.0f);        glBegin(GL_TRIANGLES);                         glColor3f(one.0f, 0.0f, 0.0f);            glVertex3f( 0.0f, one.0f, 0.0f);       glColor3f(0.0f, 1.0f, 0.0f);            glVertex3f(-one.0f, -1.0f, i.0f);       glColor3f(0.0f, 0.0f, 1.0f);            glVertex3f(1.0f, -i.0f, one.0f);                glColor3f(1.0f, 0.0f, 0.0f);            glVertex3f(0.0f, 1.0f, 0.0f);       glColor3f(0.0f, 0.0f, 1.0f);            glVertex3f(1.0f, -one.0f, ane.0f);       glColor3f(0.0f, 1.0f, 0.0f);            glVertex3f(i.0f, -1.0f, -1.0f);                glColor3f(1.0f, 0.0f, 0.0f);            glVertex3f(0.0f, 1.0f, 0.0f);       glColor3f(0.0f, one.0f, 0.0f);            glVertex3f(ane.0f, -1.0f, -1.0f);       glColor3f(0.0f, 0.0f, 1.0f);            glVertex3f(-1.0f, -ane.0f, -1.0f);                glColor3f(1.0f,0.0f,0.0f);              glVertex3f( 0.0f, i.0f, 0.0f);       glColor3f(0.0f,0.0f,ane.0f);              glVertex3f(-1.0f,-1.0f,-1.0f);       glColor3f(0.0f,i.0f,0.0f);              glVertex3f(-1.0f,-one.0f, 1.0f);    glEnd();         glutSwapBuffers();   }    void reshape(GLsizei width, GLsizei peak) {          if (height == 0) height = 1;                    GLfloat aspect = (GLfloat)width / (GLfloat)acme;          glViewport(0, 0, width, pinnacle);          glMatrixMode(GL_PROJECTION);      glLoadIdentity();                     gluPerspective(45.0f, aspect, 0.1f, 100.0f); }    int principal(int argc, char** argv) {    glutInit(&argc, argv);                glutInitDisplayMode(GLUT_DOUBLE);     glutInitWindowSize(640, 480);       glutInitWindowPosition(50, 50);     glutCreateWindow(title);              glutDisplayFunc(display);           glutReshapeFunc(reshape);           initGL();                           glutMainLoop();                     render 0; }

Overabundance Setup - main()

The plan contains a initGL(), brandish() and reshape() functions.

The master() program:

  1. glutInit(&argc, argv);
    Initializes the Overabundance.
  2. glutInitWindowSize(640, 480);
    glutInitWindowPosition(fifty, 50);
    glutCreateWindow(title);

    Creates a window with a championship, initial width and height positioned at initial meridian-left corner.
  3. glutDisplayFunc(display);
    Registers display() as the re-paint event handler. That is, the graphics sub-system calls back display() when the window first appears and whenever there is a re-paint request.
  4. glutReshapeFunc(reshape);
    Registers reshape() as the re-sized effect handler. That is, the graphics sub-system calls back reshape() when the window first appears and whenever the window is re-sized.
  5. glutInitDisplayMode(GLUT_DOUBLE);
    Enables double buffering. In display(), we use glutSwapBuffers() to bespeak to the GPU to bandy the front-buffer and back-buffer during the next VSync (Vertical Synchronization).
  6. initGL();
    Invokes the initGL() one time to perform all one-fourth dimension initialization tasks.
  7. glutMainLoop();
    Finally, enters the issue-processing loop.
One-Time Initialization Operations - initGL()

The initGL() role performs the erstwhile initialization tasks. Information technology is invoked from principal() in one case (and only once).

glClearColor(0.0f, 0.0f, 0.0f, i.0f);
glClearDepth(one.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Gear up the clearing (background) color to black (R=0, K=0, B=0) and opaque (A=1), and the clearing (background) depth to the farthest (Z=1). In brandish(), we invoke glClear() to articulate the color and depth buffer, with the clearing color and depth, before rendering the graphics. (Besides the colour buffer and depth buffer, OpenGL also maintains an accumulation buffer and a stencil buffer which shall be discussed later.)

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

We need to enable depth-test to remove the hidden surface, and set the role used for the depth test.

glShadeModel(GL_SMOOTH);
We enable smooth shading in color transition. The alternative is GL_FLAT. Try it out and run into the deviation.

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
In graphics rendering, there is often a trade-off between processing speed and visual quality. We can use glHint() to decide on the merchandise-off. In this case, we inquire for the best perspective correction, which may involve more processing. The default is GL_DONT_CARE.

Defining the Color-cube and Pyramid

OpenGL's object is made upwardly of primitives (such every bit triangle, quad, polygon, point and line). A archaic is defined via i or more than vertices. The color-cube is fabricated up of 6 quads. Each quad is made up of iv vertices, defined in counter-clockwise (CCW) order, such as the normal vector is pointing out, indicating the front confront. All the 4 vertices have the same colour. The colour-cube is defined in its local space (called model space) with origin at the center of the cube with sides of 2 units.

Similarly, the pyramid is made up of 4 triangles (without the base of operations). Each triangle is made upwardly of 3 vertices, divers in CCW order. The 5 vertices of the pyramid are assigned different colors. The color of the triangles are interpolated (and alloy smoothly) from its iii vertices. Once more, the pyramid is defined in its local space with origin at the center of the pyramid.

Model Transform

The objects are divers in their local spaces (model spaces). We need to transform them to the common world space, known equally model transform.

To perform model transform, nosotros demand to operate on the then-chosen model-view matrix (OpenGL has a few transformation matrices), by setting the current matrix way to model-view matrix:

glMatrixMode(GL_MODELVIEW);

We perform translations on cube and pyramid, respectively, to position them on the world space:


glLoadIdentity();
glTranslatef(1.5f, 0.0f, -seven.0f);

glLoadIdentity();
glTranslatef(-1.5f, 0.0f, -6.0f);

View Transform

The default camera position is:

gluLookAt(0.0, 0.0, 0.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0)

That is, Middle=(0,0,0) at the origin, AT=(0,0,-100) pointing at negative-z centrality (into the screen), and UP=(0,1,0) corresponds to y-axis.

OpenGL graphics rendering pipeline performs so-chosen view transform to bring the earth space to camera'southward view space. In the case of the default camera position, no transform is needed.

Viewport Transform

void reshape(GLsizei width, GLsizei tiptop) {
glViewport(0, 0, width, height);

The graphics sub-system calls back reshape() when the window first appears and whenever the window is resized, given the new window'south width and acme, in pixels. We set our application viewport to embrace the entire window, top-left corner at (0, 0) of width and peak, with default minZ of 0 and maxZ of i. We besides apply the same attribute ratio of the viewport for the project view frustum to prevent distortion. In the viewport, a pixel has (10, y) value also as z-value for depth processing.

Projection Transform

GLfloat aspect = (GLfloat)width / (GLfloat)elevation;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, aspect, 0.1f, 100.0f);
A camera has limited field of view. The projection models the view captured by the photographic camera. At that place are two types of projection: perspective project and orthographic projection. In perspective projection, object farther to the camera appears smaller compared with object of the same size nearer to the camera. In orthographic projection, the objects appear the same regardless of the z-value. Orthographic project is a special case of perspective projection where the camera is placed very far abroad. We shall talk over the orthographic project in the later example.

To set the projection, nosotros need to operate on the projection matrix. (Remember that we operated on the model-view matrix in model transform.)

We set the matrix mode to projection matrix and reset the matrix. We use the gluPerspective() to enable perspective projection, and set the fovy (view angle from the bottom-plane to the height-plane), aspect ratio (width/height), zNear and zFar of the View Frustum (truncated pyramid). In this example, we set the fovy to 45°. We use the same attribute ratio as the viewport to avoid distortion. We prepare the zNear to 0.ane and zFar to 100 (z=-100). Take that note the color-cube (1.5, 0, -7) and the pyramid (-1.v, 0, -6) are independent within the View Frustum.

The projection transform transforms the view frustum to a 2x2x1 cuboid clipping-volume centered on the near aeroplane (z=0). The subsequent viewport transform transforms the clipping-volume to the viewport in screen infinite. The viewport is fix earlier via the glViewport() function.

Instance 2: 3D Shape with Animation (OGL02Animation.cpp)

Let'due south modify the previous instance to carry out animation (rotating the cube and pyramid).

ane 2 3 4 5 6 vii viii 9 10 eleven 12 xiii 14 15 sixteen 17 18 19 twenty 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 xl 41 42 43 44 45 46 47 48 49 l 51 52 53 54 55 56 57 58 59 lx 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
                    #include <windows.h>   #include <GL/overabundance.h>      char title[] = "3D Shapes with animation";                  GLfloat anglePyramid = 0.0f;   GLfloat angleCube = 0.0f;      int refreshMills = 15;                                     void initGL() {    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);     glClearDepth(1.0f);                       glEnable(GL_DEPTH_TEST);       glDepthFunc(GL_LEQUAL);        glShadeModel(GL_SMOOTH);       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   }    void display() {    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     glMatrixMode(GL_MODELVIEW);               glLoadIdentity();                     glTranslatef(1.5f, 0.0f, -seven.0f);                    glRotatef(angleCube, 1.0f, 1.0f, 1.0f);                                    glBegin(GL_QUADS);                                     glColor3f(0.0f, ane.0f, 0.0f);            glVertex3f( ane.0f, one.0f, -1.0f);       glVertex3f(-1.0f, 1.0f, -1.0f);       glVertex3f(-one.0f, ane.0f,  ane.0f);       glVertex3f( i.0f, 1.0f,  one.0f);                glColor3f(i.0f, 0.5f, 0.0f);            glVertex3f( 1.0f, -1.0f,  1.0f);       glVertex3f(-1.0f, -1.0f,  i.0f);       glVertex3f(-i.0f, -1.0f, -1.0f);       glVertex3f( 1.0f, -i.0f, -1.0f);                glColor3f(1.0f, 0.0f, 0.0f);            glVertex3f( i.0f,  i.0f, i.0f);       glVertex3f(-1.0f,  1.0f, 1.0f);       glVertex3f(-one.0f, -1.0f, i.0f);       glVertex3f( 1.0f, -1.0f, 1.0f);                glColor3f(1.0f, 1.0f, 0.0f);            glVertex3f( 1.0f, -1.0f, -ane.0f);       glVertex3f(-1.0f, -1.0f, -ane.0f);       glVertex3f(-ane.0f,  1.0f, -1.0f);       glVertex3f( 1.0f,  1.0f, -ane.0f);                glColor3f(0.0f, 0.0f, 1.0f);            glVertex3f(-1.0f,  1.0f,  1.0f);       glVertex3f(-1.0f,  one.0f, -i.0f);       glVertex3f(-1.0f, -1.0f, -i.0f);       glVertex3f(-ane.0f, -i.0f,  1.0f);                glColor3f(1.0f, 0.0f, 1.0f);            glVertex3f(one.0f,  1.0f, -1.0f);       glVertex3f(ane.0f,  1.0f,  i.0f);       glVertex3f(1.0f, -1.0f,  1.0f);       glVertex3f(1.0f, -ane.0f, -i.0f);    glEnd();            glLoadIdentity();                      glTranslatef(-1.5f, 0.0f, -6.0f);                    glRotatef(anglePyramid, 1.0f, i.0f, 0.0f);                                    glBegin(GL_TRIANGLES);                         glColor3f(ane.0f, 0.0f, 0.0f);            glVertex3f( 0.0f, ane.0f, 0.0f);       glColor3f(0.0f, one.0f, 0.0f);            glVertex3f(-1.0f, -ane.0f, 1.0f);       glColor3f(0.0f, 0.0f, 1.0f);            glVertex3f(1.0f, -1.0f, 1.0f);                glColor3f(i.0f, 0.0f, 0.0f);            glVertex3f(0.0f, ane.0f, 0.0f);       glColor3f(0.0f, 0.0f, ane.0f);            glVertex3f(i.0f, -1.0f, 1.0f);       glColor3f(0.0f, i.0f, 0.0f);            glVertex3f(1.0f, -1.0f, -1.0f);                glColor3f(1.0f, 0.0f, 0.0f);            glVertex3f(0.0f, 1.0f, 0.0f);       glColor3f(0.0f, 1.0f, 0.0f);            glVertex3f(1.0f, -ane.0f, -1.0f);       glColor3f(0.0f, 0.0f, 1.0f);            glVertex3f(-1.0f, -1.0f, -1.0f);                glColor3f(ane.0f,0.0f,0.0f);              glVertex3f( 0.0f, one.0f, 0.0f);       glColor3f(0.0f,0.0f,i.0f);              glVertex3f(-ane.0f,-1.0f,-1.0f);       glColor3f(0.0f,ane.0f,0.0f);              glVertex3f(-1.0f,-1.0f, 1.0f);    glEnd();         glutSwapBuffers();                                        anglePyramid += 0.2f;    angleCube -= 0.15f;                  }                                      void timer(int value) {    glutPostRedisplay();          glutTimerFunc(refreshMills, timer, 0);  }                   void reshape(GLsizei width, GLsizei elevation) {          if (height == 0) height = 1;                    GLfloat aspect = (GLfloat)width / (GLfloat)height;          glViewport(0, 0, width, height);          glMatrixMode(GL_PROJECTION);      glLoadIdentity();                     gluPerspective(45.0f, aspect, 0.1f, 100.0f); }    int main(int argc, char** argv) {    glutInit(&argc, argv);                glutInitDisplayMode(GLUT_DOUBLE);     glutInitWindowSize(640, 480);       glutInitWindowPosition(50, 50);     glutCreateWindow(title);              glutDisplayFunc(display);           glutReshapeFunc(reshape);           initGL();                                         glutTimerFunc(0, timer, 0);                                    glutMainLoop();                     return 0; }

The new codes are:

GLfloat anglePyramid = 0.0f;
GLfloat angleCube = 0.0f;
int refreshMills = fifteen;
We define two global variables to go on track of the current rotational angles of the cube and pyramid. We also define the refresh menstruum equally xv msec (66 frames per 2nd).

void timer(int value) {
glutPostRedisplay();
glutTimerFunc(refreshMills, timer, 0); //
}

To perform animation, we define a part called timer(), which posts a re-paint request to activate display() when the timer expired, then run the timer once again. In main(), nosotros perform the commencement timer() phone call via glutTimerFunc(0, timer, 0).

glRotatef(angleCube, 1.0f, i.0f, ane.0f);
......
glRotatef(anglePyramid, 1.0f, one.0f, 0.0f);
......
anglePyramid += 0.2f;
angleCube -= 0.15f;
In brandish(), nosotros rotate the cube and pyramid based on their rotational angles, and update the angles after each refresh.

Example three: Orthographic Projection (OGL03Orthographic.cpp)

As mentioned, OpenGL support two type of projections: perspective and orthographic. In orthographic projection, an object appears to be the same size regardless of the depth. Orthographic is a special case of perspective projection, where the camera is placed very far away.

To utilize orthographic projection, alter the reshape() function to invoke glOrtho().

void reshape(GLsizei width, GLsizei tiptop) {          if (height == 0) height = i;                    GLfloat aspect = (GLfloat)width / (GLfloat)height;          glViewport(0, 0, width, height);          glMatrixMode(GL_PROJECTION);      glLoadIdentity();                                   if (width >= height) {             glOrtho(-3.0 * aspect, three.0 * attribute, -three.0, 3.0, 0.1, 100);    } else {             glOrtho(-3.0, 3.0, -3.0 / aspect, 3.0 / attribute, 0.i, 100);    }          }

In this example, we set up the cantankerous-section of view-volume co-ordinate to the aspect ratio of the viewport, and depth from 0.1 to 100, corresponding to z=-0.1 to z=-100. Take note that the cube and pyramid are contained within the view-volume.

Example 4: Vertex Array

In the earlier example, cartoon a cube requires at to the lowest degree 24 glVertex functions and a pair of glBegin and glEnd. Function calls may involve loftier overhead and hinder the functioning. Furthermore, each vertex is specified and processed three times.

Link to OpenGL/Calculator Graphics References and Resources

robbinswhimars.blogspot.com

Source: https://www3.ntu.edu.sg/home/ehchua/programming/opengl/CG_Examples.html

0 Response to "python opengl draw 3d object"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel