2014-09-14 3 views
4

Мне нужно повернуть треугольник так, чтобы он лежал на плоскости, заданной нормальным n и константой d. enter image description hereКак повернуть точки, не перемещая их?

У меня нормальный n1 плоскости, в которой находятся два треугольника. Теперь мне нужно повернуть правый красный треугольник, чтобы он стал оранжевым. Точки треугольников и нормалей сохраняются как 3-мерные векторы. До сих пор я сделал следующее:

  • Получить нормированной вращения кватернион (rotQuat) между n1 и n2.
  • Умножьте каждую точку треугольника на кватернион. Поэтому я конвертирую точку в кватернион (point.x, point.y, point.z, 0) и выполняю следующее: resultQuat = rotQuat * point * conjugate (rotQuat). Затем я применяю x, y и z результата к точке.

Это, как я получаю вращение между двумя векторами:

public static Quaternion getRotationBetweenTwoVector3f(Vector3f vec1, Vector3f vec2) 
{ 
    Vector3f cross = Vector3f.cross(vec1, vec2); 
    float w = (float) (java.lang.Math.sqrt(java.lang.Math.pow(vec1.getLength(), 2) * java.lang.Math.pow(vec2.getLength(), 2)) + Vector3f.dot(vec1, vec2)); 
    Quaternion returnQuat = new Quaternion(cross.x, cross.y, cross.z, w); 
    returnQuat.normalize(); 
    return returnQuat; 
} 

Проблема заключается в том, что треугольник имеет правильную ориентацию после поворота, но треугольник также перемещает его положение. Мне нужно вращение, которое поворачивает треугольник так, чтобы оно все еще было соединено с двумя точками левого красного треугольника (например, оранжевым). Как это возможно?

+0

Просто выполните простой перевод впоследствии? Это в основном то, что любое движение состоит из: вращения + перевода. – Bernhard

ответ

1

Ваша проблема в том, что матрица вращения/кватернионы вращают точки вокруг оси, проходящей через начало координат. Чтобы повернуть вокруг другой точки, чем начало координат, вам нужно перевести точки треугольника в начало координат (просто выделите значение точки поворота из точек треугольника), затем умножьте на кватернион и затем переведите назад.

Таким образом, алгоритм становится:

  • translatedPoints [I] = triPoints [I] - rotationPoint;
  • translPoints rotate using quaternion
  • перевод переведено, добавив значение точки поворота.
+1

Я думаю, вы можете пропустить шаг перевода, если вы сделаете это умным. – Bernhard

+0

@ Бернхард Можете ли вы объяснить это дальше? – concept3d

+0

Итак, если я правильно понял это, я должен взять один из 2 пунктов, которые треугольники делят в качестве точки поворота? Я пробовал это, но он перепутал поворотные точки. RotPoint - это просто точка, вокруг которой вращается ось, верно? – user3067395

Смежные вопросы