diff --git a/RealityMixer/Capture/Misc/CameraPoseSender.swift b/RealityMixer/Capture/Misc/CameraPoseSender.swift index e1e2ac6..082a5fb 100644 --- a/RealityMixer/Capture/Misc/CameraPoseSender.swift +++ b/RealityMixer/Capture/Misc/CameraPoseSender.swift @@ -236,3 +236,61 @@ final class TemporaryCalibrationStorage { self.calibration = calibration } } + +final class RotatingCamera { + + private weak var client: TCPClient? + + private let radiansPerSecond = .pi/12.0 + private let radius = 3.0 + private let height = 2.0 + private let center = Vector3(x: 0, y: 1.5, z: 0) + + private var currentAngle = 0.0 + + private var currentPosition: Vector3 { + .init(x: cos(currentAngle) * radius, y: height, z: sin(currentAngle) * radius) + } + + init(client: TCPClient) { + self.client = client + } + + private func sendCameraUpdate(pose: Pose) { + _ = client?.send(data: CameraPositionPayload(position: pose.position).data) + _ = client?.send(data: CameraRotationPayload(rotation: pose.rotation).data) + } + + private func lookAt(_ cameraPosition: Vector3, center: Vector3, up: Vector3 = Vector3(x: 0, y: 1, z: 0)) -> SCNMatrix4 { + let forward = (center - cameraPosition).normalized + let right = forward.cross(up).normalized + let updatedUp = right.cross(forward) + + return SCNMatrix4( + m11: Float(right.x), + m12: Float(right.y), + m13: Float(right.z), + m14: 0.0, + m21: Float(updatedUp.x), + m22: Float(updatedUp.y), + m23: Float(updatedUp.z), + m24: 0.0, + m31: Float(-forward.x), + m32: Float(-forward.y), + m33: Float(-forward.z), + m34: 0.0, + m41: 0.0, + m42: 0.0, + m43: 0.0, + m44: 1.0 + ) + } + + func update(elapsedTime: TimeInterval) { + currentAngle += elapsedTime * radiansPerSecond + let currentPosition = self.currentPosition + sendCameraUpdate( + pose: .init(position: currentPosition, rotation: Quaternion(rotationMatrix: lookAt(currentPosition, center: center))) + ) + } +} diff --git a/RealityMixer/Capture/ViewControllers/MixedRealityViewController.swift b/RealityMixer/Capture/ViewControllers/MixedRealityViewController.swift index 53dcda3..be9ed46 100644 --- a/RealityMixer/Capture/ViewControllers/MixedRealityViewController.swift +++ b/RealityMixer/Capture/ViewControllers/MixedRealityViewController.swift @@ -39,7 +39,8 @@ final class MixedRealityViewController: UIViewController { true } - private let cameraPoseSender: CameraPoseSender? +// private let cameraPoseSender: CameraPoseSender? + private let rotatingCamera: RotatingCamera init( client: TCPClient, @@ -48,7 +49,8 @@ final class MixedRealityViewController: UIViewController { self.client = client self.configuration = configuration self.factory = ARConfigurationFactory(mrConfiguration: configuration) - self.cameraPoseSender = CameraPoseSender(client: client) + self.rotatingCamera = RotatingCamera(client: client) +// self.cameraPoseSender = CameraPoseSender(client: client) super.init(nibName: String(describing: type(of: self)), bundle: Bundle(for: type(of: self))) } @@ -255,6 +257,8 @@ final class MixedRealityViewController: UIViewController { } @objc func update(with sender: CADisplayLink) { + let interval = sender.targetTimestamp - sender.timestamp + rotatingCamera.update(elapsedTime: interval) receiveData() oculusMRC?.update() } @@ -363,7 +367,7 @@ extension MixedRealityViewController: ARSessionDelegate { configureForeground(with: frame) first = false } else { - cameraPoseSender?.didUpdate(frame: frame) +// cameraPoseSender?.didUpdate(frame: frame) } }