2016-09-23 5 views
0

Итак, у меня есть задание, в котором я должен вернуть ось вращения как нормальный вектор, перпендикулярный плоскости. Вот мой код:Возврат glm :: vec3 x value возвращает null

glm::vec3 Skeleton::returnAxis() 
{ 
GLdouble firstPoint[3]; 
GLdouble secondPoint[3]; 
GLdouble thirdPoint[3]; 

GLint viewport[4]; 
GLdouble modelview[16]; 
GLdouble projection[16]; 

glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
glGetDoublev(GL_PROJECTION_MATRIX, projection); 
glGetIntegerv(GL_VIEWPORT, viewport); 

gluUnProject(0,0,0, modelview, projection, viewport, &firstPoint[0], &firstPoint[1], &firstPoint[2]); 
gluUnProject(viewport[2], 0 ,0, modelview, projection, viewport, &secondPoint[0], &secondPoint[1], &secondPoint[2]); 
gluUnProject(0,viewport[3],0, modelview, projection, viewport, &thirdPoint[0], &thirdPoint[1], &thirdPoint[2]); 


glm::vec3 point1 = glm::vec3(secondPoint - firstPoint); 
glm::vec3 point2 = glm::vec3(thirdPoint - firstPoint); 
glm::vec3 axis = glm::normalize(glm::cross(point1, point2)); 
return axis; 
std::cout << axis.x; 


} 

Проблема в том, что она не возвращает никаких цифр! Просто пусто. Даже после того, как я сделал typecast для float (не показано в коде выше).

Помощь!

ответ

2

Невозможно выполнить векторные операции на массивах GLdouble[] напрямую.

glm::vec3 point1 = glm::vec3(secondPoint - firstPoint); 

Вычитание здесь фактически выполняется на указатели (адреса) в этих массивах и не возвращает математическую операцию. Вместо этого вычисляется новый адрес, который затем снова обрабатывается как GLdouble[] для инициализации vec3. Кроме того, создание вектора, как сделано здесь, также не является хорошей идеей, так как создается временный объект.

Правильный код для того, что вы хотите сделать, может быть:

glm::vec3 point1(secondPoint[0] - firstPoint[0], 
       secondPoint[1] - firstPoint[1], 
       secondPoint[2] - firstPoint[2]); 

Похожие на point2.

+0

спасибо !!!! Работает: D –

Смежные вопросы