Поворот группы векторов

Я пытаюсь повернуть группу векторов, которые я выбрал, к нормали треугольника

Если бы это было правильно, случайная выборка в полушарии соответствовала бы треугольнику.

В настоящее время я создаю его по оси Z и пытаюсь повернуть все образцы в нормальное положение треугольника.

но, похоже, «просто»,

введите описание изображения здесь

glm::quat getQuat(glm::vec3 v1, glm::vec3 v2) { glm::quat myQuat; float dot = glm::dot(v1, v2); if (dot != 1) { glm::vec3 aa = glm::normalize(glm::cross(v1, v2)); float w = sqrt(glm::length(v1)*glm::length(v1) * glm::length(v2)*glm::length(v2)) + dot; myQuat.x = aa.x; myQuat.y = aa.y; myQuat.z = aa.z; myQuat.w = w; } return myQuat; } 

Который я вытащил из нижней части этой страницы: http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors

Затем я :

 glm::vec3 zaxis = glm::normalize( glm::vec3(0, 0, 1) ); // hardcoded but test orginal axis glm::vec3 n1 = glm::normalize( glm::cross((p2 - p1), (p3 - p1)) ); //normal glm::quat myQuat = glm::normalize(getQuat(zaxis, n1)); glm::mat4 rotmat = glm::toMat4(myQuat); //make a rotation matrix glm::vec4 n3 = rotmat * glm::vec4(n2,1); // current vector I am trying to rotate 

Постройте матрицу преобразования 4×4 вместо Quaternions .

IMG

  1. Не забывайте, что OpenGL имеет матрицу столбцов

    поэтому для double m[16];
    – вектор оси X в m[ 0],m[ 1],m[ 2]
    является вектором оси Y в m[ 4],m[ 5],m[ 6]
    является вектором оси Z в m[ 8],m[ 9],m[10]
    и положение находится в m[12],m[13],m[14]

    LCS означает локальную систему координат (ваш треугольник или объект или что-то еще)
    и глобальная система координат GCS (мир или что-то еще).

    Все векторы X,Y,Z должны быть нормированы на единичные векторы, иначе будет происходить масштабирование.

  2. строительство

    1. установить вектор Z оси в ваш треугольник
    2. (положение LCS ) до середины вашего треугольника (или средняя точка из его вершин)
    3. теперь вам просто нужны оси X и Y что легко

      пусть X = any triangle vertex - triangle midpoint
      или X = substraction of any 2 vertexes of triangle

      Единственное условие, которое должно быть выполнено для X состоит в том, что оно должно лежать на плоскости треугольника.
      Пусть теперь Y = X x Z перекрестное произведение создаст вектор, перпендикулярный X и Z (который также лежит в плоскости треугольника).

    4. теперь помещаем всю эту внутреннюю матрицу и загружаем ее в OpenGL в ModelView матрицы ModelView или когда-либо.

  • Как найти точку мыши в сцене, используя SceneKit?
  • Как скомпилировать для Windows на Linux с gcc / g ++?
  • Что означает «немедленный режим» в OpenGL?
  • Как использовать GLUT / OpenGL для рендеринга в файл?
  • Как составить матрицу вращения с удобочитаемыми углами с нуля?
  • Почему мой OBJ-парсер оказывает такие сетки?
  • Как визуализировать рамку openGL в C ++ Builder?
  • Почему GL разделяет `gl_Position` на W для вас, а не позволяет вам сделать это самостоятельно?
  • Масштабирование изображения (KeepAspectRatioByExpanding) через OpenGL
  • OpenGL 2 Texture Внутренние форматы GL_RGB8I, GL_RGB32UI и т. Д.
  • Недостаток глушителя в Mac OSX 10.9, IDE: создатель QT
  • Давайте будем гением компьютера.