Qt实现读取显示obj文件——归一化坐标

来源:互联网 发布:imap smtp 端口 编辑:程序博客网 时间:2024/05/17 23:47

归一化坐标的最大用处就是将节点坐标转换在-1~1的范围内,从而可以显示在我们的视线范围内!~

总体的思路就是找出节点中最大值作为基数,然后平移,缩放!

//将图形移到屏幕中间来float _glUnitize(_GLModel* model){    float maxx, minx, maxy, miny, maxz, minz;    float cx, cy, cz, w, h, d;    float scale;    if (model&&model->list_Vertices.size() > 0)    {        //注意不能将第一个点放在循环中        maxx = minx = model->list_Vertices[0]._X;        maxy = miny = model->list_Vertices[0]._Y;        maxz = minz = model->list_Vertices[0]._Z;        for (size_t i = 1; i < model->num_Vertices; i++)        {            if (maxx < model->list_Vertices[i]._X)                maxx = model->list_Vertices[i]._X;            if (minx > model->list_Vertices[i]._X)                minx = model->list_Vertices[i]._X;            if (maxy < model->list_Vertices[i]._Y)                maxy = model->list_Vertices[i]._Y;            if (miny > model->list_Vertices[i]._Y)                miny = model->list_Vertices[i]._Y;            if (maxz < model->list_Vertices[i]._Z)                maxz = model->list_Vertices[i]._Z;            if (minz > model->list_Vertices[i]._Z)                minz = model->list_Vertices[i]._Z;        }        w = _glmAbs(maxx) + _glmAbs(minx);        h = _glmAbs(maxy) + _glmAbs(miny);        d = _glmAbs(maxz) + _glmAbs(minz);        //计算模型的中心        cx = (maxx + minx) / 2.0;        cy = (maxy + miny) / 2.0;        cz = (maxz + minz) / 2.0;        scale = 2.0 / _glmMax(w, _glmMax(h, d));        //将中心按照比例转换        for (size_t i = 0; i < model->num_Vertices; i++)        {            model->list_Vertices[i]._X -= cx;            model->list_Vertices[i]._Y -= cy;            model->list_Vertices[i]._Z -= cz;            model->list_Vertices[i]._X *= scale;            model->list_Vertices[i]._Y *= scale;            model->list_Vertices[i]._Z *= scale;        }    }    return scale;}

这样,平移并缩放过后的节点坐标就是在边长为2的立方体中了!~

0 0
原创粉丝点击