1

渲染三角形:

private void OpenGLControl_OpenGLDraw(object sender, SharpGL.SceneGraph.OpenGLEventArgs args)
{
    OpenGL gL = GLControl.OpenGL;

    gL.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); 
    gL.LoadIdentity();

    maxX = Math.Max(AX, Math.Max(BX, CX));
    maxY = Math.Max(AY, Math.Max(BY, CY));
    minX = Math.Min(AX, Math.Min(BX, CX));
    minY = Math.Min(AX, Math.Min(BX, CX));
    maxZ = Math.Max(AZ, Math.Max(BZ, CZ));
    minZ = Math.Min(AZ, Math.Min(BZ, CZ));

    double figureWidht = maxX - minX;
    double figureHeight = maxY - minY;
    double figureSquare = figureWidht * figureHeight;


    double viewPortSquare = GLControl.Width * GLControl.Height;

    gL.Translate(-figureWidht / 2, -figureHeight / 2, -6);

    gL.Begin(OpenGL.GL_LINES);
    gL.Color(1.0F, 1.0F, 1.0F);
    gL.Vertex((float)AX, (float)AY, (float)AZ);
    gL.Vertex((float)BX, (float)BY, (float)BZ);
    gL.Vertex((float)BX, (float)BY, (float)BZ);
    gL.Vertex((float)CX, (float)CY, (float)CZ);
    gL.Vertex((float)CX, (float)CY, (float)CZ);
    gL.Vertex((float)AX, (float)AY, (float)AZ);
    gL.End();

}

如何使图形始终适合OpenGLControl的视口?即如果图形大于opengl窗口,则调整到这个窗口,使所有轴的间距大致相同,如果小于,则相应变大。

我在图片上解释: 解释在

4

2 回答 2

0

精神错乱

我会创建一个边界框(计算顶点的 minX、maxX、minY、maxY、minZ、maxZ)

然后检查每个轴的最大增量 Max(maxX-minX, maxY-minY, maxZ- minZ)

使用此最大增量在所有轴上使用相同的增量缩小对象(创建比例矩阵) scale(1/maxDelta, 1/maxDelta, 1/maxDelta)

现在您的对象在 1, 1, 1 范围内。现在您可以将其缩放到当前视口大小。

于 2018-08-02T11:30:44.600 回答
0

在 OpengL 2.1 下,您可以使用glViewport(...)来定义视口。作为下一步,您定义一个透视图。在 OpengL 2.1 下,您可以使用glFrustum(...)glOrtho(...)。在这种情况下,您还应该查看glloadidentity()glMatrixMode()glPushMatrix()glPopMatrix()

https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/

于 2018-08-02T10:52:30.577 回答