首页 > 解决方案 > 如何解决 ARKitSample 项目的子节点快照问题?

问题描述

我已经从 - https://github.com/xamarin/ios-samples/blob/master/ios11/ARKitSample/ARKitSample/GameViewController.cs下载了 ARKitSample 项目

运行代码后,它按预期工作,直到我点击屏幕,调用手势识别事件并且它第一次工作正常 - 我得到一个带有屏幕快照的平面节点。但是当第二次调用时,不是在第二次点击的位置创建一个新节点,而是与初始子节点重叠。

该代码是此处 ARKit 主题演讲中原始 swift 版本的一个端口 - https://youtu.be/LLRweyZ1KpA?t=1380

private void HandleTap(UIGestureRecognizer gestureRecognize)
{
    // Get current frame
    var currentFrame = SceneView.Session.CurrentFrame;
    if (currentFrame == null) return;

    // Create an image plane using a snapshot of the view
    var imagePlane = SCNPlane.Create(SceneView.Bounds.Width / 6000, SceneView.Bounds.Height / 6000);
    imagePlane.FirstMaterial.Diffuse.Contents = SceneView.Snapshot();
    imagePlane.FirstMaterial.LightingModelName = SCNLightingModel.Constant;

    // Create a plane node and add it to the scene
    var planeNode = SCNNode.FromGeometry(imagePlane);
    SceneView.Scene.RootNode.AddChildNode(planeNode);

    // Set transform of node to be 10cm in front of the camera
    var translation = SCNMatrix4.CreateTranslation(0, 0, 0.1f);
    var cameraTranslation = currentFrame.Camera.Transform.ToSCNMatrix4();
    planeNode.Transform = SCNMatrix4.Mult(cameraTranslation, translation);
}

我在 iPhone XS 和 7 上试过这个,我错过了什么明显的东西吗?

标签: c#xamarinxamarin.iosarkit

解决方案


该示例为您更改了节点的变换。如果你想改变节点的位置,你可以试试下面的代码:

var tapLocation = gestureRecognize.LocationInView(SceneView);
var hitTestResults = SceneView.HitTest(tapLocation, ARHitTestResultType.EstimatedHorizontalPlane);

var hitTestResult = hitTestResults.FirstOrDefault();
if (hitTestResult == null) return;
var position = new SCNVector3(hitTestResult.WorldTransform.Column3.X, hitTestResult.WorldTransform.Column3.Y, hitTestResult.WorldTransform.Column3.Z);
planeNode.Position = position;

推荐阅读