在 ARkit 中,有没有关于 FocusSquare Scene.How 的教程,可以通过类似于 ARHitCubeScene 的方式一键显示模型?

In ARkit Any tutorial for FocusSquare Scene.How to Show models with one touch similar to ARHitCubeScene?

我尝试在 Arkit 示例场景中做一个项目 FoucusSquare.In ArHitCubeTest 当我们触摸时,例如,如果我们添加一个立方体,当立方体成为 HitCubeParent.Similarily 的子级时,它将通过一次触摸来实例化在 FocusSquare Scene 中,我制作了 FoucusSquareFocused.When 的立方体子级,检测到平面它显示了立方体,否则我们看不到它,因为它是 tracking.So 一旦检测到平面,如何一键放置立方体屏幕类似于 ArHitCubeTest 示例。

与大多数问题一样,您可以通过多种方式解决此问题,请注意,我的回答仅提供了基本解决方案,并未考虑 FocusSquare 等的重新初始化。

在此示例中,一旦检测到 ARPlaneAnchor 就会放置一个模型,然后将其禁用。

首先,您可以将模型的 Transform 添加到 FocusSquare Class,例如:

//The Transform Of Our Model To Place
public Transform modelToPlace;

然后添加一个布尔值来判断我们的模型是否已经放置 e.g:

//Boolean Determining Whether Our Model Has Been Placed
public bool modelPlaced = false;

使用这两个变量的示例 FocusSquare Class 可能如下所示:

public class FocusSquare : MonoBehaviour {

public enum FocusState {
    Initializing,
    Finding,
    Found
}

public GameObject findingSquare;
public GameObject foundSquare;

//The Transform Of Our Model To Place
public Transform modelToPlace;

//Boolean Determining Whether Our Model Has Been Placed
public bool modelPlaced = false;

public float maxRayDistance = 30.0f;
public LayerMask collisionLayerMask;
public float findingSquareDist = 0.5f;

private FocusState squareState;
public FocusState SquareState { 
    get {
        return squareState;
    }
    set {
        squareState = value;
        foundSquare.SetActive (squareState == FocusState.Found);
        findingSquare.SetActive (squareState != FocusState.Found);
    } 
}

bool trackingInitialized;

//------------------
//MARK: - Life Cycle
//------------------

void Start () {
    SquareState = FocusState.Initializing;
    trackingInitialized = true;
}


void Update () {

    //If Our Model Hasnt Been Placed Continue Updating The Focus Square
    if (!modelPlaced) {

        Vector3 center = new Vector3 (Screen.width / 2, Screen.height / 2, findingSquareDist);
        var screenPosition = Camera.main.ScreenToViewportPoint (center);
        ARPoint point = new ARPoint {
            x = screenPosition.x,
            y = screenPosition.y
        };

        //We Only Want To Place A Model When The Focus Square Has Detected An ARPlance Acnhor
        ARHitTestResultType[] resultTypes = {
            ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent, 

        }; 

            foreach (ARHitTestResultType resultType in resultTypes) {
                if (HitTestWithResultType (point, resultType)) {
                    SquareState = FocusState.Found;
                    return;
                }
            }

            //No ARPlaneAnchor Has Been Detected So Continue Updating The Focus Square
            if (trackingInitialized) {
                SquareState = FocusState.Finding;


                if (Vector3.Dot (Camera.main.transform.forward, Vector3.down) > 0) {


                    findingSquare.transform.position = Camera.main.ScreenToWorldPoint (center);


                    Vector3 vecToCamera = findingSquare.transform.position - Camera.main.transform.position;


                    Vector3 vecOrthogonal = Vector3.Cross (vecToCamera, Vector3.up);


                    Vector3 vecForward = Vector3.Cross (vecOrthogonal, Vector3.up);


                    findingSquare.transform.rotation = Quaternion.LookRotation (vecForward, Vector3.up);

                } else {

                    findingSquare.SetActive (false);
                }

            }

        } else {

            //Our Model Has Been Placed So Disable The Focus Square
            findingSquare.SetActive (false);
            foundSquare.SetActive (false);

        }

    }


    /// Performs An SCNHitTest For Any Detected ARPlaneAnchore
    bool HitTestWithResultType (ARPoint point, ARHitTestResultType resultTypes)
    {
        List<ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface ().HitTest (point, resultTypes);
        if (hitResults.Count > 0) {
            foreach (var hitResult in hitResults) {

                foundSquare.transform.position = UnityARMatrixOps.GetPosition (hitResult.worldTransform);
                foundSquare.transform.rotation = UnityARMatrixOps.GetRotation (hitResult.worldTransform);
                Debug.Log (string.Format ("x:{0:0.######} y:{1:0.######} z:{2:0.######}", foundSquare.transform.position.x, foundSquare.transform.position.y, foundSquare.transform.position.z));

                //An ARPlaneAnchor Has Been Detected So Position Our Model & Set Our Boolean To Indicate It Has Been Placed
                if (!modelPlaced) {

                    modelToPlace.transform.position = UnityARMatrixOps.GetPosition (hitResult.worldTransform);
                    modelToPlace.transform.rotation = UnityARMatrixOps.GetRotation (hitResult.worldTransform);
                    modelPlaced = true;

                }

                return true;
            }
        }
        return false;
    }

}

希望这会为您指明正确的方向...