Tôi đang triển khai biểu đồ 2D trong WPF bằng thư viện SharpGL. Tôi đã quản lý để vẽ một số đối tượng nguyên thủy trên màn hình và tôi cần phải phát hiện nhấp chuột vào các đối tượng này.SharpGL- Phát hiện nhấp chuột trên các yếu tố OpenGL Sử dụng lựa chọn và chọn
Tôi đã xem xét hướng dẫn OpenGL về cách thực hiện lựa chọn và chọn đối tượng đồ họa, nhưng tôi không quản lý để làm cho nó hoạt động. Trong ứng dụng thử nghiệm của tôi, tôi vẽ ba hình tam giác trên màn hình và khi nhấp chuột xảy ra, tôi vẽ ba tam giác giống nhau ở chế độ GL_SELECT
với hy vọng phát hiện xem có bất kỳ hình tam giác nào đã được nhấp vào hay không. Tôi không chắc đây có phải là cách tiếp cận chính xác hay không. Kiểm tra lần truy cập luôn trả về tất cả các phần tử từ bộ đệm chọn.
Tôi biết rằng các tham số chiều rộng và chiều cao trong PickMatrix không chính xác và tôi không thực sự chắc chắn giá trị chính xác sẽ là gì. Có chiều rộng và chiều cao của toàn bộ khung nhìn không?
private void OpenGLControl_OpenGLDraw(object sender, SharpGL.SceneGraph.OpenGLEventArgs args)
{
//// Get the OpenGL object.
OpenGL gl = args.OpenGL;
//set background to white
gl.ClearColor(1.0f, 1.0f, 1.0f, 1.0f);
//// Clear the color and depth buffer.
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
DrawScene();
gl.Flush();
}
private void DrawScene()
{
OpenGL gl = openGLControl.OpenGL;
gl.Color(1.0, 0.0, 0.0);
DrawTriangle(-0.2, 0.6, 0.0, 0.8, 0.2, 0.6);
gl.Color(0.0, 1.0, 0.0);
DrawTriangle(-0.2, 0.2, 0.0, 0.4, 0.2, 0.2);
gl.Color(0.0, 0.0, 1.0);
DrawTriangle(-0.2, -0.2, 0.0, 0.0, 0.2, -0.2);
}
private void SelectObjects(double mouseDownX, double mouseDownY)
{
OpenGL gl = openGLControl.OpenGL;
int BUFSIZE = 512;
uint[] selectBuf = new uint[BUFSIZE];
gl.SelectBuffer(BUFSIZE, selectBuf);
gl.RenderMode(OpenGL.GL_SELECT);
gl.InitNames();
gl.PushName(0);
int[] viewport = new int[4];
gl.GetInteger(OpenGL.GL_VIEWPORT, viewport);
//how to define the width and height of an element?
gl.PickMatrix(mouseDownX, (double)(viewport[3] - mouseDownY), 50.0, 50.0, viewport);
gl.LoadIdentity();
gl.LoadName(1);
gl.Color(1.0, 0.0, 0.0);
DrawTriangle(-0.2, 0.6, 0.0, 0.8, 0.2, 0.6);
gl.LoadName(2);
gl.Color(0.0, 1.0, 0.0);
DrawTriangle(-0.2, 0.2, 0.0, 0.4, 0.2, 0.2);
gl.LoadName(3);
gl.Color(0.0, 0.0, 1.0);
DrawTriangle(-0.2, -0.2, 0.0, 0.0, 0.2, -0.2);
gl.Flush();
int hits = gl.RenderMode(OpenGL.GL_RENDER);
processHits(hits, selectBuf);
}
private void processHits(int hits, uint[] buffer)
{
uint bufferIterator = 0;
for (uint i = 0; i < hits; i++)
{
uint numberOfNamesInHit = buffer[bufferIterator];
Console.WriteLine("hit: " + i + " number of names in hit " + numberOfNamesInHit);
uint lastNameIndex = bufferIterator + 2 + numberOfNamesInHit;
for (uint j = bufferIterator + 3; j <= lastNameIndex; j++)
{
Console.WriteLine("Name is " + buffer[j]);
}
bufferIterator = bufferIterator + numberOfNamesInHit + 3;
}
}
private void OnMouseClick(object sender, MouseEventArgs e)
{
System.Windows.Point position = e.GetPosition(this);
SelectObjects(position.X, position.Y);
}
Sản lượng luôn luôn là như nhau:
hit: 0 số tên trong hit 1
Tên là 1
hit: Số 1 tên trong hit 1
Tên là 2
h nó: 2 số tên trong hit 1
Tên là 3
Cảm ơn bạn đã giải thích, tôi đã xóa dòng glLoadIdentitiy và nó hoạt động tốt :) – mobearette