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

ARKit –沿特定轴(不在平面上)拖动节点

戚勇
2023-03-14
问题内容

我试图将一个节点拖到Y-axis 屏幕上的确切位置。但是我找不到任何方法,这是我当前的代码。你有什么主意吗?

var movedObject:SCNNode?

@objc func handlePan(_ recognizer: UIPanGestureRecognizer) {

    if recognizer.state == .began {

        let tapPoint: CGPoint = recognizer.location(in: sceneView)
        let result = sceneView.hitTest(tapPoint, options: nil)
        if result.count == 0 {
            return
        }
        let hitResult: SCNHitTestResult? = result.first
        movedObject = hitResult?.node //.parent?.parent
        } else if recognizer.state == .changed {

        if (movedObject != nil) {
            let tapPoint: CGPoint = recognizer.location(in: sceneView)
            let hitResults = sceneView.hitTest(tapPoint, types: .featurePoint)
            let result: ARHitTestResult? = hitResults.last

            if result?.worldTransform != nil{                      
                let matrix: SCNMatrix4 = SCNMatrix4.init((result?.worldTransform)!)
                let vector: SCNVector3 = SCNVector3Make(matrix.m41, matrix.m42, matrix.m43)
                movedObject?.position = vector    
            }                   
        }
    } else if recognizer.state == .ended {
        movedObject = nil
    }  
}

问题答案:

找到了解决方案!我在评论中添加了一些解释。

if (movedObject != nil) {

    //Normalized-depth coordinate matching the plane I want
    let projectedOrigin = sceneView.projectPoint((movedObject?.position)!)

    //Location of the finger in the view on a 2D plane
    let location2D = recognizer.location(in: sceneView)

    //Location of the finger in a 3D vector
    let location3D = SCNVector3Make(Float(location2D.x), Float(location2D.y), projectedOrigin.z)

    //Unprojects a point from the 2D pixel coordinate system of the renderer to the 3D world coordinate system of the scene
    let realLocation3D = sceneView.unprojectPoint(location3D)

    if movedObject?.position != nil {

        //Only updating Y axis position
        movedObject?.position = SCNVector3Make((movedObject?.position.x)!, realLocation3D.y, (movedObject?.position.z)!)
    }

}


 类似资料:
  • 问题内容: 我想沿着特定的轴动态切片一个numpy数组。鉴于这种: 我想要达到相同的结果: 使用这样的东西: 但是值不能放在元组中,所以我不知道如何构建切片。 问题答案: 我认为一种方法是使用: 我有一种模糊的感觉,我以前曾经为此使用过一个函数,但是现在似乎找不到了。

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

  • 问题内容: 如何实现垂直平面检测(即对于墙壁)? 问题答案: 编辑: 自ARKit 1.5(iOS 11.3)起,现在支持。只需使用。我出于历史目的保留了以前的帖子。 TL; DR 垂直平面检测还不是ARKit中的功能。这表明该功能可能正在开发中,将来可能会添加。如果它只是一个布尔值,则表明它是最终值。 确认书 我在WWDC17与苹果工程师的对话证实了这种怀疑。 说明 您可能会争辩说,为此创建一个

  • 问题内容: 我有一个从CSV导入的像这样的数据框。 我想添加一个新的MA列,该列计算该列pop的滚动平均值。我尝试了以下 我得到一个错误 所以我想让我尝试一下,如果它不添加任何列就可以工作。我用了 我得到了输出 我似乎无法对栏弹出应用滚动平均。我究竟做错了什么? 问题答案: 要分配列,您可以根据以下内容创建滚动对象: ac2001发布的答案并不是执行此操作最有效的方法。他正在计算数据帧中每一列的滚

  • 问题内容: 我试图在这个问题中创建一个类似于“奖杯轮”的可旋转节点。到目前为止,我具有甩尾功能,可以使用效果很好的UIPanGestureRecognizer在物理物体上添加角度脉冲。我也可以通过触摸停止旋转。 现在,我试图通过拖动或滑动手势来微调方向盘,这样,如果玩家对最终的效果不满意,就可以手动旋转/拖动/旋转它所喜欢的旋转方式。 目前,我将触摸的位置保存在touchesBegan中,并尝试在