nv::vec3f ComputeWaterSimulation::unProject(float x, float y) { nv::vec3f xzNormal(0.0f, 1.0f, 0.0f); nv::vec3f xzPoint(1.0f, 0.0f, 1.0f); nv::vec3f projPoint; nv::vec3f f = unProjectPoint(nv::vec4f(x, m_height - y, 1.0f, 1.0f)); nv::vec3f n = -nv::vec3f(m_transformer->getTranslationVec()._array); //LOGI("far [ %f %f %f ]", far.x, far.y, far.z); nv::vec3f direction = nv::normalize( f - n ); float dirDotN = nv::dot(direction, xzNormal); float d = 0.0f; if (dirDotN != 0.0f) { d = nv::dot((xzPoint - n), xzNormal) / dirDotN; projPoint = n + d * direction; } return projPoint; }
// define a posição do ponto (0,0,0) do modelo em termos das atuais matrizes // GL_MODELVIEW_MATRIX GL_PROJECTION_MATRIX e registra no buffer de posições. // Como o que se quer são as coordenadas absoluta, e não homogêneas, // basta dividir pelo h (o valor do quarto elemento do vetor de posição). void setPosition(GLdouble pos[3]) { // verifica se existe uma matriz inversa e // se o indice do objeto é válido if (iniciado) { GLdouble ponto[4]; // adota o ponto zero atual, que será o centro das esferas ponto[0]=0; ponto[1]=0; ponto[2]=0; ponto[3]=1; unProjectPoint(ponto); // trasnforma as coordenadas homogêneas em absolutas (normalizar) pos[0] = ponto[0] / ponto[3]; pos[1] = ponto[1] / ponto[3]; pos[2] = ponto[2] / ponto[3]; } else { // se não puder calcular, retorna um ponto qualquer // (já deve ter mostrado erro antes...) pos[0] = 0; pos[1] = 0; pos[2] = 0; } }