0

我正在关注这些关于现代 OpenGL 的教程。我已经完成了 15 号“相机控制 - 第 2 部分”。本教程建议使用 glutWarpPointer()。问题是,我的程序在那次调用中崩溃了。这是我的代码:

c_camera::c_camera(int width, int height, const c_vector3f& Pos, const c_vector3f& Target, const c_vector3f& Up){
    m_windowWidth = width;
    m_windowHeight = height;
    m_pos = Pos;

    m_target = Target;
    m_target.Normalize();

    m_up = Up;
    m_up.Normalize();
    Init();
}

void c_camera::Init(){
    c_vector3f HTarget(m_target.x, 0.0, m_target.z);
    HTarget.Normalize();

    if (HTarget.z >= 0.0f){
        if (HTarget.x >= 0.0f){
            m_AngleH = 360.0f - (asin(HTarget.z) TO_DEG);
        } else {
            m_AngleH = 180.0f + (asin(HTarget.z) TO_DEG);
        }
    } else {
        if (HTarget.x >= 0.0f){
            m_AngleH = (asin(-HTarget.z) TO_DEG);
        } else {
            m_AngleH = 90.0f + (asin(-HTarget.z) TO_DEG);
        }
    }

    m_AngleV = -(asin(m_target.y) TO_DEG);

    m_OnUpperEdge = false;
    m_OnLowerEdge = false;
    m_OnLeftEdge = false;
    m_OnRightEdge = false;
    m_mousePos.x = m_windowWidth / 2;
    m_mousePos.y = m_windowHeight / 2;

    cout << "this gets printed just fine" << endl;

    glutWarpPointer(500,400); //program crashes

    cout << "this doesn't get printed" << endl;
}

我不确定我是否在这里做了一些奇怪的事情,或者我只是有一个糟糕的 glut 版本(对我来说似乎不太可能)或者教程是否是错误的......我是否需要在我之前设置一些 glut 特定的东西可以调用 glutWarpPointer() 吗?我是 glut 的新手,也是现代 OpenGL 的新手(我首先学习了即时模式)。快速的谷歌搜索对我没有多大帮助。任何帮助,将不胜感激。

编辑:我在 Windows 上,我正在使用 mingw 4.5

Edit2:这些是窗口给我的有关崩溃的详细信息:
问题事件名称:APPCRASH
应用程序名称:modern_opengl.exe
应用程序版本:0.0.0.0
应用程序时间戳:51044575
故障模块名称: glut32.dll 故障
模块版本:0.0.0.0
故障模块时间戳:3BEA4FF3
异常代码: C0000005
异常偏移量:0000A879
OS版本:6.2.9200.2.0.0.256.48
区域设置:1043
附加信息1:5861
附加信息2:58618222C64908B2
附加信息3:F3D5
附加信息4:F3D5BE0CAD2787555264647DC02181C3

Edit3:这是我的调用堆栈:
0 1000A879 glutWarpPointer() (C:\Windows\system\glut32.dll:??)
1 004033FB c_camera::Init(this=0x4aa0e0) (C:\CodeBlocks\projects\modern_opengl\c_camera .cpp:50)
2 00403164 c_camera::c_camera(this=0x4aa0e0, width=800, height=600, Pos=..., Target=..., Up=...) (C:\CodeBlocks\projects\ modern_opengl\c_camera.cpp:18)
3 00402F4B __static_initialization_and_destruction_0(__initialize_p=1, __priority=65535) (C:\CodeBlocks\projects\modern_opengl\main.cpp:55)
4 00403004 GLOBAL _sub_I_vertices() (C:\CodeBlocks\projects\现代_opengl\main.cpp:177)
5 0043595B __do_global_ctors() (../mingw/gccmain.c:59)
6 00401098 __mingw_CRTStartup() (../mingw/crt1.c:236)
7 00401284 mainCRTStartup() (../mingw/crt1.c:264)

4

1 回答 1

2

您的函数似乎在 c_camera::Init 中,它似乎在之前被调用过,main可能是因为它被实例化为全局对象(全局变量是在main输入之前构造的)。您应该延迟 glut 呼叫,直到您进入main并被呼叫之后glutInit

于 2013-01-27T00:47:26.410 回答