iOS RealityKit. Изменение перевода сущности вызывает неожиданное поведение

#swift #arkit #realitykit

Вопрос:

Я пытаюсь создать некоторый опыт AR.

Я загружаю модель с анимацией как сущность. Давайте назовем это Игрушкой. Я создаю привязку. Я прикрепляю Игрушку к якорю. До этого момента все работало отлично.

Я хочу, чтобы Игрушка двигалась в случайных направлениях. И это происходит в первый раз. Тогда становится интересно, позвольте мне поделиться своим кодом:

Первый метод использует недавно созданное преобразование для Игрушки с измененным переводом x, y, чтобы заставить игрушку двигаться, и это все.

 func walk(completion: @escaping () -> Void) {
        guard let robot = robot else {
            return
        }
        let currentTransform = robot.transform
        guard let path = randomPath(from: currentTransform) else {
            return
        }
        let (newTranslation , travelTime) = path
        
        let newTransform = Transform(scale: currentTransform.scale,
                                     rotation: currentTransform.rotation,
                                     translation: newTranslation)
        
        robot.move(to: newTransform, relativeTo: nil, duration: travelTime)

        DispatchQueue.main.asyncAfter(deadline: .now()   travelTime   1) {
            completion()
        }
    }
 

Мы получаем это новое преобразование из приведенного ниже метода.

 func randomPath(from currentTransform: Transform) -> (SIMD3<Float>, TimeInterval)? {
        // Get the robot's current transform and translation
        let robotTranslation = currentTransform.translation
        
        // Generate random distances for a model to cross, relative to origin
        let randomXTranslation = Float.random(in: 0.1...0.4) * [-1.0,1.0].randomElement()!
        let randomZTranslation = Float.random(in: 0.1...0.4) * [-1.0,1.0].randomElement()!
        
        // Create a translation relative to the current transform
        let relativeXTranslation = robotTranslation.x   randomXTranslation
        let relativeZTranslation = robotTranslation.z   randomZTranslation
        
        // Find a path
        var path = (randomXTranslation * randomXTranslation   randomZTranslation * randomZTranslation).squareRoot()
        
        // Path only positive
        if path < 0 { path = -path }
        
        // Calculate the time of walking based on the distance and default speed
        let timeOfWalking: Float = path / settings.robotSpeed

        // Based on old trasnlation calculate the new one
        let newTranslation: SIMD3<Float> = [relativeXTranslation,
                                            Float(0),
                                            relativeZTranslation]
        
        return (newTranslation, TimeInterval(timeOfWalking))
    }
 

Проблема в том, что значение Entity.transform.translation.y растет от 0 до некоторого случайного значения < 1. Всегда после второго вызова метода walk ().

Как вы можете видеть, каждый раз при вызове метода newTranslation устанавливает значение Y равным 0. И все же перевод игрушки: введите описание изображения здесь

У меня нет идей, любая помощь будет оценена по достоинству. Я могу поделиться всем кодом, если это необходимо.

Ответ №1:

Мне удалось устранить проблему, указав параметр relativeTo в качестве привязки игрушки:

 toy.move(to: newTransform, relativeTo: anchorEntity, duration: travelTime)