当前位置: 首页 > 面试题库 >

沿运动方向旋转对象

辛可人
2023-03-14
问题内容

是否有一种相对简单的旋转SKSpriteNode的方法,使其始终面对其移动方向?我班的Gamecene有一个带有相对物理实体的对象系统,它们在碰撞时会相互施加脉冲。这使得很难准确地跟踪对象的移动方向。某些对象的形状也不规则,这会使事情更加混乱。我尝试使用三角函数(例如反正切),但是它仅在非常特殊的情况下可以正常使用。可能有一种方法可以找出SKSpriteNode轨迹的角度,以便可以将对象旋转到该角度吗?感谢您的任何帮助,您可以提供!

编辑:

一旦两个对象发生碰撞,我就为CGVector创建了一个扩展,并尝试沿其速度方向旋转SKSpriteNode(感谢这个主意为0x141E),但它似乎无法正常工作

func didBeginContact(contact: SKPhysicsContact) {
    var firstBody : SKPhysicsBody = contact.bodyA
    var secondBody : SKPhysicsBody = contact.bodyB
    if ((firstBody.categoryBitMask == PhysicsCatagory.Blade) && (secondBody.categoryBitMask == PhysicsCatagory.Laser))
    {
        if (secondBody.node != nil)
        {
            if (saberAngle <= 0 && LCR == 1) // Blade pointing right
            {
                let rebound = CGVectorMake(-reboundStrength*sin(1.5707 + saberAngle), reboundStrength*cos(1.5707 + saberAngle))
                secondBody.applyImpulse(rebound)
            }
            else if (saberAngle > 0 && LCR == -1) // Blade pointing left
            {
                let rebound = CGVectorMake(reboundStrength*sin(1.5707 - saberAngle), reboundStrength*cos(1.5707 - saberAngle))
                secondBody.applyImpulse(rebound)
            }
            if (secondBody.velocity.speed() > 0.01){
                (secondBody.node as! SKSpriteNode).zRotation = secondBody.velocity.angle() - offset
            }
        }
    }
}

我没有在didSimulatePhysics()方法中执行此操作,因为有时我尝试旋转的节点将不存在,并且会出现诸如“使用未解析的标识符’sprite’”的错误。

编辑:

我可以通过简单地创建并运行一个名为turn的动作来使它工作,该动作将sprite旋转到secondBody.velocity.angle()-offset,但是我仍然好奇为什么我的代码在^^之前不起作用


问题答案:

沿其运动方向旋转精灵非常简单。您可以使用函数将子画面速度的xy分量转换为一个角度来实现atan2。仅当精灵的速度大于某个标称值时,才应旋转它,以防止在精灵的速度(接近)为零时将精灵重置为零度。

如果我们扩展CGVector以通过速度分量计算速度和角度

extension CGVector {
    func speed() -> CGFloat {
        return sqrt(dx*dx+dy*dy)
    }
    func angle() -> CGFloat {
        return atan2(dy, dx)
    }
}

我们可以旋转精灵,使其面向运动方向

override func didSimulatePhysics() {
    if let body = sprite.physicsBody {
        if (body.velocity.speed() > 0.01) {
            sprite.zRotation = body.velocity.angle() - offset
        }
    }
}

其中,offset = CGFloat(M_PI_2)如果当你的精灵朝上zRotation是零,offset = 0如果当你的精灵面向右边zRotation是零。



 类似资料:
  • 所以我有一个立方体,我想绕着它的三个轴(立方体的轴,而不是窗口)旋转。正如许多其他类似的问题所指出的,只要我只朝一个方向旋转,我的旋转就会起作用,但当我开始混合它们时,我会得到奇怪的结果。特别是,无论立方体如何旋转,围绕y轴的旋转始终围绕窗口的y轴旋转。 我的绘图代码如下: 这个问题似乎非常准确地描述了我想做什么,公认的答案似乎是我想做什么,但是他提供的链接已经死了。 从我在链接问题中收集到的信息

  • 我正在为我的游戏设计一个区块旋转组件,我遇到了一个我无法理解的小问题。基本上,我希望能够沿所有三个轴旋转网格组件。玩家一次只能旋转一个轴,旋转90度或-90度。我还希望玩家始终根据世界的X、Y和Z轴旋转网格,而不是块的相对轴,它将随着旋转而改变。我如何做到这一点? 无旋转的网格: 网格沿X轴逆时针旋转90度: 这里的问题是,如果我想沿着Y轴旋转块,相反,它将沿着Z轴旋转块,因为块现在被旋转。我如何

  • 背景 我正在尝试使用LWJGL 3.0在Java中创建一个FPS游戏。我已经设置了一个camera类,它具有俯仰和偏航(roll未被使用)。相机本身扩展实体,因为它有一个模型。无论相机指向哪里,我都希望这个模型始终显示在相机的“前方”。每个实体都有一个方法getTransformationMatrix(),该方法返回一个矩阵4f,然后将其传递到实体着色器。 问题 模型需要指向相机的方向,以及围绕相

  • 要通过WebGL渲染出立方体旋转的动画效果,你首要了解“帧”这个概念,比如你观看的视频其实就是一帧一帧的图片连续播放的效果,只要图片刷新的频率的不是太低,人的眼睛都不会察觉,一般30~60FPS就可以。 WebGL如何产生一帧一帧的图片,这个很简单,执行一次绘制函数gl.drawArrays(),WebGL图形系统就会通知GPU渲染管线处理顶点数据生成一帧RGB像素数据显示在屏幕canvas画布上

  • 我正在构建一个应用程序,它依赖于显示从相机拍摄的许多位图图像。我希望所有图像都以90度(纵向)的方向显示,我知道如何使用每个图像提供的EXIF信息来实现这一点。在拍摄图像后立即旋转图像的位图以满足我的需要,然后将其发送到我的服务器,这对我来说是一个更好的主意,还是应该在不旋转图像的情况下将图像发送到我的服务器,然后每当我下拉图像时,使用图像附带的EXIF旋转来旋转我正在显示的图像视图?我需要一个高

  • 使地球自动旋转,并控制旋转速率。地球的自动旋转功能在默认情况下是关闭的,如果启动旋转功能,默认的旋转速率是1。 // 启用自动旋转功能,将转速设置为1(同时1也是默认的转速) controller.setAutoRotation( true, 1 ); // 如果之前开启了自动旋转功能,可以用这种方式将其关闭 controller.setAutoRotation( false );