首页 文章

带有定向边界框的轴旋转

提问于
浏览
2

我正试图在stamford兔子周围放置一个定向的边界框来进行项目 . 为此,我使用顶点创建协方差矩阵,并使用特征向量列作为OBB的新轴向量 .

为了绘制OBB,我将矢量列的叉积与x,y和z轴一起找到垂直的矢量,然后我使用点积来找到它们之间的角度 .

//rv,uv,fv are the normalised column vectors from the eigenvector matrix.
// Calculate cross product for normal
crossv1x[0] = xaxis[1]*rv[2] - xaxis[2]*rv[1];
crossv1x[1] = xaxis[2]*rv[0] - xaxis[0]*rv[2];
crossv1x[2] = xaxis[0]*rv[1] - xaxis[1]*rv[0];

// Calculate cross product for normal
crossv2y[0] = yaxis[1]*uv[2] - yaxis[2]*uv[1];
crossv2y[1] = yaxis[2]*uv[0] - yaxis[0]*uv[2];
crossv2y[2] = yaxis[0]*uv[1] - yaxis[1]*uv[0];

// Calculate cross product for normal
crossv3z[0] = zaxis[1]*fv[2] - zaxis[2]*fv[1];
crossv3z[1] = zaxis[2]*fv[0] - zaxis[0]*fv[2];
crossv3z[2] = zaxis[0]*fv[1] - zaxis[1]*fv[0];

//dot product:
thetaX = dot(xaxis,rv,1)*180/PI;
thetaY = dot(yaxis,uv,1)*180/PI;
thetaZ = dot(zaxis,fv,1)*180/PI;

然后我在十字产品矢量周围应用一个旋转,其角度由点积确定(glRotatef(角度,交叉[0],交叉1,交叉[2]),每个轴) . 然后我绘制一个轴对齐的边界框,然后反向旋转回到原始位置 .

glRotatef(thetaY,crossv2y[0],crossv2y[1],crossv2y[2]);
        glRotatef(thetaZ,crossv3z[0],crossv3z[1],crossv3z[2]);
        glRotatef(thetaX,crossv1x[0],crossv1x[1],crossv1x[2]);

        glTranslatef(-meanX, -meanY, -meanZ);
        glColor3f(1.0f,0.0f,0.0f);
        AOBB(1); //Creates an axis aligned box.

        glRotatef(-thetaX,crossv1x[0],crossv1x[1],crossv1x[2]);
        glRotatef(-thetaZ,crossv3z[0],crossv3z[1],crossv3z[2]);
        glRotatef(-thetaY,crossv2y[0],crossv2y[1],crossv2y[2]);

正如你在下面看到的那样,盒子并不完全适合兔子,也没有与我绘制的轴对齐......我在这里遗漏了什么?我试图找到解决方案但是无济于事......

enter image description here

1 回答

  • 2

    要绘制OBB,我将矢量列的叉积与x,y和z轴一起找到垂直的矢量,然后我使用点积来找到它们之间的角度 .

    那些"vector columns?"那些实际上是你想要生成的旋转矩阵的列 .

    因此,不是使用这些向量来计算旋转角度,而是构建一个矩阵,将那些(标准化的)向量作为列 . 用 glMultMatrix 上传它,你应该没问题 .

相关问题