Opengl 放大和缩小并将当前像素保持在鼠标坐标

Opengl 放大和缩小并将当前像素保持在鼠标坐标,opengl,math,Opengl,Math,所以。。。我写了一段代码,它在Opengl的正交模式下绘制了一个四边形。 我知道它的位置和大小。有时是方形的。。有时它是长方形的。 我试图做的是放大和缩小,并停留在同一个位置上的四。 我原以为它会奏效,但事实并非如此。 知道从鼠标位置到角点的距离、偏移量.x以及等于rect_size.x-old_size_w的差,基本数学会告诉我: (offset.x/rect_size.x)*差异。根据鼠标的位置,我可以得到位置需要移动多少的比例。 我希望有人能解决这个问题。。 谢谢 一些数字 lo

所以。。。我写了一段代码,它在Opengl的正交模式下绘制了一个四边形。 我知道它的位置和大小。有时是方形的。。有时它是长方形的。 我试图做的是放大和缩小,并停留在同一个位置上的四。 我原以为它会奏效,但事实并非如此。 知道从鼠标位置到角点的距离、偏移量.x以及等于rect_size.x-old_size_w的差,基本数学会告诉我: (offset.x/rect_size.x)*差异。根据鼠标的位置,我可以得到位置需要移动多少的比例。 我希望有人能解决这个问题。。 谢谢

一些数字

     location = 100,100
     old_size_w = 1024
     rect_size.x = 1088 (new size old_ * 1.0625)
     mouse_delta.x = 425
     offset = 100 - 425 (-325)
     difference = 1088-1024 (64)
     delta_x = 325/1088 (.2987132....)
     x_offset = Cint(delta_x * difference) (19) (19.11764...)
所以。。。。我们只移动了19个像素。。如果我们从另一个方向来计算。。2必须=与旧缩放和新缩放的差异

    delta_x = (1088-325) /1088 (.701286...)
    x_offset2 = Cint(delta_x * difference) (45) (44.88235...)
    19 + 45 = 64   <--- this proves out the math

将鼠标位置存储为u,v,其中u和v位于0.0-1.0上。翻译图像,以便将其作为0、0进行鼠标移动。操纵,在本例中是通过缩放。然后反译,使0,0,变成u。v、

将鼠标位置存储为u,v,其中u和v位于0.0-1.0之间。翻译图像,以便将其作为0、0进行鼠标移动。操纵,在本例中是通过缩放。然后反译,使0,0,变成u。v、 好的。。我解决了这个问题。。我在放大和缩小时使用了两个错误的值。 这是围绕鼠标中心缩放并保持鼠标中心的完整代码。 任何想弄明白这一点的人。。这是一个完美的代码:)

Public Sub img\u scale\u up()
如果未准备好渲染,则返回
如果缩放系数>=4.0,则
缩放系数=4.0
返回“大”,创建t_bmp将重击内存。
如果结束
作为单个的Dim amt=0.0625
缩放系数+=金额
'在调整大小的过程中,这部分数学运算会围绕鼠标中心缩放纹理。
‘old_w和old_h是图像在宽度和高度上的原始大小
'鼠标位置是窗口中的当前鼠标位置。
将偏移调整为新点
暗淡的旧尺寸,旧尺寸为双倍
旧尺寸=(旧尺寸*(缩放系数-金额))
旧尺寸=(旧尺寸*(缩放系数-金额))
偏移量=矩形位置-(鼠标位置)
rect_size.X=缩放系数*旧尺寸
rect_size.Y=缩放系数*旧的
尺寸增量x为双=CDbl(偏移量x/旧尺寸w)
尺寸增量y为双=CDbl(偏移量y/旧尺寸h)
尺寸x_偏移=增量x*(矩形尺寸.x-旧尺寸w)
尺寸y_偏移=增量y*(rect_size.y-old_size_h)
rect_location.X+=CInt(X_偏移)
rect_location.Y+=CInt(Y_偏移)
绘制(当前图像)
端接头
公共子img\U比例下降()
如果未准备好渲染,则返回

如果缩放系数Ok。。我解决了这个问题。。我在放大和缩小时使用了两个错误的值。 这是围绕鼠标中心缩放并保持鼠标中心的完整代码。 任何想弄明白这一点的人。。这是一个完美的代码:)

Public Sub img\u scale\u up()
如果未准备好渲染,则返回
如果缩放系数>=4.0,则
缩放系数=4.0
返回“大”,创建t_bmp将重击内存。
如果结束
作为单个的Dim amt=0.0625
缩放系数+=金额
'在调整大小的过程中,这部分数学运算会围绕鼠标中心缩放纹理。
‘old_w和old_h是图像在宽度和高度上的原始大小
'鼠标位置是窗口中的当前鼠标位置。
将偏移调整为新点
暗淡的旧尺寸,旧尺寸为双倍
旧尺寸=(旧尺寸*(缩放系数-金额))
旧尺寸=(旧尺寸*(缩放系数-金额))
偏移量=矩形位置-(鼠标位置)
rect_size.X=缩放系数*旧尺寸
rect_size.Y=缩放系数*旧的
尺寸增量x为双=CDbl(偏移量x/旧尺寸w)
尺寸增量y为双=CDbl(偏移量y/旧尺寸h)
尺寸x_偏移=增量x*(矩形尺寸.x-旧尺寸w)
尺寸y_偏移=增量y*(rect_size.y-old_size_h)
rect_location.X+=CInt(X_偏移)
rect_location.Y+=CInt(Y_偏移)
绘制(当前图像)
端接头
公共子img\U比例下降()
如果未准备好渲染,则返回
如果Zoom_Factor我通常会在推导正确的方程时迷失方向(犯愚蠢的错误)(因为我使用了许多视图变换公式,而不仅仅是一个),而且大多数情况下我都懒得推导,所以我会这样做:

  • 将鼠标位置转换为不缩放偏移的坐标系

    是屏幕坐标系还是世界坐标系取决于变换顺序。将结果存储为
    mx0,my0

  • 应用
    缩放
    更改

  • 将鼠标位置转换为不缩放偏移的坐标系

    它与#1相同,但具有更新的
    缩放功能。将结果存储为
    mx1,my1

  • 更新偏移量

    只需添加:

    offset_x += mx0-mx1;
    offset_y += my0-my1;
    
    其中
    offset\u x,offset\u y
    保持视图偏移(位置)

  • 另请参见

    在推导正确的方程式时,我通常会迷失方向(犯一些愚蠢的错误)(因为我使用了许多视图变换公式,而不仅仅是一个),而且大多数情况下我都懒于推导,所以我会这样做:

  • 将鼠标位置转换为不缩放偏移的坐标系

    是屏幕坐标系还是世界坐标系取决于变换顺序。将结果存储为
    mx0,my0

  • 应用
    缩放
    更改

  • 将鼠标位置转换为不缩放偏移的坐标系

    它与#1相同,但具有更新的
    缩放功能。将结果存储为
    mx1,my1

  • 更新偏移量

    只需添加:

    offset_x += mx0-mx1;
    offset_y += my0-my1;
    
    其中
    offset\u x,offset\u y
    保持视图偏移(位置)


  • 另请参见

    这就是它所做的……某种程度上。。。it sc