【问题标题】:In field of view with SpriteKit rotational coordinate system在 SpriteKit 旋转坐标系的视野中
【发布时间】:2014-11-24 04:54:56
【问题描述】:

SpriteKit 的旋转坐标系很难使用,不用说。

从数学上讲,这完全是一场灾难。

我有一个视野,x,最左边的视野是 θ+x,最右边的视野是 θ-x , θ 是精灵的 zRotation。

我如何检查一个角度是否在另一个人的视野中?

let λ be atan2(test.y - char.y, test.x - char.x)
let θ be char.zRotation
if λ in θ - x, θ + x
    return true

【问题讨论】:

    标签: ios objective-c math sprite-kit trigonometry


    【解决方案1】:

    如果您将角度限制在 PI 和 -PI 之间,那么数学会更简单一些:

    let PI=CGFloat(M_PI)
    
    var spriteAngle:CGFloat=0
    let fieldOfView:CGFloat=0.5
    var targetAngle:CGFloat=0
    
    while spriteAngle>PI {
       spriteAngle=spriteAngle-2*PI
    }
    while spriteAngle < -PI {
        spriteAngle=spriteAngle+2*PI
    }
    while targetAngle>PI {
        targetAngle=targetAngle-2*PI
    }
    while targetAngle < -PI {
        targetAngle=targetAngle+2*PI
    }
    
    let lowerBound=spriteAngle-fieldOfView
    let upperBound=spriteAngle+fieldOfView
    
    if lowerBound <= targetAngle && targetAngle <= upperBound {
        //angle in range
    }
    

    【讨论】:

      【解决方案2】:

      这是一个如何确定一个节点是否在另一个节点的视野内的示例。如果将角度转换为 [0, 2*pi),则相当简单。

          // 1/2 of the field of view
          #define kFieldOfViewDiv2    (M_PI/8)
      
          // Calculate differences in x and y between the sprites
          CGFloat dx = sprite2.position.x - sprite.position.x;
          CGFloat dy = sprite2.position.y - sprite.position.y;
          // Determine angle of sprite2 relative to sprite
          CGFloat theta = atan2(dy, dx);
          // Theta in [0, 2*pi)
          if (theta < 0) {
              theta = theta + M_PI*2;
          }
          // Alpha in (-2*pi, 2*pi)
          CGFloat alpha = fmod(sprite.zRotation,2*M_PI);
          // Alpha in [0, 2*pi)
          if (alpha < 0) {
              alpha = alpha + M_PI * 2;
          }
          // Calculate |theta-alpha|
          CGFloat diff = fabs(theta-alpha);
          // Handle wrap near 0 degrees
          if (diff > M_PI) {
              diff = 2*M_PI - diff;
          }
          // Field of view test
          if (diff <= kFieldOfViewDiv2) {
              NSLog(@"In field of view");
          }
      

      【讨论】:

        猜你喜欢
        • 2016-03-08
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 2019-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多