把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个部分,然后按适当的最小值/最大值进行缩放。但我不确定这是否有效。有什么想法吗?
答案 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;