Как преобразовать координаты экрана в мировые координаты в современный OpenGL без использования gluUnProject?Как сделать сбор в современном OpenGL без gluUnProject?
4
A
ответ
5
AFAIK - gluUnproject нуждается во всей информации, предоставленной ему (моделирование, проекция и т. Д.), И он выполняет только расчет инверсии матрицы. Поэтому, если у вас есть эти матрицы, вы можете вызвать gluUnproject или выполнить эти вычисления самостоятельно.
Код, указанный ниже, взято из here (скопировано так, что этот ответ по-прежнему удерживает воду, если линия связи умирает).
int glhProjectf(float objx, float objy, float objz, float *modelview, float *projection, int *viewport, float *windowCoordinate)
{
//Transformation vectors
float fTempo[8];
//Modelview transform
fTempo[0]=modelview[0]*objx+modelview[4]*objy+modelview[8]*objz+modelview[12]; //w is always 1
fTempo[1]=modelview[1]*objx+modelview[5]*objy+modelview[9]*objz+modelview[13];
fTempo[2]=modelview[2]*objx+modelview[6]*objy+modelview[10]*objz+modelview[14];
fTempo[3]=modelview[3]*objx+modelview[7]*objy+modelview[11]*objz+modelview[15];
//Projection transform, the final row of projection matrix is always [0 0 -1 0]
//so we optimize for that.
fTempo[4]=projection[0]*fTempo[0]+projection[4]*fTempo[1]+projection[8]*fTempo[2]+projection[12]*fTempo[3];
fTempo[5]=projection[1]*fTempo[0]+projection[5]*fTempo[1]+projection[9]*fTempo[2]+projection[13]*fTempo[3];
fTempo[6]=projection[2]*fTempo[0]+projection[6]*fTempo[1]+projection[10]*fTempo[2]+projection[14]*fTempo[3];
fTempo[7]=-fTempo[2];
//The result normalizes between -1 and 1
if(fTempo[7]==0.0) //The w value
return 0;
fTempo[7]=1.0/fTempo[7];
//Perspective division
fTempo[4]*=fTempo[7];
fTempo[5]*=fTempo[7];
fTempo[6]*=fTempo[7];
//Window coordinates
//Map x, y to range 0-1
windowCoordinate[0]=(fTempo[4]*0.5+0.5)*viewport[2]+viewport[0];
windowCoordinate[1]=(fTempo[5]*0.5+0.5)*viewport[3]+viewport[1];
//This is only correct when glDepthRange(0.0, 1.0)
windowCoordinate[2]=(1.0+fTempo[6])*0.5; //Between 0 and 1
return 1;
}
Смежные вопросы
- 1. Как сделать трассировку лучей в современном OpenGL?
- 2. Функция gluUnProject в openGL
- 3. Объект объекта OpenGL gluUnProject
- 4. Как сделать образец 1D текстур в современном opengl?
- 5. OpenGL: gluUnProject возвращает неверные координаты
- 6. OpenGL gluUnProject найти неправильную координату
- 7. Как сделать gluUnProject() с XCode 8.x?
- 8. Как нарисовать цилиндр в современном opengl
- 9. Как настроить стереоскопическое рендеринг в современном OpenGL?
- 10. C++ Opengl - Как загрузить tgas и png в современном OpenGL?
- 11. Фрактальное дерево в современном OpenGL (OpenGL 3.3 и выше)
- 12. Провести большие круговые точки в современном OpenGL
- 13. Как использовать gluUnproject?
- 14. mouse picking in opengl using `gluUnProject`
- 15. gl_LightSource [0] .position.xyz в современном OpenGL
- 16. Вращение куба в современном opengl ... выглядит странно
- 17. Ray сбор с gluUnProject() в мировой системе координат
- 18. Как визуализировать текст в современном OpenGL с помощью GLSL
- 19. Как объединить текстуры с глубиной в современном OpenGL?
- 20. Как нарисовать многоугольник с 3D-точками в современном openGL?
- 21. Как рендеринг нескольких текстур работает в современном OpenGL?
- 22. Сделать прокручивать страницу без OpenGL
- 23. Странное поведение gluUnProject, пытающегося конвертировать мышиные координаты в opengl coords
- 24. Сделать контекст OpenGL без экранов
- 25. gluUnProject дает флип-позицию y
- 26. bimap в современном C++ без Boost,
- 27. Где я могу назвать gluUnproject?
- 28. iPhone OpenGL: Использование gluUnProject (порт) и обнаружение щелчка по объекту
- 29. Изучение OpenGL. На современном Linux, как связаны все эти понятия?
- 30. Использование gluUnProject
http://stackoverflow.com/questions/9901453/using-glms-unproject – Grimmy