RealityKit——旋转一个实体会影响它的比例

RealityKit – Rotating an Entity affects its Scale

我正在使用 USDZ 文件加载实体。我想在加载实体后,我想永远旋转。我正在使用以下代码。

cancellable = ModelEntity.loadAsync(named: "toy_drummer").sink { [weak self] completion in
            if case let .failure(error) = completion {
                print("Unable to load model \(error)")
            }
            self?.cancellable?.cancel()
        } receiveValue: { entity in
            anchor.addChild(entity)
            arView.scene.addAnchor(anchor)
            let rotation = Transform(pitch: 0, yaw: .pi, roll: 0)
            entity.move(to: rotation,
                                    relativeTo: nil,
                                      duration: 15.0,
                                timingFunction: .linear)
        }

实体没有正确旋转,而是在缩放并变得越来越大。有什么想法吗?

您需要一个起始变换“点”和一个结束变换“点”。如果 referenceEntity (relativeTo) 参数的值等于 nil,则表示 relative to world space。由于旋转值和缩放使用相同的4x4 matrix槽,当模型旋转时,它的比例也会同时改变,如果比例有差异的话。

perpetual transform animation 使用一些 RealityKit 2.0 技巧。

Max Frazer 的 RealityUI 也很酷。

这是您的代码的正确版本:

import UIKit
import RealityKit
import Combine

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!
    var cancellable: Cancellable? = nil
    let anchor = AnchorEntity()

    override func viewDidLoad() {
        super.viewDidLoad()

        cancellable = ModelEntity.loadAsync(named: "drummer.usdz").sink { _ in
                self.cancellable?.cancel()
            } receiveValue: { entity in
                self.anchor.addChild(entity)
                self.arView.scene.addAnchor(self.anchor)
                    
                let rotation = Transform(pitch: 0, yaw: .pi, roll: 0)
                entity.move(to: rotation,
                    relativeTo: entity,
                      duration: 5.0,
                timingFunction: .linear)
            }
    }
}

几年前我做了一个 swift 包,RealityUI,它确实包括像连续旋转这样的动画:

https://github.com/maxxfrazer/RealityUI/wiki/Animations#spin

您只需要包含包,然后调用:

entity.ruiSpin(by: [0, 1, 0], period: 1)

文档在这里: https://maxxfrazer.github.io/RealityUI/Extensions/Entity.html#/s:10RealityKit6EntityC0A2UIE7ruiSpin2by6period5times10completionys5SIMD3VySfG_SdSiyycSgtF