Построение View и Perspective матриц для OpenGL Работаю с WebGL, никаких посторонних библиотек использовать не хочу, так как занимаюсь этим именно для опыта в математике. У меня получилось построить рабочую Perpective матрицу, а вот с View беда.this.eye = new Vec3(0,0,0); this.up = new Vec3(0,1,0); this.at = new Vec3(0,0,1); this.lookAt = function(){ var zaxis = new Vec3(this.at.v.x-this.eye.v.x,this.at.v.y-this.eye.v.y,this.at.v.z-this.eye.v.z).normal(); var xaxis = this.up.cross(zaxis).normal(); var yaxis = zaxis.cross(xaxis); return new Mat4([ xaxis.v.x,yaxis.v.x,zaxis.v.x,0, xaxis.v.y,yaxis.v.y,zaxis.v.y,0, xaxis.v.z,yaxis.v.z,zaxis.v.z,0, -xaxis.dot(this.eye),-yaxis.dot(this.eye),-zaxis.dot(this.eye),1 ]); } Как мне кажется, все логично, однако на деле работает совсем не так как должно. С чем может быть беда?
Проблема может быть в том, что вы неправильно рассчитываете оси x, y, z для матрицы взгляда.
Для правильного расчета осей x, y, z вам нужно сначала найти вектор направления взгляда (direction), который равен разности вектора, указывающего на точку на которую смотрит камера (at) и вектора камеры (eye). Затем нормализуйте этот вектор direction.
После этого вы можете вычислить ось x как результат векторного произведения вектора up и direction, а ось y как результат векторного произведения direction и x. Не забудьте нормализовать полученные оси x и y.
Теперь вы можете составить матрицу взгляда, используя найденные оси x, y, z и вектор камеры eye.
Попробуйте использовать следующий код для расчета матрицы взгляда:
this.lookAt = function(){ var direction = new Vec3(this.at.v.x - this.eye.v.x, this.at.v.y - this.eye.v.y, this.at.v.z - this.eye.v.z).normal(); var xaxis = this.up.cross(direction).normal(); var yaxis = direction.cross(xaxis); return new Mat4([ xaxis.v.x, yaxis.v.x, -direction.v.x, 0, xaxis.v.y, yaxis.v.y, -direction.v.y, 0, xaxis.v.z, yaxis.v.z, -direction.v.z, 0, -xaxis.dot(this.eye), -yaxis.dot(this.eye), direction.dot(this.eye), 1 ]); }
Попробуйте использовать этот код и посмотрите, работает ли это правильно для вас. Если у вас все еще есть проблемы, пожалуйста, уточните, в чем именно они заключаются, чтобы мы могли вам помочь.
Проблема может быть в том, что вы неправильно рассчитываете оси x, y, z для матрицы взгляда.
Для правильного расчета осей x, y, z вам нужно сначала найти вектор направления взгляда (direction), который равен разности вектора, указывающего на точку на которую смотрит камера (at) и вектора камеры (eye). Затем нормализуйте этот вектор direction.
После этого вы можете вычислить ось x как результат векторного произведения вектора up и direction, а ось y как результат векторного произведения direction и x. Не забудьте нормализовать полученные оси x и y.
Теперь вы можете составить матрицу взгляда, используя найденные оси x, y, z и вектор камеры eye.
Попробуйте использовать следующий код для расчета матрицы взгляда:
this.lookAt = function(){var direction = new Vec3(this.at.v.x - this.eye.v.x, this.at.v.y - this.eye.v.y, this.at.v.z - this.eye.v.z).normal();
var xaxis = this.up.cross(direction).normal();
var yaxis = direction.cross(xaxis);
return new Mat4([
xaxis.v.x, yaxis.v.x, -direction.v.x, 0,
xaxis.v.y, yaxis.v.y, -direction.v.y, 0,
xaxis.v.z, yaxis.v.z, -direction.v.z, 0,
-xaxis.dot(this.eye), -yaxis.dot(this.eye), direction.dot(this.eye), 1
]);
}
Попробуйте использовать этот код и посмотрите, работает ли это правильно для вас. Если у вас все еще есть проблемы, пожалуйста, уточните, в чем именно они заключаются, чтобы мы могли вам помочь.