回 帖 发 新 帖 刷新版面

主题:鼠标指定位置缩放 opengl(牛仔救命!) 急!

鼠标指定位置缩放 opengl


就是鼠标移动到某点,以那点为中心,缩放整个场景。提供下思路啊!
[code=c]
// true放大, false缩小
void CEasyGL::Zoom(BOOL bLarge)
{
    RECT rcWnd;
    ::GetClientRect(m_hWnd, &rcWnd);
    //鼠标点在视口(离左边界距离, 下边界距离)
    GLdouble viewX = m_curMousePt.s.X - m_viewPort.x;
    GLdouble viewY = (rcWnd.bottom - m_curMousePt.s.Y) - m_viewPort.y;
    // 视口转为世界窗口坐标 (离左边界距离, 下边界距离)
    GLdouble windowX = m_window.left + 
                        (viewX / m_viewPort.width) * m_window.xSize;
    GLdouble windowY = m_window.bottom +
                        (viewY / m_viewPort.height) * m_window.ySize;
    // 鼠标在世界窗口坐标
    //GLdouble newX = windowX - m_window.xSize / 2;
    //GLdouble newY = windowY - m_window.ySize / 2;

    static GLdouble dBigX = 1.0, dBigY = 1.0;

    if (bLarge)
    {
        // 世界零点移到鼠标世界点坐标,放大, 再移回来, 

        glLoadIdentity();
        //windowX /= 1.1;
        //windowY /= 1.1;
        glTranslated(windowX, windowY, 0);
        dBigX *= 1.1;
        dBigY *= 1.1;
        glScalef(dBigX, dBigY, 1.0f);
        glTranslated(-windowX, -windowY, 0);
    
    }
    else
    {
        glTranslated(windowX, windowY, 0);
        glScalef(0.9f, 0.9f, 1.0f);
        glTranslated(-windowX, -windowY, 0);
    }
}[/code]

回复列表 (共5个回复)

沙发

我上面的程序是有问题的。因为缩放之后,移动鼠标后就不能那样计算了。

不知道怎么弄好,help!

板凳

可以不用glScalef来缩放。

注意到“缩小物体”和“增大可视范围”其实在一定程度上是等效的(都是操作GL_MODELVIEW这个矩阵)。
对于透视投影来说,缩放整个场景一般可以等效于观察点的移动:观察点越近,看到物体就越大,反之则越小。因此,如果需要放大整个场景,只需让观察点更近即可(剪裁距离也要设置合理)。
对于正投影,处理方法类似,都是通过设置观察点,这样比“对每个物体都进行缩放”更加方便。

3 楼

_________________________________________________________
新建的java超级群,有兴趣的可以加一下,大牛小虾汇聚一堂! 哈哈!
共享有很多资料,可以供高手进阶,新手学习!

名字:In'8 技术联盟[精英]
群号:93133286   

4 楼

[quote]可以不用glScalef来缩放。

注意到“缩小物体”和“增大可视范围”其实在一定程度上是等效的(都是操作GL_MODELVIEW这个矩阵)。
对于透视投影来说,缩放整个场景一般可以等效于观察点的移动:观察点越近,看到物体就越大,反之则越小。因此,如果需要放大整个场景,只需让观察点更近即可(剪裁距离也要设置合理)。
对于正投影,处理方法类似,都是通过设置观察点,这样比“对每个物体都进行缩放”更加方便。[/quote]

观察点的本质还是使用了glScale,glTranslate,glRotate

5 楼

建议楼主把:ScreenToGlobal及GlobalToScreen封装成函数,他们俩在很多地方会用到的。
而放大缩小则可以简单地描述为:
ScreenToGlobal       // 将屏幕坐标转换为全局(GL)坐标
ChangeViewPort       // 修改视口大小
Update               // 更新绘制

我来回复

您尚未登录,请登录后再回复。点此登录或注册