повернуть трехмерное облако точек, чтобы сместить угол плоскости пола, учитывая vNormal и точку пола - PullRequest
2 голосов
/ 18 августа 2011

Я работаю с Kinect и Ofxopeni.У меня есть облако точек в координатах реального мира, но мне нужно повернуть эти точки, чтобы сместить угол наклона камеры.Плоскость пола должна дать мне всю необходимую информацию, но я не могу понять, как рассчитать ось и угол поворота.

моя первоначальная идея была ...

ofVec3f target_normal(0,1,0);
ofVec3f vNormal; //set this from Xn3DPlane floorPlane (not shown here)
ofVec3f ptPoint; //as above

float rot_angle = target_normal.angle(vNormal);

for(int i = 0; i < numPoints; i++){

   cloudPoints[i].rotate(rot_angle, vNormal, ptPoint); //align my points to normal is (0 1 0)                               

}

Это кажется слишком упрощенным.Я изучал различные статьи и вижу, что это, скорее всего, матрица четверти или вращения, но я не могу понять, с чего начать.Я был бы очень благодарен за любые ссылки на соответствующие статьи или каков наилучший способ получить ось и угол поворота?Я представляю, что это можно сделать довольно легко, используя функцию Quarterion или openni, но я не могу понять, как реализовать.

best

Simon

1 Ответ

1 голос
/ 18 августа 2011

Я никогда не использовал ofxopeni, но это лучшее математическое объяснение, которое я могу дать.

Вы можете вращать любой набор данных из одного набора осей в другой, используя матрицу TBN (касательная, битовая, нормальная), где T B и N - ваш новый набор осей. Итак, у вас уже есть данные для нормали, но вам нужно найти касательную. Я не уверен, что ваш Xn3DPlane обеспечивает касательную, но если это так, используйте это.

Битангенс задается как перекрестное произведение нормали и тангенса:

 B = T x N

TBN выглядит так:

TBN = { Tx ,Ty ,Tz,
        Bx, By, Bz,
        Nx, Ny, Nz }

Это будет вращать ваши данные на новом наборе оси, но ваша плоскость также имеет исходную точку, поэтому мы выполнили перевод:

A = {1 , 0 , 0, 0,    { Tx , Ty , Tz , 0,   
     0,  1,  0, 0,      Bx , By , Bz , 0,    
     0,  0,  1, 0,  x   Nx , Ny , Nz , 0, 
     -Px,-Py,-Pz,1}      0 ,  0 ,  0 , 1}    

// The multiply the vertex, v, to change it's coordinate system.
v = v * A

Если вы можете получить вещи на этом этапе, вы можете преобразовать все свои точки в новую систему координат. Следует отметить, что нормаль теперь выровнена с осью z, если вы хотите, чтобы она была выровнена с y, поменяйте местами N и B в матрице TBN.

РЕДАКТИРОВАТЬ: окончательный матричный расчет был немного неправильным. Исправлено.

Расчет TBN.

...