1

使用 SharpGL,是否可以将屏幕光标位置转换回模型视图位置(即创建光线投射功能)?

我一直在使用的示例类似于以下内容:

private void OpenGLControl_OpenGLDraw(object sender, SharpGL.OpenGLEventArgs args)
{

    OpenGL gl = args.OpenGL;
    gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
    gl.LoadIdentity(); 

    gl.Translate(0.0f, 0.0f, -6.0f);
    gl.Rotate(rotatePyramid, 0.0f, 1.0f, 0.0f);

    gl.Begin(OpenGL.GL_TRIANGLES);

        gl.Color(1.0f, 0.0f, 0.0f);        
        gl.Vertex(0.0f, 1.0f, 0.0f);    
        gl.Color(0.0f, 1.0f, 0.0f);        
        gl.Vertex(-1.0f, -1.0f, 1.0f);    
        gl.Color(0.0f, 0.0f, 1.0f);        
        gl.Vertex(1.0f, -1.0f, 1.0f);    

        gl.Color(1.0f, 0.0f, 0.0f);        
        gl.Vertex(0.0f, 1.0f, 0.0f);    
        gl.Color(0.0f, 0.0f, 1.0f);        
        gl.Vertex(1.0f, -1.0f, 1.0f);    
        gl.Color(0.0f, 1.0f, 0.0f);        
        gl.Vertex(1.0f, -1.0f, -1.0f);    

        gl.Color(1.0f, 0.0f, 0.0f);        
        gl.Vertex(0.0f, 1.0f, 0.0f);    
        gl.Color(0.0f, 1.0f, 0.0f);        
        gl.Vertex(1.0f, -1.0f, -1.0f);    
        gl.Color(0.0f, 0.0f, 1.0f);        
        gl.Vertex(-1.0f, -1.0f, -1.0f);    

        gl.Color(1.0f, 0.0f, 0.0f);        
        gl.Vertex(0.0f, 1.0f, 0.0f);    
        gl.Color(0.0f, 0.0f, 1.0f);        
        gl.Vertex(-1.0f, -1.0f, -1.0f);    
        gl.Color(0.0f, 1.0f, 0.0f);        
        gl.Vertex(-1.0f, -1.0f, 1.0f);    

    gl.End();
    gl.Flush();
}

使用 SharpGL 以及上面示例中演示的方法,是否可以实现光线投射/鼠标选择?或者我是否需要深入研究 OpenGL 的工作原理(手动管理矩阵等)来实现这一点?

编辑:为了澄清,我试图检索 2D 光标位置的 3D 解释。也许通过透视(w)缩放等。

4

2 回答 2

1

您可以只使用 gluUnproject() 并将您从鼠标回调中检索到的 2D 屏幕空间鼠标位置传递给它。此函数将为您返回 3D 世界空间位置,您可以根据需要使用它。

于 2017-10-17T14:11:21.643 回答
0

我不知道前面的答案是否对你有好处,但顺便说一句,glVertex、glRotate、glBegin 等都是非常古老的GL 函数(v1 或 v2)。是您选择使用它们,还是您不知道使用 opengl(VAO、VBO 等)做 3D 事情的 v3 或 v4 方式?

于 2017-10-17T11:59:29.363 回答