model通过在a 的属性上设置材质的颜色ModelEntity,我可以更改对象的不透明度/alpha。但如何将其动画化呢?我的目标是使对象具有完全不透明度的动画,然后让它们淡入设定的不透明度,例如 50%。
有了SCNAction.fadeOpacityin ,这变得特别容易SCNNode。SceneKit
let fade = SCNAction.fadeOpacity(by: 0.5, duration: 0.5)
node.runAction(fade)
Run Code Online (Sandbox Code Playgroud)
AnEntity符合HasTransform,但这仅允许您对比例、位置和方向进行动画处理。与淡入或淡出之类的材质动画无关。如果您创建用于动画隐藏或显示的行为,则效果在 RealityComposer 中,但似乎没有类似的功能来HasTransform提供动画不透明度的功能。
我一直在文档中寻找一些东西,我的下一个想法本质上是创建一个自定义动画来替换这种行为,但它似乎应该可用,但我只是没有找到它。
在我的项目中,我只是包装了一个 ARView,设置了配置并在我的真实设备上运行它,当我启动应用程序 Xcode 时,打印出以下错误调试消息。
2021-10-08 17:59:06.476537+0800 RealityKit_Shell[8247:2500396] Metal GPU Frame Capture Enabled
2021-10-08 17:59:06.476699+0800 RealityKit_Shell[8247:2500396] Metal API Validation Enabled
2021-10-08 17:59:07.219091+0800 RealityKit_Shell[8247:2500396] [AssetTypes] Registering library (/System/Library/PrivateFrameworks/CoreRE.framework/default.metallib) that already exists in shader manager. Library will be overwritten.
2021-10-08 17:59:07.374894+0800 RealityKit_Shell[8247:2500396] [Assets] Resolving material name 'engine:BuiltinRenderGraphResources/AR/suFeatheringCreateMergedOcclusionMask.rematerial' as an asset path -- this usage is deprecated; instead provide a valid bundle
2021-10-08 17:59:07.395024+0800 RealityKit_Shell[8247:2500396] [Assets] Resolving material name 'engine:BuiltinRenderGraphResources/AR/arKitPassthrough.rematerial' as an asset path -- this usage is deprecated; instead provide a valid bundle …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我使用 ARKit 投影 3d 文件。我能够投影.dae和.obj格式化模型。
无论如何我可以加载.fbx文件吗?
我试图获得与他们父母相关的骨骼旋转,但我最终得到了非常奇怪的角度。
我已经尝试了所有方法,矩阵乘法、偏移、轴交换,但没有运气。

guard let bodyAnchor = anchor as? ARBodyAnchor else { continue }
let skeleton = bodyAnchor.skeleton
let jointTransforms = skeleton.jointLocalTransforms
for (i, jointTransform) in jointTransforms.enumerated() {
//RETRIEVE ANGLES HERE
}
Run Code Online (Sandbox Code Playgroud)
在//RETRIEVE ANGLES HERE我尝试过不同的方法:
let n = SCNNode()
n.transform = SCNMatrix4(jointTransform)
print(n.eulerAngles)
Run Code Online (Sandbox Code Playgroud)
在这次尝试中,我将JointTransformation设置为 a,SCNNode.transform以便我可以检索eulerAngles以使它们具有人类可读性并尝试了解发生了什么。
我开始工作一些关节,但我认为这纯粹是巧合或运气,因为其余的骨骼旋转非常奇怪。
在其他尝试中,我使用jointModelTransforms(模型,而不是本地)来获取它们,因此所有变换都相对于骨架的根骨骼。
用这种方法我做矩阵乘法是这样的:
LocalMatrix = Inverse(JointModelMatrix) * (ParentJointModelMatrix)
Run Code Online (Sandbox Code Playgroud)
为了获得相对于其父级的旋转,但同样的情况,一些骨骼旋转正常,其他旋转很奇怪。我敢打赌纯属巧合。
为什么我想要获得骨骼旋转?
我正在尝试使用我的手机构建一个 MoCap 应用程序,该应用程序将旋转传递给 Blender,尝试从中构建 .BVH 文件,以便我可以在 Blender 上使用它们。
这是我自己的装备:

我以前用 Kinect 做过这件事,但我已经尝试了好几天在 ARKit 3 上做到这一点,但没有运气:(
我尝试在视图控制器中创建两个视图,并同时运行它们,但这不起作用,ARView 超过了 ARSCNView,即使它没有连接到插座。然后我尝试将一个视图添加到另一个视图,但这也不起作用。
@IBOutlet var arView: ARView!
@IBOutlet var sceneView: ARSCNView!
Run Code Online (Sandbox Code Playgroud)
这对 ARView 来说是独立的:
let anchor = try! Glasses.loadScene()
arView.scene.anchors.append(anchor)
arView.session.run(ARFaceTrackingConfiguration())
Run Code Online (Sandbox Code Playgroud)
这适用于 ARSCNView,然后我跟踪委托函数中的所有内容
sceneView.session.run(ARFaceTrackingConfiguration())
sceneView.delegate = self
Run Code Online (Sandbox Code Playgroud)
这不起作用:
let ar = ARSCNView(frame: view.frame)
ar.delegate = self
ar.session.run(ARFaceTrackingConfiguration())
arView.addSubview(ar)
Run Code Online (Sandbox Code Playgroud)
这不起作用:
let ar = ARView(frame: view.frame)
let anchor = try! Glasses.loadScene()
ar.scene.anchors.append(anchor)
ar.session.run(ARFaceTrackingConfiguration())
sceneView.addSubview(ar)
Run Code Online (Sandbox Code Playgroud)
当我尝试将一个视图添加到另一个视图时,我注释掉了 session.run 调用,但这并没有什么区别。
使用 Realitykit,尝试将月球实体的材质更改为自定义 .jpg,然后点击屏幕以基于 hitTest 生成该对象。当我点击并在调试中收到以下错误时,没有任何显示:[Collision] Bad paramater (SphereRadius),value = 0.000000,passed to shape creation。
import UIKit
import RealityKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touchLocation = touches.first?.location(in: arView){
let hitTest = arView.hitTest(touchLocation)
if let hitResult = hitTest.first {
addObject(at: hitResult)
}
}
}
func addObject(at hitResult: CollisionCastHit) {
let moonAnchor = try! Galaxy.loadWorld()
let moon = moonAnchor.moon! as! ModelEntity
var material …Run Code Online (Sandbox Code Playgroud) 如何使用 RealityKit 在 3d 空间中的两点之间创建一条线?
Scenekit 中有在两点之间创建直线的示例,但是使用 RealityKit 基本上没有。
为了创建这条线,我创建了一个矩形模型实体并将其放置在我的第一个触摸点和当前触摸点之间。从这里开始,我需要做的就是旋转矩形以面向当前触摸点。但是,使用simd_quatf(from: to:)并不能按预期工作。
rectangleModelEntity.transform.rotation = simd_quatf(from: firstTouchedPoint,
to: currTouchedPoint)
Run Code Online (Sandbox Code Playgroud)
如果我触摸一个点,然后直接向下拖动,则矩形模型应该是第一个触摸点和当前触摸点之间的一条直线,但它保持水平并略有倾斜。
为了解决这个问题,我尝试获取我最初的水平线作为向量和从第一次触摸到当前触摸点的向量之间的角度
let startVec = currTouchedPoint - firstTouchedPoint
let endVec = endOfModelEntityPoint - modelEntityCenterPoint
let lengthVec = simd_length(cross(startVec, endVec))
let theta = atan2(lengthVec, dot(startVec, endVec))
Run Code Online (Sandbox Code Playgroud)
这给了我 3d 空间中两个向量之间的角度,这似乎是正确的,当我检查它时,当我在它们之间直接触摸和拖动时,它给了我 90 度。
问题是我不知道旋转它的轴应该是什么。由于这是 3d 空间,因此该线不需要位于 2d 平面上,当前触摸位置可以位于起始触摸位置的下方和前面。
rectangleModelEntity = simd_quatf(angle: theta, axis: ???)
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我什至不太确定上述是否是在两点之间创建一条线的正确解决方案。理论上,这是相当基本的,创建一个低高度/深度的矩形来模仿一条线,将其放置在起始点和当前触摸点的中心,然后旋转它以使其方向正确。
两个向量之间的上述度数的轴应该是什么?
有没有更好的方法使用 RealityKit/ARKit 在 3d 空间中的点之间创建两条线?
当我点击在 ARView 中加载模型时,我在运行时收到以下警告:警告(辅助线程):在 sdf/path.cpp 的第 859 行的 AppendProperty -- Can only append a property 'preliminary:anchoring:type' to a主要路径 (/) 警告(辅助线程):在 sdf/path.cpp 的第 859 行的 AppendProperty 中 -- 只能将属性“触发器”附加到主要路径 (/)
任何人都知道为什么我会收到此警告?所有的逻辑都在我的 ViewController 中:
import UIKit
import ARKit
import RealityKit
import SwiftUI
import Combine
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
private var modelArray: [String] = []
var selectedModel = ""
@IBOutlet weak var arView: ARView!
@IBOutlet weak var modelCollectionView: UICollectionView!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
loadModelName()
arView.session.delegate = self
setupARView()
//modelArray …Run Code Online (Sandbox Code Playgroud) 首先我想说,我是 SceneKit 新手,并且在 iOS 上使用 AR 环境。
我有一个 3D 模型对象,一辆货车,作为 Blender 文件(.blend)的一部分 --> 可以在这里找到它。
我将其从 Blender 导出为 .glb 文件 --> 可以在此处找到它。
然后我在 Reality Converter 应用程序中打开 .glb 文件,并将其导出为 .usdz 文件 --> 可以在此处找到它。
问题是当我在 XCode 中预览对象以及将其放置在 AR 中时,对象颜色是错误的。
Blender 对象有问题吗?如果是这样,我应该对其进行什么更改才能正确导出颜色?
我正在尝试使用 RealityKit 创建 AR 体验,但我发现默认情况下,实体在通过用户交互移动时会相互移动并重叠。
我想防止对象重叠并相互进入,这样当用户移动它们时,它们只是撞击/反弹而不会重叠。
我从 RealityComposer 文件中加载实体并将它们添加到场景中(在 catch 块中以及此简化版本中未显示的其他块中):
let entity = try Experience.loadBallSort()
anchorEntity.addChild(entity)
// anchorEntity is an AnchorEntity that is already attached to the scene
Run Code Online (Sandbox Code Playgroud)
我使用像这样的默认手势来启用用户交互,这就是导致对象重叠的方式,因为它们一旦触摸就不会停止:
arView.installGestures([.rotation, .translation], for: entity)
Run Code Online (Sandbox Code Playgroud)
在 Reality Composer 中,我启用了具有静态运动类型的物理功能,以及每个对象的默认物理材质/碰撞形状。我也尝试过generateCollisionShapes这样使用,但它不会改变碰撞的行为:
entity.generateCollisionShapes(recursive: true)
Run Code Online (Sandbox Code Playgroud)
如何防止 RealityKit 中的实体重叠?