2017-10-25 1 views
6

나는 내가 탭 위치로 화면에 텍스트를 추가하는 ARKit있는 간단한 응용 프로그램 만드는 오전 : 그것은 작동ARKit에서 텍스트 방향을 어떻게 설정할 수 있습니까?

@objc func tapped(sender: UITapGestureRecognizer){ 
    let sceneView = sender.view as! ARSCNView 
    let tapLocation = sender.location(in: sceneView) 
    let hitTest = sceneView.hitTest(tapLocation, types: .featurePoint) 
    if !hitTest.isEmpty{ 
     self.addTag(tag: "A", hitTestResult: hitTest.first!) 
    } 
    else{ 
     print("no match") 
    } 
} 

func addTag(tag: String, hitTestResult: ARHitTestResult){ 
    let tag = SCNText(string:tag, extrusionDepth: 0.1) 
    tag.font = UIFont(name: "Optima", size: 1) 
    tag.firstMaterial?.diffuse.contents = UIColor.red 

    let tagNode = SCNNode(geometry: tag) 

    let transform = hitTestResult.worldTransform 
    let thirdColumn = transform.columns.3 
    tagNode.position = SCNVector3(thirdColumn.x,thirdColumn.y - tagNode.boundingBox.max.y/2,thirdColumn.z) 
    print("\(thirdColumn.x) \(thirdColumn.y) \(thirdColumn.z)") 
    self.sceneView.scene.rootNode.addChildNode(tagNode) 
} 

을, 그러나 나는 텍스트의 방향에 문제가 있습니다. 카메라의 원래 위치로 추가하면 텍스트 방향이 정상이며 텍스트가 앞쪽으로 볼 수 있습니다 (샘플 1). 그러나 카메라를 왼쪽/오른쪽으로 돌리고 탭하여 텍스트를 추가하면 측면 (예제 2)에서 추가 된 텍스트를 볼 수 있습니다.

샘플 1 :

3-D letter from the front

샘플 2 :

3-D letter from the side

나는 그것을 해결하기 위해 몇 가지 간단한 트릭이 있어야 알고 있지만,이 주제에 초보자 나는 할 수 없었다 지금까지 그것을 찾으십시오.

+0

텍스트 개체를 배치 할 때 어떤 유형의 동작을 찾으십니까? 당신이 돌아 다니면서 텍스트가 항상 카메라를 바라 보도록하고 싶습니까, 아니면 텍스트를 처음으로 놓았을 때 방향을 고정시키고 싶습니까? – dbn

답변

2

난 당신이 텍스트가 (당신이 직면 할 일이 어디든지)이 눌러 카메라에 직면 할 것인지 말에 수정,하지만 다음 고정 남아?

노드의 방향을 조정하는 데는 여러 가지 방법이 있습니다. 이 경우 단순히 텍스트 노드의 eulerAngles을 카메라의 텍스트 노드와 동일하게 설정하여 텍스트를 인스턴스화하는 것이 좋습니다. 당신의 addTag() 기능에

당신은 추가 ARKit에 기본이 가로 방향입니다 때문에 텍스트가 재미 나오는대로

let eulerAngles = self.sceneView.session.currentFrame?.camera.eulerAngles 
tagNode.eulerAngles = SCNVector3(eulerAngles.x, eulerAngles.y, eulerAngles.z + .pi/2) 

추가 .pi/2는, 텍스트가 올바른 방향으로 확인하기 위해이 . 이것은 로컬 z 축 주위로 회전을 적용합니다.

노드의 .localRotate()을 사용하거나 transform 속성에 액세스하는 것이 가능할 수도 있지만 위치와 eulerAngles를 모두 직접 조작하는 방식을 선호합니다.

희망이 도움이됩니다.

편집 : Float(1.57).pi/2으로 바꿉니다.

+2

'Float (1.57)'을'.pi/2'로 대체했습니다. 선명도를 더하기 – dbn

+1

고맙다, 단지 지금 회답해서 유감스럽게 생각한다, 나는 그럭저럭 noewdays를 얻을 수 있었다. – Tom

2

항상 텍스트가 카메라를 향하게하고 싶습니까? SCNBillboardConstraint은 당신의 친구입니다 :

tagNode.constraints = [SCNBillboardConstraint()] 
+0

나는 문제가되고있다. 나는 장면 파일에서 루트 노드의 서브 클래스 인 두 개의 SCNNode를 가지고 있으며이 SCNBillboardConstraint를 프로그래밍 방식으로이 "텍스트 노드"에 추가 할 때 화면에 양식이 사라집니다. FUNC의 addBillboardContraintsToText (객체 : VirtualObject)는 기하학 = node.geometry, geometry.isKind (의 할 경우 { 가드 storeNode = object.childNodes.first 다른 storeNode.childNodes { 에서 노드 { 반환 } 을 보자 : SCNText.self) { 노드.제약 조건 [SCNBillboardConstraint()] } } } – Cyupa

+0

@Cyupa 질문을 게시하시기 바랍니다. – rickster

+0

여기에 질문을 추가했습니다 : https://stackoverflow.com/questions/49194597/adding-a-scnbillboardconstraint-makes-the-node-dissapear – Cyupa

관련 문제