我用C ++编写了一个简单的openGL程序。该程序在3D透视投影中绘制球体,并尝试在2D正交投影中绘制将球体中心连接到当前光标位置的线。现在为了绘制线条,我无法弄清楚球体中心的坐标。
这是我的代码:
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
void passive(int,int);
void reshape(int,int);
void init(void);
void display(void);
void camera(void);
int cursorX,cursorY,width,height;
int main (int argc,char **argv) {
glutInit (&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowSize(1364,689);
glutInitWindowPosition(0,0);
glutCreateWindow("Sample");
init();
glutDisplayFunc(display);
glutIdleFunc(display);
glutPassiveMotionFunc(passive);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
void display() {
glClearColor (0.0,0.0,0.0,1.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Render 3D content
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60,(GLfloat)width/(GLfloat)height,1.0,100.0); // create 3D perspective projection matrix
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
camera();
glTranslatef(-6,-2,0);
glColor3f(1,0,0);
glutSolidSphere(5,50,50);
glPopMatrix();
// Render 2D content
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, width,height, 0); // create 2D orthographic projection matrix
glMatrixMode(GL_MODELVIEW);
glColor3f(1,1,1);
glBegin(GL_LINES);
glVertex2f( centreX,centreY ); // coordinate of center of the sphere in orthographic projection
glVertex2f( cursorX,cursorY );
glEnd();
glutSwapBuffers();
}
void camera(void) {
glRotatef(0.0,1.0,0.0,0.0);
glRotatef(0.0,0.0,1.0,0.0);
glTranslated(0,0,-20);
}
void init(void) {
glEnable (GL_DEPTH_TEST);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_COLOR_MATERIAL);
}
void reshape(int w, int h) {
width=w; height=h;
}
void passive(int x1,int y1) {
cursorX=x1; cursorY=y1;
}
我可以找出centreX和centreY的值。无论如何,我可以得到正确的值来画线?
答案 0 :(得分:3)
您可能有兴趣使用gluProject
等内容从您的对象坐标转到屏幕上的实际(投影)位置。获得对象的屏幕坐标后,可以轻松地从一个点到另一个点绘制一条线。
在这种情况下,您需要投影球体的中心点。对于更复杂的对象,我发现投影对象边界框的所有角是有意义的,然后获取这些角的屏幕空间位置的范围。
在切换到正投影(2D模式)之前,你应该得到模型视图,视口和投影矩阵。
显然,为了从屏幕位置(例如,您在窗口中点击的位置)转到世界位置,您将需要使用其伴侣功能gluUnProject
。
请注意,gluProject
出来的坐标不一定直接对应于窗口位置;你可能不得不翻转“Y”坐标。
请查看this GDSE discussion,了解有关如何解决问题的其他想法。