Ios 使arkit相机垂直而不是水平
我正在尝试制作一个应用程序,用户在文本字段中输入一些文本,然后应用程序在ar摄像头前向用户显示这些文本。我将文本正确地放置在相机前面,并将文本的定位点更改为文本的中心。但是,当我将文本添加到场景中时,文本会绕z轴旋转90度。我知道为什么,但我不知道如何解决它。原因是当设备处于横向时,arscene.session的相机在x、y、z方向上的旋转为0,但由于我希望我的应用程序处于纵向,因此我将设备旋转90度,这也会旋转相机,并且由于文本具有相同的相机旋转,因此也会旋转。我试图通过再次围绕z轴旋转文字来纠正文字的旋转,但这并不能解决整个问题,因为当我改变手机的方向时,会影响相机轴,从而影响文字的不同轴(不是同一轴,因为我在纠正步骤中旋转了轴)。因此,我认为解决这个问题的唯一方法是从一开始就旋转相机,使其与纵向模式保持一致,但我还没有找到任何方法来设置相机的旋转 以下是添加文本的代码:Ios 使arkit相机垂直而不是水平,ios,swift,xcode,arkit,Ios,Swift,Xcode,Arkit,我正在尝试制作一个应用程序,用户在文本字段中输入一些文本,然后应用程序在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
}
这就是输出的样子。。
如果您的意思是不希望设备的方向随旋转而改变,则欢迎提供任何帮助,然后:
Go to Project > General > Deployment Info
在“设备方向”下,取消选中除“纵向”之外的所有框
如果这不能解决您的问题,并且您真正想要的是修复文本节点的euler角度,请告诉我,我很乐意提供帮助。您不能将矩阵标识用于任何方向,它必须根据设备方向进行旋转。我的应用程序中有一个函数,在执行矩阵乘法之前,我会调用该函数进行更新:
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
}
我很抱歉我反应太晚了。这是摄像机的平移还是物体的平移?这是取代矩阵单位的起点,在你的坐标系中称为新变换example@Rom4in谢谢,你的回答帮助我解决了这个问题不,设备的方向不是我的问题。