当您移动相机(手机)时,对象也会随之移动 (ARKit)



我正在使用ARKit插件开发Unity 3D。重制标准场景示例。我的任务是把飞机模型放回家(仍然很大(。但是当我创建一个大对象时,它不会固定在平面上,而是随着相机移动。我该怎么做才能让他留在原地? 放置小物体时没有问题。

using System;
using System.Collections.Generic;
using UnityEngine.EventSystems;

namespace UnityEngine.XR.iOS
{
public class UnityARHitTestExample : MonoBehaviour
{
public Transform m_HitTransform;
public float maxRayDistance = 30.0f;
public LayerMask collisionLayer = 1 << 10;  //ARKitPlane layer
public GameObject home;
private bool isDetecting;
bool HitTestWithResultType (ARPoint point, ARHitTestResultType 
resultTypes)
{
List<ARHitTestResult> hitResults = 
UnityARSessionNativeInterface.GetARSessionNativeInterface 
().HitTest (point, resultTypes);
if (hitResults.Count > 0) {
foreach (var hitResult in hitResults) {
Debug.Log ("Got hit!");
m_HitTransform.position = 
UnityARMatrixOps.GetPosition (hitResult.worldTransform);
m_HitTransform.rotation = 
UnityARMatrixOps.GetRotation (hitResult.worldTransform);
Debug.Log (string.Format ("x:{0:0.######} y: 
{1:0.######} z:{2:0.######}", m_HitTransform.position.x, 
m_HitTransform.position.y, m_HitTransform.position.z));
return true;
}
}
return false;
}
public void Start()
{
isDetecting = true;
}
// Update is called once per frame
void Update()
{
#if UNITY_EDITOR   
if (Input.GetMouseButtonDown(0))
{
Ray ray = 
Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
home.SetActive(true);
//we'll try to hit one of the plane collider 
gameobjects that were generated by the plugin
//effectively similar to calling HitTest with 
ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent
if (Physics.Raycast(ray, out hit, maxRayDistance, 
collisionLayer))
{
m_HitTransform.position = hit.point;
Debug.Log(string.Format("x:{0:0.######} y: 
{1:0.######} z:{2:0.######}", m_HitTransform.position.x, 
m_HitTransform.position.y, m_HitTransform.position.z));
m_HitTransform.rotation = hit.transform.rotation;
}
}
#else
if (Input.touchCount > 0 && m_HitTransform != null)
{
var touch = Input.GetTouch(0);
if ((touch.phase == TouchPhase.Began || touch.phase == 
TouchPhase.Moved) && isDetecting == true)
{
var screenPosition = 
Camera.main.ScreenToViewportPoint(touch.position);
ARPoint point = new ARPoint {
x = screenPosition.x,
y = screenPosition.y
};
home.SetActive(true);
// prioritize reults types
ARHitTestResultType[] resultTypes = {
//ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingGeometry,
ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent, 
//ARHitTestResultType.ARHitTestResultTypeExistingPlane,
ARHitTestResultType.ARHitTestResultTypeEstimatedHorizontalPlane, 
//ARHitTestResultType.ARHitTestResultTypeEstimatedVerticalPlane, 
ARHitTestResultType.ARHitTestResultTypeFeaturePoint
}; 
foreach (ARHitTestResultType resultType in 
resultTypes)
{
if (HitTestWithResultType (point, resultType))
{
return;
}
}
isDetecting = false;
}
}
#endif
}

}
}

这可能只是因为您的对象实际上"落后于"场景中的真实内容(墙壁、地面等(。

因为ARKit(和ARCore(没有遮挡,如果你把东西放在墙后面,那么它实际上只会出现在墙上。

这样做的结果是您的内容看起来像是在移动!这可能会发生很多,而且很烦人。

要进行测试,请尝试在非常大的户外空间中加载模型。

(请注意,我没有正确阅读您的代码,因此其他人可能会发现错误,但这仍然是可能导致它的合法原因。

最新更新