Я пытаюсь создать ориентированную ограничительную рамку вокруг стемфордского кролика для проекта. Для этого я создаю ковариационную матрицу с вершинами и использую столбцы собственного вектора в качестве новых векторов оси для 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]);
Как вы можете видеть ниже, коробка не подходит точно на кролик, и не совпадает с осью я нарисовал ... Могу ли я что-то пропустил? Ive жареное мой мозг, пытаясь найти решение, но безрезультатно ...
В качестве побочного элемента: если среднее значение кролика находится точно в начале координат, новая «локальная система координат» или система собственных векторов ** не ** центрируется на (0,0,0), но на (среднее значение X, означает , meanZ) –
Также обратите внимание: средняя точка '[(max-min)/2]' является ** не ** средней точкой '[sum (x)/nx]'! –