Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Тут вопрос не в том какие это будут действия, а в том как к ним идти
| x.x’ y.x’ z.x’ | -1
M = | x.y’ y.y’ z.y’ |
| x.z’ y.z’ z.z’ |
Которую, в свою очередь, можно найти обратив матрицу
vec4 quaternionByTwoVectors(vec3 d, vec3 z) {
const vec3 vec = cross(d, z);
const float c = dot(d, z);
const float k = sqrt((1 + c) * 2);
return vec4(c.x / k, c.y / k, c.z / k, k / 2.0f);
}vec3 rotateVectorByQuaternion(vec4 q, vec3 v) {
return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);
}Сам по себе корень более просто, нежели векторное произведение с нормализацией. Но дальше нормализацию-то сокращают — а простое векторное произведение куда проще корня. Хотя бы потому что сам алгоритм извлечения квадратного корня имеет много умножений внутри.
Избегаем тригонометрии