OpenGL鼠标缩放中心点位置问题

guili112 2020-07-02 03:45:33
最近在学习C#版本的OpenGL(SharpGL),遇到了一个应用上的问题,请各路神仙帮忙指点一下
功能需求:通过鼠标滚轮的方式实现图形放大缩小的功能,要求:放大缩小都已鼠标所在位置为中心

先简单说一下我的实现思路(由于对OpenGL不熟悉,所以很多运算都是自己写的,各位大神若有更便捷的方法,帮忙指点一下):
1、确定屏幕像素点坐标和视野矩阵坐标之间的对应关系:
1.1、已知控件OpenGLControl的width和height,用Ortho设定视野大小,可以得到屏幕像素与视野长宽对应比。
如: gl.Ortho(-10, 10, -10 , 10 , 0.01, 100);
xx = 20.0 / openGLControl1.Width;
yy = 20.0 / openGLControl1.Height;
1.2、屏幕像素坐标是左上角为(0,0),右下角为(width,height),视野中心坐标为(0,0,0),可以得到鼠标所在位置对应视野坐标:
Mouse_Pos_x = xx * (e.X - openGLControl1.Width / 2);
Mouse_Pos_y = yy * (-e.Y + openGLControl1.Height / 2);
2、鼠标滚动事件(程序在下面)
3、缩放操作:
在OpenGLlDraw函数中加
gl.Scale(Scale, Scale, Scale);
此时,不加任何平移指令的话,所有的放大缩小都是依据视野中心(0,0,0)进行缩放。
在缩放操作前,加入平移指令gl.Translate(Mouse_Pos_x*(1-Scale), Mouse_Pos_y*(1-Scale), 0),可以实现在指定鼠标点进行缩放效果。

问题来了,由于OpenGLDraw每次绘制的时候都是依据单位矩阵进行几何变换,若鼠标缩放时,鼠标位置和上次缩放操作位置不同,Mouse_Pos_x和Mouse_Pos_y就不一样,导致OpenGLDraw绘制的时候会重新以当前鼠标位置进行缩放平移运算,没办法在之前缩放平移的操作基础上叠加此次平移效果。
想实现一种:此次的缩放平移gl.Translate操作是在上次的缩放平移gl.Translate基础上的操作。

附上主要程序:
        private void openGLControl1_Resized(object sender, EventArgs e)
{
SharpGL.OpenGL gl = this.openGLControl1.OpenGL;
gl.MatrixMode(OpenGL.GL_PROJECTION);
gl.LoadIdentity();
gl.Ortho(-10, 10, -10 / ratio, 10 / ratio, 0.01, 100);
xx = 20.0 / openGLControl1.Width;
yy = 20.0 / openGLControl1.Height ;
gl.LookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
gl.MatrixMode(OpenGL.GL_MODELVIEW);
}

        private void Mouse_Wheel(object sender, MouseEventArgs e)
{
//当e.Delta > 0时鼠标滚轮是向上滚动,e.Delta < 0时鼠标滚轮向下滚动
if (Mouse_In_Flag)
{
if (e.Delta < 0)
Scale += 0.1f;
else
Scale -= 0.1f;
if (Scale >= 5)
Scale = 5;
if (Scale <= 0.05)
Scale = 0.05;
Mouse_Pos_x = (double)xx * (e.X - openGLControl1.Width / 2);
Mouse_Pos_y = (double)yy * (-e.Y + openGLControl1.Height / 2);
}
}

        private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args)
{
OpenGL gl=this.openGLControl1.OpenGL;
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT|OpenGL.GL_DEPTH_BUFFER_BIT);

gl.LoadIdentity();
DrawGrid(gl);

gl.PushMatrix();
gl.Translate(Mouse_Pos_x*(1-Scale), Mouse_Pos_y*(1-Scale), 0)
gl.Scale(Scale, Scale, Scale);
gl.Color(1f,1f,0f);
gl.LineWidth(2f);
gl.Begin(OpenGL.GL_LINE_LOOP);
gl.Vertex(0, 0, 0);
gl.Vertex(5, 0, 0);
gl.Vertex(5, 5, 0);
gl.Vertex(0, 5, 0);
gl.End();
gl.PopMatrix();
gl.Flush();
}
...全文
6256 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
averagePerson 2022-04-21
  • 打赏
  • 举报
回复

glpushMatrix,glPopMatrix会不会有用?

Michael712 2022-04-11
  • 打赏
  • 举报
回复

你好,我也遇到了这个问题,你这个问题解决了吗?

guili112 2020-07-06
  • 打赏
  • 举报
回复
已经过去好几天了,自己顶一下吧 最近在研究project和unproject,看看能不能找到好的方法实现

111,114

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧