Как нарисовать мороженое с OpenGL

MAN CHUN LIEW спросил: 03 ноября 2018 в 08:48 в: c

Как вопрос, как нарисовать 3d мороженое? Я должен нарисовать конус и мяч. Но мяч не может поместиться внутри конуса ..... Я стараюсь изо всех сил, но шар либо заостряется за конусом, либо целиком сообщает конусу ... Кто-нибудь может меня извинить за это. Я следовал записке лектора, но все еще не смог получить.

#include <Windows.h>
#include <gl/GL.h>
#include <math.h>
#include <time.h>
#include <gl/GLU.h>
#pragma comment (lib, "OpenGL32.lib")
#pragma comment (lib, "GLU32.lib")#define WINDOW_TITLE "OpenGL Window"LRESULT WINAPI WindowProcedure(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;    default:
        break;
    }    return DefWindowProc(hWnd, msg, wParam, lParam);
}
//--------------------------------------------------------------------bool initPixelFormat(HDC hdc)
{
    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));    pfd.cAlphaBits = 8;
    pfd.cColorBits = 32;
    pfd.cDepthBits = 24;
    pfd.cStencilBits = 0;    pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;    pfd.iLayerType = PFD_MAIN_PLANE;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion = 1;    // choose pixel format returns the number most similar pixel format available
    int n = ChoosePixelFormat(hdc, &pfd);    // set pixel format returns whether it sucessfully set the pixel format
    if (SetPixelFormat(hdc, n, &pfd))
    {
        return true;
    }
    else
    {
        return false;
    }
}
//--------------------------------------------------------------------void display()
{
    glPushMatrix();
    glRotatef(120, 1.0, 0, 0);    GLUquadricObj  * cylinder = NULL;
    cylinder = gluNewQuadric();
    glColor3f(1, 0, 0);
    gluQuadricDrawStyle(cylinder, GLU_FILL);
    gluCylinder(cylinder, 0.52, 0.0, 2.0, 30, 20);
    gluDeleteQuadric(cylinder);    GLUquadricObj  * sphere = NULL;
    sphere = gluNewQuadric();
    glColor3f(1, 1, 1);
    gluQuadricDrawStyle(sphere, GLU_LINE);
    gluSphere(sphere, 0.5, 20, 20);
    gluDeleteQuadric(sphere);    glPopMatrix();
}
//--------------------------------------------------------------------int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
{
    WNDCLASSEX wc;
    ZeroMemory(&wc, sizeof(WNDCLASSEX));    wc.cbSize = sizeof(WNDCLASSEX);
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpfnWndProc = WindowProcedure;
    wc.lpszClassName = WINDOW_TITLE;
    wc.style = CS_HREDRAW | CS_VREDRAW;    if (!RegisterClassEx(&wc)) return false;    HWND hWnd = CreateWindow(WINDOW_TITLE, WINDOW_TITLE, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 800, 640,
        NULL, NULL, wc.hInstance, NULL);    //--------------------------------
    //  Initialize window for OpenGL
    //--------------------------------    HDC hdc = GetDC(hWnd);    //  initialize pixel format for the window
    initPixelFormat(hdc);    //  get an openGL context
    HGLRC hglrc = wglCreateContext(hdc);    //  make context current
    if (!wglMakeCurrent(hdc, hglrc)) return false;    //--------------------------------
    //  End initialization
    //--------------------------------    ShowWindow(hWnd, nCmdShow);    MSG msg;
    ZeroMemory(&msg, sizeof(msg));
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-2.0f, +3.0f, -2.0f, +2.0f, -10.0f, +10.0f);    while (true)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT) break;            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }        display();        SwapBuffers(hdc);
    }    UnregisterClass(WINDOW_TITLE, wc.hInstance);    return true;
}
//--------------------------------------------------------------------

0 ответов