gpt4 book ai didi

c++ - OpenGl 获取鼠标位置

转载 作者:太空宇宙 更新时间:2023-11-04 13:57:56 25 4
gpt4 key购买 nike

我有一个函数可以在 3d 空间中用鼠标坐标创建一个 vector 。

这是我的代码:

void myMouse(int x, int y){
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;

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

winX = (float)x;
winY = (float)viewport[3] - (float)y; // Subtract The Current Mouse Y Coordinate

glReadPixels( x, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );//Reads the depth buffer


gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);


vector.x=posX;
vector.y=posY;
vector.z=posZ;
}

然后该 vector 用作我绘制的某些点的吸引子。如果我将 z 位置设置为 0,代码运行良好,但是当我旋转场景时,这些点不会跟随鼠标光标。但是如果我将 vector.z 设置为上面的代码,粒子开始向我移动,然后它们消失(即它们在视点后面)。

我希望我的点仅在 z 轴指向我时在 x/y 轴上跟随鼠标,在 y 轴指向我时在 x/z 轴上以及在 y/z 轴上当 x 轴指向我时。

或者,如何将 z 位置设置在距我的视点固定距离处?

最佳答案

您的问题很可能出在这些行上:

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

OpenGL 是一个状态机,您可以查询任何内容。在绘图时,您通常会以各种方式操作这些矩阵的内容,因此您查询的内容可能不是最初用于绘图的矩阵。

要解决您的问题,您应该在设置初始 View 后立即在绘图时复制投影、模型 View 和视口(viewport)设置。然后您使用这些拷贝而不是查询值,这可能与您实际需要的有很大不同。

关于c++ - OpenGl 获取鼠标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20608409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com