Поворот группы векторов
Я пытаюсь повернуть группу векторов, которые я выбрал, к нормали треугольника
Если бы это было правильно, случайная выборка в полушарии соответствовала бы треугольнику.
В настоящее время я создаю его по оси Z и пытаюсь повернуть все образцы в нормальное положение треугольника.
- OpenGL не работает в Windows
- GLUT на OS X с открытым профилем OpenGL 3.2
- Как рассчитать Тангенс и Бинормаль?
- Что является результатом NULL + int?
- objective Матрицы проекционных представлений
но, похоже, «просто»,
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
- Интерполирование между matrixми вращения
- Положение камеры в мировой координате из cv :: solvePnP
- Должен ли я когда-либо использовать `vec3` внутри однородного буфера или шейдерного хранилища?
- Как визуализировать глубину линейно в современном OpenGL с gl_FragCoord.z в флеш-шейдере?
- Как рисовать текст с помощью GLUT / OpenGL на C ++?
- как включить вертикальную синхронизацию в opengl?
- Вращение объекта вокруг неподвижной точки с помощью glMultMatrix
- Как сделать снимок экрана в OpenGL
Постройте матрицу преобразования 4×4 вместо Quaternions .
-
Не забывайте, что 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
должны быть нормированы на единичные векторы, иначе будет происходить масштабирование. -
строительство
- установить вектор
Z
оси в ваш треугольник - (положение LCS ) до середины вашего треугольника (или средняя точка из его вершин)
-
теперь вам просто нужны оси
X
иY
что легкопусть
X = any triangle vertex - triangle midpoint
илиX = substraction of any 2 vertexes of triangle
Единственное условие, которое должно быть выполнено для
X
состоит в том, что оно должно лежать на плоскости треугольника.
Пусть теперьY = X x Z
перекрестное произведение создаст вектор, перпендикулярныйX
иZ
(который также лежит в плоскости треугольника). -
теперь помещаем всю эту внутреннюю матрицу и загружаем ее в OpenGL в
ModelView
матрицыModelView
или когда-либо.
- установить вектор