2015-12-03 9 views
1

Я пытаюсь создать ориентированную ограничительную рамку вокруг стемфордского кролика для проекта. Для этого я создаю ковариационную матрицу с вершинами и использую столбцы собственного вектора в качестве новых векторов оси для 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 жареное мой мозг, пытаясь найти решение, но безрезультатно ...

enter image description here

+0

В качестве побочного элемента: если среднее значение кролика находится точно в начале координат, новая «локальная система координат» или система собственных векторов ** не ** центрируется на (0,0,0), но на (среднее значение X, означает , meanZ) –

+0

Также обратите внимание: средняя точка '[(max-min)/2]' является ** не ** средней точкой '[sum (x)/nx]'! –

ответ

1

Чтобы нарисовать ÖBB, я беру декартово произведение векторных колонн с х, у и г осей найдите вектор перпендикулярно, и тогда я использую точечный продукт, чтобы найти угол между ними.

Те "векторные столбцы?" Это на самом деле столбцы матрицы вращения, которую вы хотите сгенерировать.

Таким образом, вместо использования этих векторов для вычисления углов вращения просто создайте матрицу с этими (нормализованными) векторами в виде столбцов. Загрузите его с glMultMatrix, и все будет хорошо.

+0

Спасибо! который полностью совпадал с осью, но коробка все еще не полностью вокруг кролика. Я думаю, это связано с тем, что повороты сдвинули центральную точку от 0,0,0. Я попытался поместить перевод с обеих сторон матриц вращения с величиной средней точки между макс/мин каждой оси (например, xc = (xmax + xmin)/2), чтобы противостоять этому так: glMultMatrixd (M); glTranslatef (-xc, -yc, -zc); glColor3f (1.0f, 0.0f, 0.0f); AOBB (1); glMultMatrixd (Mb); glTranslatef (xc, yc, zc); Но это кажется немного выключенным .. –