mjrehder - 1 year ago 435
Swift Question

SceneKit Object between two points

Given 2 points in 3D (a,b) and an SCNCapsule, SCNTorus, SCNTube etc.,
how to go about to position the object, so that the object starts at point a and ends at point b?

Code example in Swift or Objective-C would be appreciated.

From Moustachs answer I managed to do a 2-dimension solution:

``````var v1 = SCNVector3(x: Float(a.x), y: Float(a.y), z: 0.0)
var v2 = SCNVector3(x: Float(b.x), y: Float(b.y), z: 0.0)

let height = CGFloat(v1.distance(v2))
var capsule = SCNCapsule(capRadius: 0.1, height: height)

var node = SCNNode(geometry: capsule)

var midpoint = (v1 + v2) / 2.0

node.position = midpoint

var rotp = v2 - midpoint

let rotx = atan2( rotp.y, rotp.x )
node.eulerAngles = SCNVector3Make(0.0, 0.0, rotx)

``````

I know, that there are infinite many solutions for a complete 3D rotation, but I do not care about the third axis. Still, it seems that even the second axis rotation will not work for me. Maybe my math eludes me. Anyone can tell me how to get this code lifted up to 3D space?

(I am using Swift and Kim Pedersens SCNVector3Extensions: https://github.com/devindazzle/SCNVector3Extensions)

I've good news for you ! You can link two points and put a SCNNode on this Vector !

Take this and enjoy drawing line between two points !

``````class   CylinderLine: SCNNode
{
init( parent: SCNNode,//Needed to line to your scene
v1: SCNVector3,//Source
v2: SCNVector3,//Destination
radSegmentCount: Int, // Number of faces of the cylinder
color: UIColor )// Color of the cylinder
{
super.init()

//Calcul the height of our line
let  height = v1.distance(v2)

//set position to v1 coordonate
position = v1

//Create the second node to draw direction vector
let nodeV2 = SCNNode()

//define his position
nodeV2.position = v2

//Align Z axis
let zAlign = SCNNode()
zAlign.eulerAngles.x = CGFloat(M_PI_2)

//create our cylinder
cyl.firstMaterial?.diffuse.contents = color

//Create node with cylinder
let nodeCyl = SCNNode(geometry: cyl )
nodeCyl.position.y = CGFloat(-height/2)

//set constraint direction to our vector
constraints = [SCNLookAtConstraint(target: nodeV2)]
}

override init() {
super.init()
}
}
}

private extension SCNVector3{
let xd = receiver.x - self.x
let yd = receiver.y - self.y
let zd = receiver.z - self.z
let distance = Float(sqrt(xd * xd + yd * yd + zd * zd))

if (distance < 0){
return (distance * -1)
} else {
return (distance)
}
}
}
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download