鼠标光标与投影的二维矩形的交点
Intersection of mouse cursor and projected 2D rectangle
在 JOGL 的 3D 世界中有一堆 2x2 "floor/tiles",它们被投射到相机中,我想知道光标是否悬停在图块上。
我有这样的相机设置:
glu.gluPerspective(90, 4.0/3.0, 1, 100);
glu.gluLookAt(-2f, 8f, -2f, 0f, 0f, 0f, 0f, 1f, 0f);
并且 y=0 窗格上有一些像这样的图块或块
gl.glPushMatrix();
{
// Camera settings (same as above)
glu.gluPerspective(90, 4.0/3.0, 1, 100);
glu.gluLookAt(-2f, 8f, -2f, 0f, 0f, 0f, 0f, 1f, 0f);
// Draw the tiles
gl.glPushMatrix();
{
gl.glBegin(GL2.GL_POLYGON);
{
// a bunch of translated and textured
// (1,0,1) (1,0,-1) (-1,0,-1) (-1,0,1)
// rectangle here,
}
gl.glEnd();
}
gl.glPopMatrix();
}
gl.glPopMatrix();
我是3D新手,只熟悉Java Graphics2D。 2D矩形和游标的交集只是简单的几个比较,但在3D中似乎要复杂很多。我正在寻找一些数学或图书馆来做到这一点。
或者如果有一种方法可以获取屏幕上最终像素的 4 个点,也许我想做 java.awt.Shape contain() 并检查它是否相交。
结果会是这样的:
也许最简单的解决方案是使用 gluProject();获取屏幕坐标,并使用 java.awt.geom.Path2D 检查鼠标坐标是否在该区域。
这是一个简单的示例代码:
// do inside the matrix stack? of rendering rectangles to get the right matrix we want
float[][] FinalCoordinate = new float[4][4];
float[] ModelView = new float[16];
float[] Projection = new float[16];
gl.glGetFloatv(GL2.GL_MODELVIEW_MATRIX,ModelView,0);
gl.glGetFloatv(GL2.GL_PROJECTION_MATRIX,Projection,0);
for(int x = 0; x < 4; x++)
{
glu.gluProject(Vertex[x][0],0f,Vertex[x][2],ModelView,0,Projection,0,new int[]{0,0,800,600},0,FinalCoordinate[x],0);;
}
得到最终坐标的四个点后,使用Path2D检查交点:
Path2D p = new Path2D.Float();
p.moveTo(FinalCoordinate[0][0],FinalCoordinate[0][1]);
for(int x = 1;x<4;k++)
{
p.lineTo(fc[x][0],fc[x][1]);
}
p.closePath();
boolean Result = p.contains(MouseX, MouseY);
就是这样!感谢这些建议和链接:)
在 JOGL 的 3D 世界中有一堆 2x2 "floor/tiles",它们被投射到相机中,我想知道光标是否悬停在图块上。
我有这样的相机设置:
glu.gluPerspective(90, 4.0/3.0, 1, 100);
glu.gluLookAt(-2f, 8f, -2f, 0f, 0f, 0f, 0f, 1f, 0f);
并且 y=0 窗格上有一些像这样的图块或块
gl.glPushMatrix();
{
// Camera settings (same as above)
glu.gluPerspective(90, 4.0/3.0, 1, 100);
glu.gluLookAt(-2f, 8f, -2f, 0f, 0f, 0f, 0f, 1f, 0f);
// Draw the tiles
gl.glPushMatrix();
{
gl.glBegin(GL2.GL_POLYGON);
{
// a bunch of translated and textured
// (1,0,1) (1,0,-1) (-1,0,-1) (-1,0,1)
// rectangle here,
}
gl.glEnd();
}
gl.glPopMatrix();
}
gl.glPopMatrix();
我是3D新手,只熟悉Java Graphics2D。 2D矩形和游标的交集只是简单的几个比较,但在3D中似乎要复杂很多。我正在寻找一些数学或图书馆来做到这一点。
或者如果有一种方法可以获取屏幕上最终像素的 4 个点,也许我想做 java.awt.Shape contain() 并检查它是否相交。
结果会是这样的:
也许最简单的解决方案是使用 gluProject();获取屏幕坐标,并使用 java.awt.geom.Path2D 检查鼠标坐标是否在该区域。
这是一个简单的示例代码:
// do inside the matrix stack? of rendering rectangles to get the right matrix we want
float[][] FinalCoordinate = new float[4][4];
float[] ModelView = new float[16];
float[] Projection = new float[16];
gl.glGetFloatv(GL2.GL_MODELVIEW_MATRIX,ModelView,0);
gl.glGetFloatv(GL2.GL_PROJECTION_MATRIX,Projection,0);
for(int x = 0; x < 4; x++)
{
glu.gluProject(Vertex[x][0],0f,Vertex[x][2],ModelView,0,Projection,0,new int[]{0,0,800,600},0,FinalCoordinate[x],0);;
}
得到最终坐标的四个点后,使用Path2D检查交点:
Path2D p = new Path2D.Float();
p.moveTo(FinalCoordinate[0][0],FinalCoordinate[0][1]);
for(int x = 1;x<4;k++)
{
p.lineTo(fc[x][0],fc[x][1]);
}
p.closePath();
boolean Result = p.contains(MouseX, MouseY);
就是这样!感谢这些建议和链接:)