Estoy jugando en webgl y he creado un cargador gltf simple, que permite mover el objeto principal. Puedo orbitar el objeto, pero solo permite ver la parte frontal. Puedo orbitar el objeto, pero solo permite ver el frente.
Ahora arreglé eso usando rotación y multiplicación, pero quiero usar la función lookAt, para hacerlo más simple, y también para tener una órbita de inclinación (arriba-abajo). Actualmente, puedo rotar la cámara (orbitar) el objeto principal, pero solo en guiñada.
Mi clase de cámara tiene la matriz de transformación y la matriz de proyección. Luego hago una matriz de vista y la multiplico con la matriz de proyección, luego la guardo en la matriz de transformación. Pero esto solo permite la rotación de guiñada. Si agrego inclinación, la cámara se mueve hacia arriba y hacia abajo, pero no gira para mantener el objeto en el centro.
Estoy pensando que esto podría hacerse con la función lookAt, pero ¿cómo obtendría la posición de origen de la cámara, ya que requiere un vector, pero solo tengo la matriz de transformación principal? Tengo vectores de transformación, rotación y escala, pero como estoy multiplicando matrices, el resto es 0.
// saves camera options into c constaint const c = this; let camX = Math.sin(c.yaw) * c.distance; //let camY = Math.cos(c.pitch) * c.distance; let camZ = Math.cos(c.yaw) * c.distance; var viewMatrix = mat4.create(); // c.matrix is the camera transform matrix mat4.invert(viewMatrix, c.matrix); mat4.multiply(c.matrix, c.projection, viewMatrix); mat4.fromTranslation(c.matrix, vec3.fromValues(camX, 0, camZ)); const vec = vec3.create(); // model is the object to orbit around vec3.add(vec, vec3.clone(model.translation), vec3.fromValues(camX, 0, camZ)); var moveMatrix = mat4.create(); mat4.fromTranslation(moveMatrix, vec); mat4.multiply(c.matrix, c.matrix, moveMatrix); var rotMatrix = mat4.create(); mat4.fromYRotation(rotMatrix, c.yaw); mat4.multiply(c.matrix, c.matrix, rotMatrix);