【问题标题】:making the arkit camera vertical rather than horizontal使 arkit 相机垂直而不是水平
【发布时间】:2018-07-28 19:25:47
【问题描述】:

我正在尝试制作一个应用程序,用户在文本字段中输入一些文本,然后该应用程序在 ar 摄像头前向用户显示此文本。我将文本正确放置在相机前面,并将文本的锚点更改为位于文本的中心。但是当我将文本添加到场景中时,文本会围绕 z 轴旋转 90 度。我知道为什么,但我不知道如何解决它。原因是当设备处于横向时,arscene.session 的相机对所有 x、y、z 的旋转为 0,但由于我希望我的应用程序处于纵向状态,因此我将设备旋转 90 度,从而将相机旋转为好吧,由于文本具有相同的相机旋转,因此它也会旋转。我尝试通过围绕 z 轴再次旋转来纠正文本的旋转,但这并不能解决整个问题,因为当我改变手机的方向时,会影响相机轴,从而影响文本的不同轴(不是同一个轴,因为我在校正步骤中旋转了轴)。所以我认为解决这个问题的唯一方法是从一开始就旋转相机以与肖像模式保持一致,但我还没有找到任何方法来设置相机的旋转 这是添加文本的代码:

private func createTextNode(text:String?)
{
    guard let text = text else {return}
    let arText = SCNText(string: text, extrusionDepth: 1)
    arText.font = UIFont(name: arText.font.fontName, size: 2)
    arText.firstMaterial?.diffuse.contents = selectedColor

    //making the node
    let node = SCNNode()
    node.geometry = arText
    center(node: node)

    guard let currentFrame = sceneView.session.currentFrame else {return}
    let camera = currentFrame.camera
    let cameraTransform = camera.transform
    var newTransform = matrix_identity_float4x4
    newTransform.columns.3.z = -0.2
    let modifiedTransform = matrix_multiply(cameraTransform, newTransform)
    node.transform = SCNMatrix4(modifiedTransform)
    node.scale = SCNVector3(0.02, 0.02, 0.02)
    self.sceneView.scene.rootNode.addChildNode(node)
    node.eulerAngles.x = 90.degrees
}

这就是输出的样子.. output

任何帮助将不胜感激

【问题讨论】:

    标签: ios swift xcode arkit


    【解决方案1】:

    您不能将矩阵恒等式用于任何方向,它必须根据设备方向进行旋转。我的应用程序中有一个函数,在执行矩阵乘法之前我调用它来更新它:

    var translation = matrix_identity_float4x4
    
    func updateTranslationMatrix() {
    
        switch UIDevice.current.orientation{
        case .portrait, .portraitUpsideDown, .unknown, .faceDown, .faceUp:
            print("portrait ")
            translation.columns.0.x = -cos(.pi/2)
            translation.columns.0.y = sin(.pi/2)
            translation.columns.1.x = -sin(.pi/2)
            translation.columns.1.y = -cos(.pi/2)
        case .landscapeLeft :
            print("landscape left")
            translation.columns.0.x = 1
            translation.columns.0.y = 0
            translation.columns.1.x = 0
            translation.columns.1.y = 1
        case .landscapeRight :
            print("landscape right")
            translation.columns.0.x = cos(.pi)
            translation.columns.0.y = -sin(.pi)
            translation.columns.1.x = sin(.pi)
            translation.columns.1.y = cos(.pi)
        }
        translation.columns.3.z = -0.6 //60cm in front of the camera
    }
    

    【讨论】:

    • 我很抱歉我的回复迟了。这是相机平移还是物体平移?
    • 这是替换 matrix_identity 的起点,在您的示例中称为 newTransform
    • @Rom4in 谢谢你,你的回答帮助我解决了问题stackoverflow.com/questions/60072627/…
    【解决方案2】:

    如果您的意思是不希望设备的方向随着旋转而改变,那么:

    Go to Project > General > Deployment Info
    

    在设备方向下,取消选中“纵向”以外的所有复选框。

    如果这不能解决您的问题,而您真正想要的是修复文本节点的欧拉角,请告诉我,我很乐意为您提供帮助。

    【讨论】:

    • 不,设备的方向不是我的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多