Camera WebGL FPS摄影机使用glMatrix.js沿局部轴而不是世界轴移动

Camera WebGL FPS摄影机使用glMatrix.js沿局部轴而不是世界轴移动,camera,rotation,webgl,translation,Camera,Rotation,Webgl,Translation,我正在尝试在WebGL中制作FPS相机。 当我从初始位置移动摄影机,然后旋转时,摄影机将沿开始位置而不是新位置移动。 使用glMatrix.js库进行平移和旋转 我有以下变量: var rotateY = 0; // For rotating along the Y axis var fronBackMovement = 0; // Front and back movement var sideMovement = 0; // Movement from side to side

我正在尝试在WebGL中制作FPS相机。 当我从初始位置移动摄影机,然后旋转时,摄影机将沿开始位置而不是新位置移动。 使用glMatrix.js库进行平移和旋转

我有以下变量:

var rotateY = 0;  // For rotating along the Y axis
var fronBackMovement = 0;   // Front and back movement
var sideMovement  = 0;  // Movement from side to side
键盘事件:

// Movement
if( key.w == true ){
    fronBackMovement += 5;
}
if( key.a == true ){
    sideMovement += 5;
}
if( key.s == true ){
    fronBackMovement -= 5;
}
if( key.d == true ){
    sideMovement -= 5;
}
鼠标移动:

// Rotation
if( mouse.movementX != 0 ){
    rotateY += mouse.movementX;  // mouse.movementX is screen movement of the cursor
}
平移和旋转:

camera.matrix = mat4.fromTranslation( mat4.create() ,vec3.fromValues(sideMovement,0,fronBackMovement) )
camera.matrix = mat4.rotateY(camera.matrix,camera.matrix,rotateY )

相机通常向下看-Z轴,所以要向前移动,只需将相机的Z轴添加到您的位置即可。如果不想垂直移动,则将Y分量归零并进行规格化。最后乘以你想要的速度

相机的x轴包含侧面移动方向,因此您可以对其执行相同的操作

const cameraPosition = vec3.create();
const tempForwardDirection = vec3.create();
const tempSideDirection = vec3.create();
...


tempForwardDirection[0] = camera.matrix[8];
tempForwardDirection[1] = 0;  // camera.matrix[9];
tempForwardDirection[2] = camera.matrix[10];
vec3.normalize(tempForwardDirection, tempForwardDirection)

tempSideDirection[0] = camera.matrix[0];
tempSideDirection[1] = camera.matrix[1];
tempSideDirection[2] = camera.matrix[2];

vec3.scaleAndAdd(
    cameraPosition,
    cameraPosition,
    tempForwardDirection, 
    -fronBackMovement);
vec3.scaleAndAdd(
    cameraPosition,
    cameraPosition,
    tempSideDirection,
    sideMovement)

camera.matrix = mat4.fromTranslation(camera.matrix, cameraPosition);
camera.matrix = mat4.rotateY(camera.matrix,camera.matrix,rotateY);
设rotateY=0;//用于沿Y轴旋转 设fronBackMovement=0;//前后运动 设侧移=0;//左右移动 const cameraPosition=vec3.create; const tempForwardDirection=vec3.create; const tempSideDirection=vec3.create; 常数照相机={ 矩阵:mat4.create, }; 常数鼠标={ movementX:0, }; const gl=document.querySelectorcanvas.getContextwebgl; 常数vs=` 均匀mat4 u_世界视图投影; 均匀mat4-u_-world逆变换; 属性向量4位置; 属性向量3正常; 可变vec3 v_正常; 真空总管{ gl_位置=u_世界视图投影*位置; v_法线=u_WorldInverseTransfose*vec4normal,0.xyz; } `; 常数fs=` 精密中泵浮子; 可变vec3 v_正常; 均匀vec3 u_lightDir; 均匀的vec4 u_颜色; 真空总管{ vec3 norm=正常化EV_normal; 浮动灯光=dotu_lightDir,标准*.5+.5; gl_FragColor=vec4u_color.rgb*灯光,u_color.a; } `; const progInfo=twgl.createProgramInfogl[vs,fs]; const bufferInfo=twgl.primitives.createCubeBufferInfogl,1; 常量投影=mat4.create; const view=mat4.create; const viewProjection=mat4.create; const world=mat4.create; const worldwiewprojection=mat4.create; const worldInverse=mat4.create; 常量WorldInverseTransfose=mat4.create; 常数fov=degToRad90; 常数zNear=0.1; 常数zFar=100; const lightDir=vec3.normalizevec3.create[1,2,3]; 常量键={}; 设px=0; 设py=0; 设pz=0; 设elev=0; 设ang=0; 让滚动=0; 恒速=1; 恒转速=90; 然后设=0; 函数rendernow{ 现在*=0.001;//秒; 常数deltaTime=现在-那时; 然后=现在; twgl.resizeCanvasToDisplaySizegl.canvas; gl.viewport0,0,gl.canvas.width,gl.canvas.height; gl.enablegl.DEPTH_测试; gl.enablegl.CULL_面; gl.useProgramprogInfo.program; const aspect=gl.canvas.clientWidth/gl.canvas.clientHeight; mat4.透视投影、视野、纵横比、zNear、zFar; fronBackMovement=0; 侧移=0; 如果key.w==true{ fronBackMovement=5*deltaTime; } 如果key.a==true{ 侧移=-5*增量时间; } 如果key.s==true{ fronBackMovement=-5*deltaTime; } 如果key.d==true{ 侧移=5*deltaTime; } //轮换 如果mouse.movementX!=0{ rotateY+=mouse.movementX/200;//mouse.movementX是光标在屏幕上的移动 mouse.movementX=0; } tempForwardDirection[0]=摄像机矩阵[8]; tempForwardDirection[1]=0;//camera.matrix[9]; tempForwardDirection[2]=摄像机矩阵[10]; vec3.normalizetempForwardDirection、tempForwardDirection tempSideDirection[0]=摄像机矩阵[0]; tempSideDirection[1]=摄像机矩阵[1]; tempSideDirection[2]=摄像机矩阵[2]; vec3.scaleAnd 摄像位置, 摄像位置, 前进方向, -蛙背运动; vec3.scaleAnd 摄像位置, 摄像位置, 临时侧向, 侧移 camera.matrix=mat4.fromTranslationcamera.matrix,cameraPosition; camera.matrix=mat4.rotateYcamera.matrix,camera.matrix,rotateY; mat4.VIEW,camera.matrix; mat4.多视图投影、投影、视图; 对于设z=-1;z{ mouse.movementX=e.movementX; }; 函数degToRadd{ 返回d*Math.PI/180; } 正文{页边距:0;} 画布{宽度:100vw;高度:100vh;显示:块;} 前{位置:绝对;左:1em;顶部:0;}
由于某种原因,我仍然有相同的相机运动