swift: orient y-axis toward another point in 3-d space

后端 未结 1 1552
抹茶落季
抹茶落季 2020-12-06 15:55

Suppose you have two points in 3-D space. Call the first o for origin and the other t for target. The rotation axes of each are alligned with the w

相关标签:
1条回答
  • 2020-12-06 16:26

    Got it! Incredibly simple when you add a container node. The following seems to work for any positions in any quadrants.

    // pointAt_c is a container node located at, and child of, the originNode
    // pointAtNode is its child, position coincident with pointAt_c (and originNode)
    
    // get deltas (positions of target relative to origin)
    let dx = targetNode.position.x - originNode.position.x
    let dy = targetNode.position.y - originNode.position.y
    let dz = targetNode.position.z - originNode.position.z
    
    // rotate container node about y-axis (pointAtNode rotated with it)
    let y_angle = atan2(dx, dz)
    pointAt_c.rotation = SCNVector4(0.0, 1.0, 0.0, y_angle)
    
    // now rotate the pointAtNode about its z-axis
    let dz_dx = sqrt((dz * dz) + (dx * dx))
    
    // (due to rotation the adjacent side of this angle is now a hypotenuse)
    let x_angle = atan2(dz_dx, dy)
    pointAtNode.rotation =  SCNVector4(1.0, 0.0, 0.0, x_angle)
    

    I needed this to replace lookAt constraints which cannot, easily anyway, be archived with a node tree. I'm pointing the y-axis because that's how SCN cylinders and capsules are directed.

    If anyone knows how to obviate the container node please do tell. Everytime I try to apply sequential rotations to a single node, the last overwrites the previous one. I haven't the knowledge to formulate a rotation expression to do it in one shot.

    0 讨论(0)
提交回复
热议问题