创新项目实训实践笔记-13

    技术2022-07-11  104

    创新项目实训实践笔记-13

    平面检测部分1-场景搭建场景移植场景搭建-上

    平面检测部分

    1-场景搭建

    场景移植

    我们前面已经完成了一个有关于图片检测的场景,这次我们为了减少改动的代码数量以及保留原有的UI组件,直接将该场景做一个备份,并命名为NoCardScene 我们进入我们刚刚备份的那个场景,将原来用于图片识别的物体删除(ImageController)

    场景搭建-上

    接着,我们在场景中新建一个Cube,并将其命名为DetectedPlaneVisualizer,同时为其挂上ARCore中的脚本DetectedPlaneVisualizer

    //----------------------------------------------------------------------- // <copyright file="DetectedPlaneVisualizer.cs" company="Google"> // // Copyright 2017 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // </copyright> //----------------------------------------------------------------------- namespace GoogleARCore.Examples.Common { using System.Collections.Generic; using GoogleARCore; using UnityEngine; /// <summary> /// Visualizes a single DetectedPlane in the Unity scene. /// </summary> public class DetectedPlaneVisualizer : MonoBehaviour { private DetectedPlane m_DetectedPlane; // Keep previous frame's mesh polygon to avoid mesh update every frame. private List<Vector3> m_PreviousFrameMeshVertices = new List<Vector3>(); private List<Vector3> m_MeshVertices = new List<Vector3>(); private Vector3 m_PlaneCenter = new Vector3(); private List<Color> m_MeshColors = new List<Color>(); private List<int> m_MeshIndices = new List<int>(); private Mesh m_Mesh; private MeshRenderer m_MeshRenderer; /// <summary> /// The Unity Awake() method. /// </summary> public void Awake() { m_Mesh = GetComponent<MeshFilter>().mesh; m_MeshRenderer = GetComponent<UnityEngine.MeshRenderer>(); } /// <summary> /// The Unity Update() method. /// </summary> public void Update() { if (m_DetectedPlane == null) { return; } else if (m_DetectedPlane.SubsumedBy != null) { Destroy(gameObject); return; } else if (m_DetectedPlane.TrackingState != TrackingState.Tracking) { m_MeshRenderer.enabled = false; return; } m_MeshRenderer.enabled = true; _UpdateMeshIfNeeded(); } /// <summary> /// Initializes the DetectedPlaneVisualizer with a DetectedPlane. /// </summary> /// <param name="plane">The plane to vizualize.</param> public void Initialize(DetectedPlane plane) { m_DetectedPlane = plane; m_MeshRenderer.material.SetColor("_GridColor", Color.white); m_MeshRenderer.material.SetFloat("_UvRotation", Random.Range(0.0f, 360.0f)); Update(); } /// <summary> /// Update mesh with a list of Vector3 and plane's center position. /// </summary> private void _UpdateMeshIfNeeded() { m_DetectedPlane.GetBoundaryPolygon(m_MeshVertices); if (_AreVerticesListsEqual(m_PreviousFrameMeshVertices, m_MeshVertices)) { return; } m_PreviousFrameMeshVertices.Clear(); m_PreviousFrameMeshVertices.AddRange(m_MeshVertices); m_PlaneCenter = m_DetectedPlane.CenterPose.position; Vector3 planeNormal = m_DetectedPlane.CenterPose.rotation * Vector3.up; m_MeshRenderer.material.SetVector("_PlaneNormal", planeNormal); int planePolygonCount = m_MeshVertices.Count; // The following code converts a polygon to a mesh with two polygons, inner polygon // renders with 100% opacity and fade out to outter polygon with opacity 0%, as shown // below. The indices shown in the diagram are used in comments below. // _______________ 0_______________1 // | | |4___________5| // | | | | | | // | | => | | | | // | | | | | | // | | |7-----------6| // --------------- 3---------------2 m_MeshColors.Clear(); // Fill transparent color to vertices 0 to 3. for (int i = 0; i < planePolygonCount; ++i) { m_MeshColors.Add(Color.clear); } // Feather distance 0.2 meters. const float featherLength = 0.2f; // Feather scale over the distance between plane center and vertices. const float featherScale = 0.2f; // Add vertex 4 to 7. for (int i = 0; i < planePolygonCount; ++i) { Vector3 v = m_MeshVertices[i]; // Vector from plane center to current point Vector3 d = v - m_PlaneCenter; float scale = 1.0f - Mathf.Min(featherLength / d.magnitude, featherScale); m_MeshVertices.Add((scale * d) + m_PlaneCenter); m_MeshColors.Add(Color.white); } m_MeshIndices.Clear(); int firstOuterVertex = 0; int firstInnerVertex = planePolygonCount; // Generate triangle (4, 5, 6) and (4, 6, 7). for (int i = 0; i < planePolygonCount - 2; ++i) { m_MeshIndices.Add(firstInnerVertex); m_MeshIndices.Add(firstInnerVertex + i + 1); m_MeshIndices.Add(firstInnerVertex + i + 2); } // Generate triangle (0, 1, 4), (4, 1, 5), (5, 1, 2), (5, 2, 6), (6, 2, 3), (6, 3, 7) // (7, 3, 0), (7, 0, 4) for (int i = 0; i < planePolygonCount; ++i) { int outerVertex1 = firstOuterVertex + i; int outerVertex2 = firstOuterVertex + ((i + 1) % planePolygonCount); int innerVertex1 = firstInnerVertex + i; int innerVertex2 = firstInnerVertex + ((i + 1) % planePolygonCount); m_MeshIndices.Add(outerVertex1); m_MeshIndices.Add(outerVertex2); m_MeshIndices.Add(innerVertex1); m_MeshIndices.Add(innerVertex1); m_MeshIndices.Add(outerVertex2); m_MeshIndices.Add(innerVertex2); } m_Mesh.Clear(); m_Mesh.SetVertices(m_MeshVertices); m_Mesh.SetTriangles(m_MeshIndices, 0); m_Mesh.SetColors(m_MeshColors); } private bool _AreVerticesListsEqual(List<Vector3> firstList, List<Vector3> secondList) { if (firstList.Count != secondList.Count) { return false; } for (int i = 0; i < firstList.Count; i++) { if (firstList[i] != secondList[i]) { return false; } } return true; } } }

    同时将其材质更改为网格材质(PlaneGrid,ARCore的材质包中提供) 并将其拖动到素材库中作为预制体保存起来

    Processed: 0.023, SQL: 9