Как я могу вращаться вокруг сцены в webgl на mousedrag (имитируя движение камеры вокруг позиции) - PullRequest
4 голосов
/ 01 апреля 2011

Хорошо, я читал последние несколько часов, и мне удалось заставить перетаскивание мыши работать на оси x, используя следующие вычисления матрицы, но не повезло с осью y: где newX = new mouse Xord предыдущаяX = мышь X координата в последнем обновленном положении = положение камеры mvMatrix = матрица вида модели или 'матрица мира'

angle = 0.01*(newX-previousX);
rM = mat4.create();
mat4.identity(rM);

rM[0] = Math.cos(angle);
rM[2] = Math.sin(angle);
rM[8] = -Math.sin(angle);
rM[10] = Math.cos(angle);

mat4.multiplyVec3(
    rM,
    position,
    position
)

* Обратите внимание, что здесь используется библиотека glMatrix (http://code.google.com/p/glmatrix/)

А также в порядкевсегда стоять лицом к позиции 0,0,0

mat4.lookAt(
    position,
    vec3.create([0, 0, 0]),
    vec3.create([position[0], position[1]+1, position[2]]),
    mvMatrix
);

Я получил матрицу от http://en.wikipedia.org/wiki/Rotation_matrix Я использовал матрицу в разделе «Основные повороты» и Ry

Яуверен, что это было сделано раньше, любая помощь будет оценена.

Ура, Джош

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Предполагая, что вам нужна свободно движущаяся камера с вертикальной осью Z - для каждого кадра вы можете сделать что-то вроде этого:

    mat4.identity(viewMatrix);
    mat4.translate(viewMatrix, [x,y,z]);
    mat4.rotate(viewMatrix, degToRad(90-pitch), [-1, 0, 0]);
    mat4.rotate(viewMatrix, degToRad(yaw), [0, 0, 1]);
    mat4.multiply(viewMatrix,modelMatrix,modelViewMatrix);

Где degToRad преобразует градусы в радианы.Затем передайте modelViewMatrix и матрицу проекции вершинному шейдеру, который может использовать:

    attribute vec3 aVertexPosition;
    uniform mat4 modelViewMatrix;
    uniform mat4 projectionMatrix;
    gl_Position = projectionMatrix* modelViewMatrix* vec4(aVertexPosition, 1.0);
2 голосов
/ 19 апреля 2011

Взгляните на мой урок WebGL 11 - он вращает объект в мире вместо камеры, но вы должны просто иметь возможность переключать порядок, в котором вы умножаете newRotationMatrix и moonRotationMatrix, чтобы повернуть вспять что.

...