У меня возникают проблемы с отображением трех декартовых плоскостей в 3D, когда они вращают плоскости, растягиваются в одном направлении (ось z, синий) и сжаты в другом (по оси x , красный), как эти изображения, показывающие вращение вокруг оси у:Webgl: Вращающийся объект искажается по осям
рассчитать перспективную матрицу, с mat4.perspective из библиотеки GL-матрицы:
mat4.perspective(this.pMatrix_, this.vFieldOfView_, this.aspect_, this.near_, this.far_);
со значениями:
private near_ = 0.1;
private far_ = 1000.0;
private vFieldOfView_ = 60.0 * Math.PI/180;
Vertex Shader:
void main(void) {
gl_Position = uProjection * uView * uTransform * vec4(aVertexPosition, 1.0);
}
Матрица представления преобразует объект 2.0 единиц в сторону от камеры.
let t = new Mat4();
t.array[12] = v.x;
t.array[13] = v.y;
t.array[14] = v.z;
я повернуть плоскости вокруг оси у с помощью матрицы, сформированной из этого кода:
// identity matrix already set
let rad = angle * Math.PI/180;
r.array[0] = Math.cos(rad);
r.array[2] = Math.sin(rad);
r.array[8] = -1.0 * Math.sin(rad);
r.array[10] = Math.cos(rad);
И я умножить три преобразование матрицы объекта в следующем порядке: вращения * перевод * масштаб. Использовал кватернионы для обработки поворотов, но они были так же искажены, поэтому вернулись к использованию матриц вращения и сохранили простоту вращения на одной оси. Похоже, я делаю некоторый шаг умножения в неправильном порядке или не правильно использую перспективную матрицу или неправильно признал знак.
Update:
Просто для уточнения на значении некоторых матриц в вершинном шейдере:
uProjection = pMatrix_ = значение, полученное из mat.perspective (...).
uView = [1, 0, 0, 0, 1, 0, 0, 0, 0, 1, -2.0, 0, 0, 0, 1], т.е. матрица, переведенная на 2 единицы по оси z ,
В этом примере uTransform должна быть идентификационной матрицей.
Обновление2:
uView был на самом деле [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, -2,0, 1]
Почему 'новый Mat4()' вместо 'mat4.create()', если вы используете библиотеку gl-matrix? –
Поскольку у вас есть такие отдельные матрицы, может оказаться полезным показать нам значение каждой матрицы. Похоже, что какой-то знак, возможно, куда-то перевернулся, поэтому я обычно придерживаюсь существующих математических библиотек, таких как gl-matrix, вместо прямого доступа к массиву. –
Работает в машинописном тексте и имеет класс Mat4, чтобы упростить проверку типов, в основном это просто Float32Array (16) с оценщиками. Используйте gl-matrix для выполнения вычислений, таких как матрица перспективы. – dppower