SCNNode面向相机

时间:2018-03-15 10:38:40

标签: swift augmented-reality arkit scnnode scnscene

我正在尝试将SCNCylinder节点放在触摸点的场景中。我总是希望显示面向相机的圆柱形状直径。它适用于水平场景,但在垂直场景中有问题。在垂直场景中,我可以看到圆柱面,但我想显示朝向相机的全直径,无论相机方向是什么。我知道根据相机变换需要应用一些转换,但不知道如何。我没有使用平面检测作为直接添加到场景中的简单节点。

垂直图像: enter image description here

水平图像: enter image description here

插入节点的代码如下,

var myApp = angular.module('myApp', []);

myApp.controller('MyCtrl', function($scope, user) {

   $scope.userData = null;

   user.get('checkif', 2).then(function (result) {
      $scope.userData = result.data.result;
   });
});


myApp.service('user', function () {
  this.get = function (action, userId) {
    return $http({
      url: 'http://your-api-endpoint/',
      method: 'GET',
      params: {
        action: action,
        userID: userId
      }
    });
  }
});

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不确定这是处理你所需要的正确方法,但这里可以帮助你。

我认为CoreMotion可能有助于您确定设备是处于水平角度还是垂直角度。

enter image description here

  

这个类有一个名为attitude的属性,它描述了我们的设备在滚动,俯仰和偏航方面的旋转。如果我们以纵向方向握住手机,则滚动会描述围绕穿过手机顶部和底部的轴的旋转角度。音高描述了围绕穿过手机两侧的轴的旋转角度(音量按钮所在的位置)。最后,偏航描述围绕穿过手机正面和背面的轴的旋转角度。通过这三个值,我们可以确定用户如何拿着手机参考水平地面(Stephan Baker)。

首先导入CoreMotion

import CoreMotion

然后创建以下变量:

 let deviceMotionDetector = CMMotionManager()
 var currentAngle: Double!

然后我们将创建一个函数来检查我们设备的角度,如下所示:

   /// Detects The Angle Of The Device
func detectDeviceAngle(){

    if deviceMotionDetector.isDeviceMotionAvailable == true {

        deviceMotionDetector.deviceMotionUpdateInterval = 0.1;

        let queue = OperationQueue()

        deviceMotionDetector.startDeviceMotionUpdates(to: queue, withHandler: { (motion, error) -> Void in

            if let attitude = motion?.attitude {

                DispatchQueue.main.async {

                    let pitch = attitude.pitch * 180.0/Double.pi
                    self.currentAngle = pitch
                    print(pitch)

                }
            }

        })

    }
    else {
        print("Device Motion Unavailable");
    }

}

这只需要调用一次,例如viewDidLoad

 detectDeviceAngle()

在touchesBegan方法中,您可以将其添加到最后:

//1. If We Are Holding The Device Above 60 Degress Change The Node
if currentAngle > 60 {

    //2a. Get The X, Y, Z Values Of The Desired Rotation
    let rotation = SCNVector3(1, 0, 0)
    let vector3x = rotation.x
    let vector3y = rotation.y
    let vector3z = rotation.z
    let degreesToRotate:Float = 90

    //2b. Set The Position & Rotation Of The Object
    sphereNode.rotation = SCNVector4Make(vector3x, vector3y, vector3z, degreesToRotate * 180 / .pi)

}else{

}

我相信有更好的方法可以达到你所需要的(我也非常有兴趣听到它们),但我希望它会让你开始。

结果如下:

enter image description here