Ich versuche einen Kegel so umzuorientieren, dass er mit seiner Basis flach auf der Oberfläche einer Kugel sitzt, während ich ihn um die Kugel bewege.Wie finde ich die SCNMatrix4-Umwandlung, die einen SCNNode von einem Punkt auf einer Kugel in einen anderen verschoben hat?
Die Kugel ist Radius 4 und zentriert am Ursprung.
Ich habe versucht, die Quaternion für die Transformation abzuleiten, aber es scheint einfacher zu sein, die Pivot-Eigenschaft des Kegels selbst zu verwenden.
Ich kann es an einfachen Stellen auf den Achsen arbeiten, indem ich es durch bekannte Winkel rotiere, aber ich kann nicht herausfinden, wie man die Transformation vom Ortsvektor des Kegels ableitet. Ich denke, ich muss den Vektor nehmen, der die Standardausrichtung des Kegels und den Ortsvektor des Punkts auf der Oberfläche der Kugel darstellt, und die SCNMatrix4 ausarbeiten, die die Standardausrichtung in die neue, die ich brauche, umwandelt. Dann kann ich es verwenden, um den Drehpunkt des SCNNode zu transformieren. Ein Teil des Problems ist, dass ich nicht weiß, was die Standardausrichtung Vektor ist.
Dies ist, was ich bisher (es funktioniert nicht):
let distanceFromCentre = Float(4.0)
let newConeNode = SCNNode(geometry: SCNCone(topRadius: 0, bottomRadius: 0.5, height: 1.0))
let radialLocationVector = SCNVector3Make(0.0, 1.0, 1.0)
let radialLocationVectorMagnitude = pow((pow(radialLocationVector.x,2) + pow(radialLocationVector.y,2) + pow(radialLocationVector.z,2)),0.5)
let radialLocationUnitVector = SCNVector3Make(radialLocationVector.x/radialLocationVectorMagnitude, radialLocationVector.y/radialLocationVectorMagnitude, radialLocationVector.z/radialLocationVectorMagnitude)
let surfaceLocationVector = SCNVector3Make(radialLocationUnitVector.x*distanceFromCentre, radialLocationUnitVector.y*distanceFromCentre, radialLocationUnitVector.z*distanceFromCentre)
newConeNode.position = surfaceLocationVector
let nodePivotRotationMatrix = SCNMatrix4MakeRotation(0,radialLocationUnitVector.x, radialLocationUnitVector.y, radialLocationUnitVector.z) //This doesn't work
let nodePivotTranslationMatrix = SCNMatrix4MakeTranslation(0, -0.5, 0)
newConeNode.pivot = SCNMatrix4Mult(nodePivotRotationMatrix, nodePivotTranslationMatrix)
newConeNode.name = "MyCone"
newConeNode.geometry?.firstMaterial?.diffuse.contents = UIColor(red: 0.2, green: 0, blue: 0.8, alpha: 1.0)
scnView.scene?.rootNode.addChildNode(newConeNode)
Jede Hilfe dieses dankbar
erhielt