gpt4 book ai didi

ios - 将 3D 对象与 estametedVerticalPlane 检测到的垂直平面平行对齐

转载 作者:行者123 更新时间:2023-11-28 23:31:43 25 4
gpt4 key购买 nike

我有这本书,但我目前正在重新混合 AR/VR 周免费视频教程中的家具应用程序。

我想让 3D 墙 Canvas 与检测到的墙/垂直平面对齐。

事实证明这比我想象的要难。定位不是问题。与家具放置应用程序非常相似,您只需获取 hittest.worldtransform 的 column3 并提供新几何图形 this vector3 作为位置。

但我不知道我必须做什么才能让我的 3D 对象在对齐的检测平面上旋转以面向前方。因为我有一个 Canvas 对象,所以照片位于 Canvas 的一侧。放置时,照片始终背对着。

我考虑过对 Canvas 应用任意旋转以面向前方,但只有当我向北看并将 Canvas 放在我右边的墙上时,这才是正确的。

我已经在线尝试了很多解决方案,但始终使用 .existingPlaneUsingExtent 的解决方案除外。用于垂直平面检测。这允许您从hittest.anchor?作为 ARPlaneAnchor。如果您在使用 .estimatedVerticalPlane anchor 时尝试这样做?是 nil

我也没有继续沿着这条路线前进,因为我的水平 3D 对象开始被放置在空中。这可能归结为控制流逻辑,但我忽略了它,直到垂直 Canvas 放置起作用。

我目前的思路是获取 Canvas 的正面矢量并将其旋转到检测到的垂直平面 UIImage 或命中点的正面矢量。

我如何从 3D 点获得前向矢量。或者从网格图像中获取前矢量,即当 ARKit 检测到垂直墙时作为叠加层放置的 UIImage

这是一个例子。 Canvas 显示 Canvas 的背面,并且与检测到的垂直平面(即柱)不平行。但是有一个“在此处放置海报”网格,我希望 Canvas 与之对齐并且我能够看到照片。

canvasback

我尝试过的东西。使用 .estimatedVerticalPlane ARKit estimatedVerticalPlane hit test get plane rotation

我不知道如何正确应用这个矩阵和 SO 答案的欧拉角结果。

我的添加图片功能。

func addPicture(hitTestResult: ARHitTestResult) {
// I would like to convert estimate hitTest to a anchorpoint
// it is easier to rotate a node to a anchorpoint over calculating eularAngles
// we have all detected anchors in the _Renderer SCNNode. however there are

// Get the current furniture item, correct its position if necessary,
// and add it to the scene.
let picture = pictureSettings.currentPicturePiece()

//look for the vertical node geometry in verticalAnchors
if let hitPlaneAnchor = hitTestResult.anchor as? ARPlaneAnchor {
if let anchoredNode = verticalAnchors[hitPlaneAnchor]{
//code removed as a .estimatedVerticalPlane hittestResult doesn't get here
}
}else{
// Transform hitresult to world coords
let worldTransform = hitTestResult.worldTransform
let anchoredNodeOrientation = worldTransform.eulerAngles
picture.rotation.y =
-.pi * anchoredNodeOrientation.y
//set the transform matirs
let positionMatris = worldTransform.columns.3
let position = SCNVector3 (
positionMatris.x,
positionMatris.y,
positionMatris.z
)
picture.position = position + pictureSettings.currentPictureOffset();

}
//parented to rootNode of the scene
sceneView.scene.rootNode.addChildNode(picture)
}

感谢您提供的任何帮助。

编辑:我注意到“手感”或 3D 模型不正确/相反?正 Z 指向左侧,正 X 正对着相机,因为我期望的是模型的正面。这是个问题吗?

最佳答案

您应该尽量避免使用世界坐标将节点直接添加到场景中。相反,您应该通过添加 ARAnchor 通知感兴趣区域的 ARSession,然后使用 session 回调为添加的 anchor 提供 SCNNode

例如,您的 HitTest 可能类似于:

@objc func tapped(_ sender: UITapGestureRecognizer) {
let location = sender.location(in: sender.view)
guard let hitTestResult = sceneView.hitTest(location, types: [.existingPlaneUsingGeometry, .estimatedVerticalPlane]).first,
let planeAnchor = hitTestResult.anchor as? ARPlaneAnchor,
planeAnchor.alignment == .vertical else { return }
let anchor = ARAnchor(transform: hitTestResult.worldTransform)
sceneView.session.add(anchor: anchor)
}

此处,识别的点击手势用于检测 ARSCNView 内的点击。当检测到轻敲时,将执行 HitTest 以查找现有的和估计的平面。如果平面是垂直的,我们添加一个 ARAnchor 并添加 HitTest 结果的 worldTransform,并将该 anchor 添加到 ARSession .这会将那个点注册为 ARSession 的感兴趣区域,因此在我们的内容添加到那里后,我们将获得更好的跟踪和更少的漂移。

接下来,我们需要为新添加的 ARAnchor 出售我们的 SCNNode。例如

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
if anchor is ARPlaneAnchor {
let anchorNode = SCNNode()
anchorNode.name = "anchor"
return anchorNode
} else {
let plane = SCNPlane(width: 0.67, height: 1.0)
plane.firstMaterial?.diffuse.contents = UIImage(named: "monaLisa")
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles = SCNVector3(CGFloat.pi * -0.5, 0.0, 0.0)
let node = SCNNode()
node.addChildNode(planeNode)
return node
}
}

在这里,我们首先检查 anchor 是否是 ARPlaneAnchor。如果是,我们会提供一个空节点用于调试目的。如果不是,则它是作为 HitTest 结果添加的 anchor 。因此,我们为最近的点击创建一个几何体和节点。因为它是一个垂直平面,并且我们的内容是平放的,所以需要绕 x 轴旋转它。因此我们调整它的 eulerAngles 使其直立。如果我们要直接返回 planeNode,则对 eulerAngles 的调整将被删除,因此我们将其添加为空节点的子节点并返回。

应该会产生如下所示的结果。

Screencast

关于ios - 将 3D 对象与 estametedVerticalPlane 检测到的垂直平面平行对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56246232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com