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;
}
示例#2
0
// 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;
	}
}