es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Para el lanzamiento de rayo con clic de ratón, ¿por qué mis rayos iniciales no se actualizan a la posición de mi cámara después de moverla?

Cuando se mueve la cámara, ¿por qué mis rayos iniciales siguen atascados en el origen 0, 0, 0 aunque la posición de la cámara se haya actualizado?

Funciona bien si inicio el programa y la posición de la cámara está en 0, 0, 0 por defecto. Pero una vez que muevo mi cámara, por ejemplo, hacia la derecha y hago clic, las líneas siguen saliendo de 0 0 0 cuando deberían comenzar desde donde esté la cámara. ¿Estoy haciendo algo terriblemente mal? He verificado que se estén actualizando en el bucle principal. He utilizado este fragmento de código referenciado desde:

// 1. Obtener coordenadas del ratón y luego normalizar
float x = (2.0f * lastX) / width - 1.0f;
float y = 1.0f - (2.0f * lastY) / height;

// 2. Cambiar de espacio de recorte a espacio mundial
glm::mat4 inverseWorldMatrix = glm::inverse(proj * view);
glm::vec4 nearVec = glm::vec4(x, y, -1.0f, 1.0f);
glm::vec4 farVec = glm::vec4(x, y, 1.0f, 1.0f);
glm::vec4 startRay = inverseWorldMatrix * nearVec;
glm::vec4 endRay = inverseWorldMatrix * farVec;

// división de perspectiva
startRay /= startRay.w;
endRay /= endRay.w;

glm::vec3 direction = glm::vec3(endRay - startRay);

// empezar los puntos del rayo desde la posición de la cámara
glm::vec3 startPos = glm::vec3(camera.GetPosition());
glm::vec3 endPos = glm::vec3(startPos + direction * someLength);

En la primera captura de pantalla hago clic en algunos rayos, en la segunda muevo mi cámara hacia la derecha y hago clic en algunos más, pero los rayos iniciales siguen en 0, 0, 0. Lo que busco es que los rayos salgan desde donde esté la posición de la cámara en la tercera imagen, es decir, los rayos rojos, lo siento por la confusión, las líneas rojas deben dispararse y alejarse no hacia arriba.

Imagen de lanzamiento de rayos 3D

// y estas son mis matrices
// proyección
glm::mat4 proj = glm::perspective(glm::radians(camera.GetFov()), (float)width / height, 0.1f, 100.0f);
// vista
glm::mat4 view = camera.GetViewMatrix(); // Esto devuelve glm::lookAt(this->Position, this->Position + this->Front, this->Up);
// modelo
glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, 0.0f));
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema radica en el cálculo de la posición de inicio del rayo. El fragmento de código que proporcionaste utiliza la posición de la cámara para calcular el endPos pero no la posición de inicio.

    Para solucionarlo, simplemente puedes utilizar la posición de la cámara como posición de inicio para los rayos.

    Reemplaza esta línea:

    glm::vec3 startPos = glm::vec3(camera.GetPosition());

    con:

    glm::vec3 startPos = glm::vec3(camera.GetPosition() + startR);

    Esto sumará el vector startR a la posición de la cámara y lo utilizará como punto de inicio para los rayos.

    Asegúrate de actualizar también el vector startR en tu programa cada vez que se mueva la cámara.

Comments are closed.