缩放因子自动居中网格?

时间:2014-12-10 02:04:12

标签: opengl graphics computational-geometry mesh

把Vu带到这里。我正在尝试开发一个自动居中网格的程序。我的程序目前接收.obj文件,并计算这些重要值:

- 网格的最大x,y,z - 最小x.y,z网格位置;

我试图找出一个来计算给定这些参数的摄像机位置。到目前为止,我使用边界框使网格居中并计算半径:

            offset_x = (max_x + min_x)/2;
            offset_y = (max_y + min_y)/2;
            offset_z = (max_z + min_z)/2;

            radius = 0.0;
            for each vertex v
                v = v - offset;
                if(v.abs() > radius) radius = v.abs;

这是我的外观和投影代码:

            gluLookAt (0.0, 0.0,radius,
                       0.0, 0.0, 0.0,
                       0.0, 1.0, 0.0);

            ...
            GLdouble znear = 1.0;
            GLdouble zfar = znear + 2*radius;
            GLdouble aspect = (GLdouble) w/(1.0f*h);

            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            glViewport(0, 0, w, h);
            gluPerspective(50.0, aspect, znear, zfar);

然而,由于边界框的不对称性,这种方法没有很好的效果。我想以某种方式将网格缩放到[-1,-1,-1]到[1,1,1]。但是,我不知道缩放因子应该是什么。我想我可能不得不根据顶点将网格分成8个部分,然后按适当的最小值/最大值进行缩放。但我不确定这是否有效。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

试试这个(OPENGLWIDTH,OPENGLHEIGHT和OPENGLDEPTH是#defines)。这可以缩放以填充屏幕的90%(1.8因子):

        double xScale = 1.0, xOffset, yOffset, zOffset;
        double range = maxX - minX;

        if(range > 0.1)
        {
            xScale = 1.8 * OPENGLWIDTH / range;
        }

        double yScale = 1.0;
        range = maxY - minY;

        if(range > 0.1)
        {
            yScale = 1.8 * OPENGLHEIGHT / range;
        }

        double zScale = 1.0;
        range = maxZ - minZ;

        if(range > 0.1)
        {
            zScale = 1.8 * OPENGLDEPTH / range;
        }

        if(yScale < xScale) xScale = yScale;
        if(zScale < xScale) xScale = zScale;

        xOffset = xScale * (maxX + minX) / 2.0;
        yOffset = xScale * (maxY + minY) / 2.0;
        zOffset = xScale * (maxZ + minZ) / 2.0;