コード例 #1
0
    void Update()
    {
        HelperPhysics.Hit hit;
        Vector3           point1, point2;
        float             range = 0.3f;

        trans[0].RotateAround(Vector3.zero, Vector3.one, range);
        trans[1].RotateAround(Vector3.zero, -Vector3.one, range);
        trans[2].RotateAround(Vector3.zero, Vector3.one, range);
        trans[3].RotateAround(Vector3.zero, -Vector3.one, range);

        if (HelperPhysics.IntersectLineToLine(trans[0].position, trans[1].position, trans[2].position, trans[3].position, out hit, out point1, out point2))
        {
            point.gameObject.SetActive(true);
            point.position = hit.point;
        }
        else
        {
            point.gameObject.SetActive(false);
        }

        if (!float.IsNaN(Vector3.Dot(point1, point2)))
        {
            dot[0].gameObject.SetActive(true);
            dot[1].gameObject.SetActive(true);
            dot[0].position = point1;
            dot[1].position = point2;
        }
        else
        {
            dot[0].gameObject.SetActive(false);
            dot[1].gameObject.SetActive(false);
        }
    }
コード例 #2
0
    public void SetPoint(Octree.OctreeInfo info, Vector3 line2)
    {
        for (int i = 0; i < info.lsVertex.Count; i += 3)
        {
            Vector3 edge1 = info.GetWorldPosition(info.lsVertex[i]);
            Vector3 edge2 = info.GetWorldPosition(info.lsVertex[i + 1]);
            Vector3 edge3 = info.GetWorldPosition(info.lsVertex[i + 2]);

            HelperPhysics.Hit hit3;
            if (HelperPhysics.IntersectLineToTriangle(origin, line2, edge1, edge2, edge3, out hit3))
            {
                _point.position = hit3.point;
                _point.gameObject.SetActive(true);
                break;
            }
        }
    }
コード例 #3
0
    void Update()
    {
        _addTime += Time.deltaTime;
        if (_addTime > _changeTime)
        {
            _moveDir  = -_moveDir;
            _moveDir2 = -_moveDir2;
            _addTime  = 0.0f;
        }
        line[0].Translate(_moveDir * Time.deltaTime);
        line[1].Translate(_moveDir * Time.deltaTime);
        line[0].Translate(-_moveDir2 * Time.deltaTime);
        line[1].Translate(_moveDir2 * Time.deltaTime);

        polygon.transform.Rotate(Vector3.one * 1.0f);

        List <HelperPhysics.Hit> lsHit = new List <HelperPhysics.Hit>();

        for (int i = 0; i < lsTriPoint.Count; i += 3)
        {
            Vector3 edge1 = (polygon.rotation * Vector3.Scale(lsTriPoint[i], polygon.localScale) + polygon.position);
            Vector3 edge2 = (polygon.rotation * Vector3.Scale(lsTriPoint[i + 1], polygon.localScale) + polygon.position);
            Vector3 edge3 = (polygon.rotation * Vector3.Scale(lsTriPoint[i + 2], polygon.localScale) + polygon.position);

            HelperPhysics.Hit hit3;
            if (HelperPhysics.IntersectLineToTriangle(line[0].position, line[1].position, edge1, edge2, edge3, out hit3))
            {
                lsHit.Add(hit3);
            }
        }

        for (int i = 0; i < point.Length; ++i)
        {
            point[i].gameObject.SetActive(false);
        }

        for (int i = 0; i < lsHit.Count; ++i)
        {
            point[i].gameObject.SetActive(true);
            point[i].position = lsHit[i].point;
        }
    }
コード例 #4
0
    private bool BoxCast(Ray ray, Octree.OctreeInfo octreeInfo, Vector3 origin, Vector3 line2, out HelperPhysics.Hit hit)
    {
        hit = new HelperPhysics.Hit();
        for (int i = 0; i < _indexBuffers.Length; i += 3)
        {
            Vector3 edge1 = octreeInfo.GetVertexPosition(_boxVertices[_indexBuffers[i]]);
            Vector3 edge2 = octreeInfo.GetVertexPosition(_boxVertices[_indexBuffers[i + 1]]);
            Vector3 edge3 = octreeInfo.GetVertexPosition(_boxVertices[_indexBuffers[i + 2]]);

            HelperPhysics.Hit hit1;
            if (HelperPhysics.IntersectLineToTriangle(origin, line2, edge1, edge2, edge3, out hit1))
            {
                Vector3 dir1 = edge2 - edge1;
                Vector3 dir2 = edge3 - edge2;

                float dot = Vector3.Dot(ray.direction, Vector3.Cross(dir1, dir2));
                if (dot < 0.0f)
                {
                    hit = hit1;

                    if (octreeInfo.lsChild.Count <= 0)
                    {
                        _lsOctreeInfo.Add(octreeInfo);
                    }

                    for (int k = 0; k < octreeInfo.lsChild.Count; ++k)
                    {
                        HelperPhysics.Hit hit2;
                        if (BoxCast(ray, octreeInfo.lsChild[k], hit1.point, line2, out hit2))
                        {
                            hit = hit2;
                        }
                    }

                    return(true);
                }
            }
        }

        return(false);
    }
コード例 #5
0
        void AddVertex()
        {
            Vector3[] boxVertices  = octree._boxVertices;
            int[]     indexBuffers = octree._indexBuffers;
            Vector3[] checkPos     = new Vector3[indexBuffers.Length];
            for (int i = 0; i < indexBuffers.Length; i++)
            {
                checkPos[i] = GetVertexPosition(boxVertices[indexBuffers[i]]);
            }

            Vector3[] checkPos2 = new Vector3[6];
            checkPos2[0] = GetVertexPosition(new Vector3(-1, 0, 0));
            checkPos2[1] = GetVertexPosition(new Vector3(1, 0, 0));
            checkPos2[2] = GetVertexPosition(new Vector3(0, -1, 0));
            checkPos2[3] = GetVertexPosition(new Vector3(0, 1, 0));
            checkPos2[4] = GetVertexPosition(new Vector3(0, 0, -1));
            checkPos2[5] = GetVertexPosition(new Vector3(0, 0, 1));

            Mesh mesh = octree.GetComponent <MeshFilter>().mesh;

            Vector3[] vertices = mesh.vertices;
            int[]     tri      = mesh.triangles;

            for (int i = 0; i < tri.Length; i += 3)
            {
                Vector3 edge1 = vertices[tri[i]];
                Vector3 edge2 = vertices[tri[i + 1]];
                Vector3 edge3 = vertices[tri[i + 2]];
                for (int k = 0; k < checkPos.Length; k += 3)
                {
                    Vector3           ver1 = checkPos[k];
                    Vector3           ver2 = checkPos[k + 1];
                    Vector3           ver3 = checkPos[k + 2];
                    HelperPhysics.Hit hit;
                    if (HelperPhysics.IntersectLineToTriangle(ver1, ver2, edge1, edge2, edge3, out hit) ||
                        HelperPhysics.IntersectLineToTriangle(ver2, ver3, edge1, edge2, edge3, out hit) ||
                        HelperPhysics.IntersectLineToTriangle(ver3, ver1, edge1, edge2, edge3, out hit))
                    {
                        lsVertex.Add(edge1);
                        lsVertex.Add(edge2);
                        lsVertex.Add(edge3);
                    }
                }

                for (int k = 0; k < 3; ++k)
                {
                    Vector3 edge = vertices[tri[i + k]];
                    if (checkPos2[0].x <= edge.x && checkPos2[1].x >= edge.x &&
                        checkPos2[2].y <= edge.y && checkPos2[3].y >= edge.y &&
                        checkPos2[4].z <= edge.z && checkPos2[5].z >= edge.z)
                    {
                        Vector3 tri1 = mesh.vertices[tri[i]];
                        Vector3 tri2 = mesh.vertices[tri[i + 1]];
                        Vector3 tri3 = mesh.vertices[tri[i + 2]];
                        lsVertex.Add(tri1);
                        lsVertex.Add(tri2);
                        lsVertex.Add(tri3);
                        break;
                    }
                }
            }
        }