0

我很难模仿“眼球”效果。我有一个OvalShape(如 PowerPack 形状)并且可以将运动限制在特定的 x,y 上。但是,我需要一个新的眼睛来帮助我,我想我已经看太久了,无法理解它。

目标:

通过跟随光标位置来模拟眼球运动体验。

规格:

光标位置是PointToClient类型,因此,它是相对于形式的。对象/形状是相对于 aShapeContainer所以 MousePosition 10,10 将转换为 EyePupil 位置 10,10 因为该位置基于它的父级

这是一个概要:

Class

Dim MousePosition As Drawing.Point

.....Handles MyBase.Load

    Dim ctrl As System.Windows.Forms.Control
    For Each ctrl In Me.Controls
        AddHandler ctrl.MouseMove, AddressOf OnMouseMoveHandler
    Next

    Dim canvas As New ShapeContainer
    canvas.Parent = Me.EyeIcon

    Me.EyePupilShape.Parent = canvas

处理事件:

....OnMouseMoveHandler(..) 

    MousePosition = Me.PointToClient(Cursor.Position)
    Debug.Print("Mouse position : X = " & MousePosition.X & ", " & MousePosition.Y)

    Me.EyePupilShape.Location = New Drawing.Point(Clamp(MousePosition.X, 32, 50), Clamp(MousePosition.Y, 31, 50))

其中 Clamp 只是MathHelper.clamp的自定义版本,最小/最大值是眼睛的“瞳孔”应限制在其父元素内的位置

这是因为它将瞳孔限制在特定的 x,y 范围内

但是,它不会“跟随”光标本身。例如,如果光标在左下角,它不会识别,它只是基于 x,y 值,这就是我需要帮助来解决我目前所拥有的。对于它的价值,我从 MSDN 获得了我的大部分信息

4

1 回答 1

2

您需要考虑到鼠标光标的角度,然后根据该角度计算单位圆上的位置,并按“瞳孔移动区域”的半径进行缩放,调整鼠标位置在眼睛/瞳孔内。

我在 VB.NET 中编写了一个示例,发布在 Github 上

计算在Eyeball.Pupil.Update(Point mouse)函数内,该函数接收使用函数转换的鼠标坐标PointToClient(),就像您的情况一样。这是代码:

Public Sub Update(ByVal mouse As Point)
    'Calculate angle to mouse position
    Dim distanceVector = New PointF(mouse.X - _center.X, mouse.Y - _center.Y)
    Dim angleToMouse = Math.Atan2(distanceVector.Y, distanceVector.X)

    'If the mouse is within the movement radius, restrict movement
    Dim absDistanceVector As PointF = distanceVector
    If absDistanceVector.X < 0 Then absDistanceVector.X *= -1
    If absDistanceVector.Y < 0 Then absDistanceVector.Y *= -1

    'Calculate scale
    Dim scale = New PointF(Math.Min(absDistanceVector.X, _movementRadius.X),
                               Math.Min(absDistanceVector.Y, _movementRadius.Y))

    'Adjust X and Y of the pupil based on scaled vector to mouse cursor, offset by pupil origin
    X = CType(Math.Cos(angleToMouse), Single) * scale.X + _center.X - BoundingBox.Width / 2
    Y = CType(Math.Sin(angleToMouse), Single) * scale.Y + _center.Y - BoundingBox.Height / 2

End Sub 
于 2017-02-05T16:35:15.423 回答