6
votes

I'm trying to rotate a cube around its z-axis but I can't find how.

Is there a way in RealityKit to do this?

2
I'm not familiar with RealityKit, but in the documentation I see mention of a Transform component, which has a rotation property in quaternion form that presumably you can manipulate. Again though, I haven't used RealityKit, so I'm just venturing a guess based on the documentation. - scg
Thanks! Because of this I found the answer - Robbe Verhoest

2 Answers

12
votes

In RealityKit there are, at least, three ways to rotate an object around single axis.

In each example we rotate an object counterclockwise (CCW).


First approach:

let boxScene = try! Experience.loadBox()

boxScene.steelBox?.orientation = simd_quatf(angle: .pi/4,    /* 45 Degrees */
                                             axis: [0,0,1])  /* About Z axis */


Second approach:

boxScene.steelBox?.transform = Transform(pitch: 0, 
                                           yaw: 0, 
                                          roll: .pi/4)      /* Around Z axis */

pitch, yaw and roll are rotations about X, Y and Z axis expressed in radians.


Third approach:

let a: Float = cos(.pi/4)
let b: Float = sin(.pi/4)

let matrix = float4x4([ a, b, 0, 0 ],        /* column 0 */
                      [-b, a, 0, 0 ],        /* column 1 */
                      [ 0, 0, 1, 0 ],        /* column 2 */
                      [ 0, 0, 0, 1 ])        /* column 3 */

boxAnchor.steelBox?.setTransformMatrix(matrix, relativeTo: nil)

Visual representation of rotation matrix looks like this:

let a: Float = cos(.pi/4)
let b: Float = sin(.pi/4)

//  0  1  2  3
               
 |  a -b  0  0  |
 |  b  a  0  0  |
 |  0  0  1  0  |
 |  0  0  0  1  |
 └              ┘

If you wanna know more about Rotation Matrices, read this post.

1
votes

For people who are also searching for this you need to use transform and rotation. This needs a simd_quatf where you give the angle and the axis.

In my case i had to use this:

"object".transform.rotation = simd_quatf(angle: GLKMathDegreesToRadians(90), axis: SIMD3(x: 0, y: 0, z: 1))