【问题标题】:SharpGL Screen / Cursor Coordinate to Model ViewSharpGL 屏幕/光标坐标到模型视图
【发布时间】:2017-09-26 18:40:32
【问题描述】:

使用 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)缩放等。

【问题讨论】:

  • 这被称为对象选择/对象拾取,有很多关于它的文章。 en.wikibooks.org/wiki/OpenGL_Programming/Object_selection
  • 我的问题是有没有办法使用 SharpGL 库来实现这一点
  • 是的,您使用普通的 OpenGL 进行操作,但通过 SharpGL 包装器访问 API 调用。这就是 SharpGL 的工作原理……它并不是一个真正不同的 API,它只是一个允许您从 C# 调用 OpenGL 函数的薄包装器。

标签: c# wpf opengl graphics sharpgl


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      相关资源
      最近更新 更多