2013-07-03 27 views
0

我在Opengl中使用Eclipse C++創建保齡球遊戲。創建保齡球遊戲。在X軸上修改球的形狀

我創建使用glutSolidCone()錐和使用glutSolidSphere()球

當球的座標是GLfloat ball[] = {/* X */ 0.0f, /* Y */-2.0f, /* Z */ -6.0f, /*sphere*/ 0.9f, 50.0, 50.0 };

和球的代碼是glTranslated(ball[0], ball[1], ball[2]);

glutSolidSphere(ball[3], ball[4], ball[5]);它看起來像ball looks good

但是當我改變球的X軸GLfloat ball[] = {/* X */ -5.0f, /* Y */ -2.0f, /* Z */ -6.0f, /*sphere*/ 0.9f, 50.0, 50.0 };它看起來像not showing well

我對glutReshapeFunc()代碼如下: -

static void resize(int width, int height) { 
    const float ar = (float) width/(float) height; 

    glViewport(0, 0, width, height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(-ar, ar, -1.0, 1.0, 1.0, 100.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

爲什麼當我改變它的X值碗的形狀被改變?球在中間時如何保持相同?

+0

什麼問題? – Kevin

+0

@Kevin我在問,爲什麼當我改變球的X值時,第二張圖像中碗的形狀被修改了。 – Umair

+0

這就是所謂的視角,你可能有一個不同的視野超出你的預期。 – Kevin

回答

1

爲什麼碗的形狀在我改變它的X值時被修改?

你看到的是在球上應用的透視變形。

如何在球位於中央時保持相同?

使用更長的「透鏡」,即更窄的視場來減少透視失真。您可以通過使用glFrustum做到這一點,或者你使用像gluPerspective了一些輔助功能,有效地不只是這一點:

void gluPerspective(
    float fovyInDegrees, 
    float aspectRatio, 
    float znear, 
    float zfar) 
{ 
    float ymax, xmax; 
    float temp, temp2, temp3, temp4; 
    ymax = znear * tanf(fovyInDegrees * M_PI/360.0); 
    xmax = ymax * aspectRatio; 
    glFrustum(-xmax, xmax, -ymax, ymax, znear, zfar); 
} 

注意,總會有向圖的在仿射角度邊緣有些失真。