Как получить положение иерархии костей в сценическом наборе - PullRequest
0 голосов
/ 24 января 2019

Я хочу получить позицию кости для установки ограничений IK.Я пытаюсь преобразовать каждую позицию кости из ее родительской координаты в координату сцены, но результат неверен.

ниже приведен метод конвертации

func convertPositionToParentCoordinate(position: SCNVector3, until ancestor: SCNNode) -> SCNVector3 {
    var convertedPos = position
    if let selfParent = self.parent {
      convertedPos = self.convertPosition(position, to: selfParent)

      if selfParent != ancestor {
        convertedPos = selfParent.convertPositionToParentCoordinate(position: convertedPos, until: ancestor)
      }
    }
    return convertedPos
  }

показать кости

func showBones(isShown: Bool, bone: SCNNode,scale: Float){
    let xScale = CGFloat(bone.scale.x * scale)
    if isShown == true {
      if bone.geometry  == nil {
        bone.geometry = SCNBox(width: xScale*2, height: xScale, length: xScale, chamferRadius: 0) 
        var pos = bone.position
        // draw reference objects in scene (self) coordinate.
        pos = bone.convertPositionToParentCoordinate(position: pos, until: self)
        pos = SCNVector3(pos.x - 1, pos.y, pos.z)
        let refnode = SCNNode()
        refnode.geometry = SCNBox(width: xScale*2, height: xScale, length: xScale, chamferRadius: 0)
        refnode.position = pos
        self.addChildNode(refnode)

        if bone.name == "joint1" {
          let material = SCNMaterial()
          material.diffuse.contents = UIColor.red
          bone.geometry?.materials = [material]
          refnode.geometry?.materials = [material]
        }
        if bone.name == "joint2" {
          let material = SCNMaterial()
          material.diffuse.contents = UIColor.yellow
          bone.geometry?.materials = [material]
          refnode.geometry?.materials = [material]
        }
        if bone.name == "joint3" {
          let material = SCNMaterial()
          material.diffuse.contents = UIColor.green
          bone.geometry?.materials = [material]
          refnode.geometry?.materials = [material]
        }
        if bone.name == "joint4" {
          let material = SCNMaterial()
          material.diffuse.contents = UIColor.cyan
          bone.geometry?.materials = [material]
          refnode.geometry?.materials = [material]
        }
        if bone.name == "joint5" {
          let material = SCNMaterial()
          material.diffuse.contents = UIColor.blue
          bone.geometry?.materials = [material]
          refnode.geometry?.materials = [material]
        }
        if bone.name == "joint6" {
          let material = SCNMaterial()
          material.diffuse.contents = UIColor.purple
          bone.geometry?.materials = [material]
          refnode.geometry?.materials = [material]
        }
      }
    }else {
      let isBox = bone.geometry?.isKind(of: SCNBox.self)
      if isBox == true {
        bone.geometry = nil
      }
    }
  }

Результат, подобный этому , не может правильно конвертировать позицию

Я также пытаюсь использовать свойство wordPosition в кости или конвертировать с помощью transform, либо не работает.Как правильно преобразовать положение кости из ее локальной координаты в мировую координату?

Заранее спасибо

...