我正在尝试使用GL_POLYGON
绘制一个圆圈,我尝试的代码正在运行,但圆圈的半径似乎与窗口大小不符,我不明白为什么。
以下是代码:
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
if(start == OFF)
{
//Set Drawing Color - Will Remain this color until otherwise specified
glColor3f(0.2, 0.3, 0.5); //Some type of blue
//Draw Circle
glBegin(GL_POLYGON);
for(double i = 0; i < 2 * PI; i += PI / 24)
glVertex3f((cos(i) * radius) + gX,(sin(i) * radius) + gY, 0.0);
glEnd();
//Draw Circle
center_x = gX;
center_y = gY;
}
glutSwapBuffers();
}
和init函数:
void init (void)
{
/* selecionar cor de fundo (preto) */
glClearColor (0.0, 0.0, 0.0, 0.0);
/* inicializar sistema de viz. */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
我将窗口大小设置为600,半径为1,圆圈的四分之一将我们整个窗口。我猜我必须用半径进行某种变换,我只是不知道如何。
答案 0 :(得分:1)
投影矩阵描述了从场景的3D点到视口的2D点的映射。它从眼睛空间转换到剪辑空间,并且通过用剪辑坐标的w
分量进行划分,将剪辑空间中的坐标转换为规范化设备坐标(NDC)。 NDC在(-1,-1,-1)到(1,1,1)的范围内。
在Orthographic Projection中,眼睛空间中的坐标线性映射到标准化设备坐标。
可以通过glOrtho
设置正交投影。您正在设置一个视口左下角为(0,0),右上角为(1,1),深度范围为-1到1:
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
如果你想设置一个允许你绘制窗口大小比例的投影,那么你必须这样做:
int wndWidth = 800; // for example a window with the size 800*600
int wndHeight = 600;
glOrtho( 0.0, (float)wndWidth, 0.0, (float)wndHeight, -1.0, 1.0 );
如果你想在窗口的中心放置(0,0)的原点,那么你必须这样做:
float w = (float)wndWidth/2.0f;
float h = (float)wndHeight/2.0f;
glOrtho( -w, w, -h, h, -1.0, 1.0 );
进一步了解:
答案 1 :(得分:0)
如果 Rabbid76 的回答(日期时间戳:2017-09-17T07:10)还没有解决您的问题,请使用以下计算机说明进行验证:
将窗口宽度和高度设置为您使用的值,例如600x600
示例:
int iWindowWidth=600;
int iWindowHeight=600;
glScalef(iWindowHeight/(iWindowWidth*1.0f), 1.0f, 1.0f);
//Draw Circle
glBegin(GL_POLYGON);
for(double i = 0; i < 2 * PI; i += PI / 24) {
glVertex3f((cos(i) * radius) + gX,(sin(i) * radius) + gY, 0.0);
}
glEnd();
//reset scaled shape
glScalef(1.0f, 1.0f, 1.0f);
提醒:我们需要将整数(即整数)转换为浮点数(即带分数的数字)。
我们添加:(iWindowWidth*1.0f)
这是由于 iWindowHeight/iWindowWidth
,例如1366/768 = 0.5622...
,即不是整数
谢谢。