Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用opengl实现真等轴测投影 我是一个用C++编写的OpenGL程序新手,数学不太好。有没有一种简单的方法可以进行等距投影_C++_Opengl_Projection_Isometric - Fatal编程技术网

用opengl实现真等轴测投影 我是一个用C++编写的OpenGL程序新手,数学不太好。有没有一种简单的方法可以进行等距投影

用opengl实现真等轴测投影 我是一个用C++编写的OpenGL程序新手,数学不太好。有没有一种简单的方法可以进行等距投影,c++,opengl,projection,isometric,C++,Opengl,Projection,Isometric,我是说,不是一般的正交投影 (仅当单位X、Y和Z向量的投影长度相等且它们之间的角度正好为120度时,才会发生等轴测投影。) 非常欣赏代码片段。尝试使用 导致 我们可以画一个立方体来检查平行线是否确实是平行的 glPushMatrix(); glTranslated(0.5, 0.5, 0.5); glColor3d(0.5, 0.5, 0.5); glutWireCube(1); glPopMatrix(); 也许我的数学计算不太准确,但你不能按照维基百科链接中的解释定位你的相机并使用标准正

我是说,不是一般的正交投影

(仅当单位X、Y和Z向量的投影长度相等且它们之间的角度正好为120度时,才会发生等轴测投影。)

非常欣赏代码片段。

尝试使用

导致

我们可以画一个立方体来检查平行线是否确实是平行的

glPushMatrix();
glTranslated(0.5, 0.5, 0.5);
glColor3d(0.5, 0.5, 0.5);
glutWireCube(1);
glPopMatrix();

也许我的数学计算不太准确,但你不能按照维基百科链接中的解释定位你的相机并使用标准正交投影吗

即使不同,投影堆栈也完全取决于您

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// your isometric matrix here (see math on Wikipedia)
glMatrixMode(GL_MODELVIEW);

等轴测投影只是使用具有特定旋转角度的正交投影的问题


您应该能够通过正交投影选择8个潜在方向中的任意一个,并获得模型的完美等轴测视图。只需按照参考Wiki文章中的数学设置视图矩阵,并对投影矩阵进行正交投影,就可以了。

如果您不想使用GLU,下面是使用glOrtho的裸体

void gl_enter_2_5d_mode (void)
{
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();

    glLoadIdentity();

    double scale = 50;
    glOrtho(-scale,
            scale,
            -scale * 0.7,
            scale * 0.7,
            -scale,
            scale);

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();

    glLoadIdentity();

    glRotatef(35.264f, 1.0f, 0.0f, 0.0f);
    glRotatef(-45.0f, 0.0f, 1.0f, 0.0f);
}

void gl_leave_2_5d_mode (void)
{
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();

    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
}

then draw a cube in it

void cube (double size)
{
    glBegin(GL_QUADS);

    glVertex3f(size,size,size);
    glVertex3f(-size,size,size);
    glVertex3f(-size,-size,size);
    glVertex3f(size,-size,size);

    glVertex3f(size,size,-size);
    glVertex3f(-size,size,-size);
    glVertex3f(-size,-size,-size);
    glVertex3f(size,-size,-size);

    glVertex3f(size,size,size);
    glVertex3f(size,-size,size);
    glVertex3f(size,-size,-size);
    glVertex3f(size,size,-size);

    glVertex3f(-size,size,size);
    glVertex3f(-size,-size,size);
    glVertex3f(-size,-size,-size);
    glVertex3f(-size,size,-size);

    glVertex3f(size,size,size);
    glVertex3f(-size,size,size);
    glVertex3f(-size,size,-size);
    glVertex3f(size,size,-size);

    glVertex3f(size,-size,size);
    glVertex3f(-size,-size,size);
    glVertex3f(-size,-size,-size);
    glVertex3f(size,-size,-size);

    glEnd();
}

void test (void)
{
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glBindTexture(GL_TEXTURE_2D, 0);
    cube(1.0);
    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
}
叫这样的东西

gl_enter_2_5d_mode()
test()
gl_leave_2_5d_mode()
如果你想在2d和2.5d之间切换(这样你可以绘制你的UI),那么我有类似的功能来进入和离开2d模式,例如

void gl_init_2d_mode (void)
{
    /*
     * Enable Texture Mapping
     */
    glEnable(GL_TEXTURE_2D);

    /*
     * Enable alpha blending for sprites
     */
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    /*
     * Setup our viewport
     */
    glViewport(0, 0, game.video_pix_width,
               game.video_pix_height);

    /*
     * Make sure we're changing the model view and not the projection
     */
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();

    /*
     * Reset the view
     */
    glLoadIdentity();

    gl_init_fbo();
}

void gl_enter_2d_mode (void)
{
    /*
     * Change to the projection matrix and set our viewing volume.
     */
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();

    /*
     * Reset the view
     */
    glLoadIdentity();

    /*
     * 2D projection
     */
    glOrtho(0,
             game.video_gl_width, game.video_gl_height,
             0, -1200.0, 1200.0);

    /*
     * Make sure we're changing the model view and not the projection
     */
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();

    /*
     * Reset the view
     */
    glLoadIdentity();
}

这不会给你一个等距投影,因为平行线,比如说沿x轴和y轴的平行线,在它们实际应该平行的时候不会出现。看看维基百科文章中的图片,在这个问题中也链接了,这看起来和那个投影一模一样。任何平行线都将显示为平行,因为这是正交投影()。x轴和y轴不平行。我不是说x轴和y轴平行,但平行于x轴的线在等距投影中应该是平行的(我不认为它们在你的投影中是平行的),同样在y方向。哎哟,我的错。我没注意到你只是打电话来看看+1.现在是副本
void gl_init_2d_mode (void)
{
    /*
     * Enable Texture Mapping
     */
    glEnable(GL_TEXTURE_2D);

    /*
     * Enable alpha blending for sprites
     */
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    /*
     * Setup our viewport
     */
    glViewport(0, 0, game.video_pix_width,
               game.video_pix_height);

    /*
     * Make sure we're changing the model view and not the projection
     */
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();

    /*
     * Reset the view
     */
    glLoadIdentity();

    gl_init_fbo();
}

void gl_enter_2d_mode (void)
{
    /*
     * Change to the projection matrix and set our viewing volume.
     */
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();

    /*
     * Reset the view
     */
    glLoadIdentity();

    /*
     * 2D projection
     */
    glOrtho(0,
             game.video_gl_width, game.video_gl_height,
             0, -1200.0, 1200.0);

    /*
     * Make sure we're changing the model view and not the projection
     */
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();

    /*
     * Reset the view
     */
    glLoadIdentity();
}