Здравствуйте.
Писал тут тестовую программку на Java и наткнулся на странную вещь. Вычисления какие-то неправильные. Оказалось, что проблема в нормализации вектора.
Я всегда думал (в интернете везде так написано), что вектор нормализуется как-то так:
public Vec3 normalize() {
double length = x * x + y * y + z * z;
if (Math.abs(length) >= 0.001) {
return new Vec3(x / length, y / length, z / length);
}
return new Vec3(x, y, z);
}
Если
Vec3 v = new Vec3(1.0, 0.0, -1.0);
Vec3 vn = v.normalize();
то получается [x=0.5 y=0.0 z=-0.5]
. Но это неправильно! Дальнейшие вычисления идут по трубе.
Переписал код на C++
:
glm::vec3 v{ 1.0f, 0.0f, -1.0f };
glm::vec3 vn = glm::normalize(v);
Получается [x=0.7071... y=0.0 z=-0.7071...]
и дальше правильно вычисляется. Хотя, целиком программу не переписывал и не уверен, что всё остальное тоже было бы правильно.
Но что за прикол с нормализацией? Как тогда нормализуется вектор?
Собственно, проблема в следующем. Если два вектора направлены друг на друга, то их dot product
должен быть равен единице. Или минус единице, если они направлены в разные стороны. Если вычислять через GLM
- так и есть. А если нормализировать вектор вручную (как написано в интернете), то фигня какая-то получается