コード例 #1
0
    Vector3 getInterpolationNormal(List <int> triIndexList, ref Vector3 movablePos, ref Vector3 headUp)
    {
        var triCount = triIndexList.Count;

        for (var i = 0; i < triCount; ++i)
        {
            var triIndex = triIndexList[i];
            int v0Index  = triangles[3 * triIndex];
            int v1Index  = triangles[3 * triIndex + 1];
            int v2Index  = triangles[3 * triIndex + 2];

            var v0 = vertices[v0Index];
            var v1 = vertices[v1Index];
            var v2 = vertices[v2Index];

            var parentPos = transform.position;
            v0 += parentPos;
            v1 += parentPos;
            v2 += parentPos;
            var N = GeometryTool.CalculateTriangleNormal(ref v0, ref v1, ref v2);

            // 擊中三角形所在的平面
            Vector3 hitPos;
            if (!GeometryTool.RayHitPlane(movablePos, -N, N, v0, out hitPos))
            {
                continue;
            }

            bool  isGetValue;
            float a, b, r;
            GeometryTool.CalculateBarycentricCoordinates(ref v0, ref v1, ref v2, ref hitPos, out isGetValue, out a, out b, out r);
            if (!isGetValue)
            {
                continue;
            }

            if (!GeometryTool.isInTriangle(a, b, r))
            {
                continue;
            }

            Debug.DrawLine(v0, v1, Color.red);
            Debug.DrawLine(v1, v2, Color.green);
            Debug.DrawLine(v2, v0, Color.blue);

            var n0 = normals[v0Index];
            var n1 = normals[v1Index];
            var n2 = normals[v2Index];

            Debug.DrawRay(v0, n0 * 5);
            Debug.DrawRay(v1, n1 * 5);
            Debug.DrawRay(v2, n2 * 5);

            var normal = GeometryTool.CalculateInterpolationValueByBarycentricCoordinates(ref n0, ref n1, ref n2, a, b, r);
            return(normal.normalized);
        }
        return(headUp);
    }
コード例 #2
0
    bool rayHitPlane(Vector3 from, Vector3 dir, SphereTerrain sTerrain, out Vector3 hitPoint)
    {
        if (!GeometryTool.RayHitPlane(from, dir, sTerrain.getPlaneNormal(), sTerrain.getPlanePoint(), out hitPoint))
        {
            return(false);
        }

        var localHitPoint = sTerrain.transform.InverseTransformPoint(hitPoint);
        var half          = 1023.0f * 0.5f;
        var inRect        = Mathf.Abs(localHitPoint.x) < half && Mathf.Abs(localHitPoint.z) < half;

        controller.hitOnPlane.position = inRect ? hitPoint : Vector3.zero;
        return(inRect);
    }
コード例 #3
0
    public bool DoClick(Vector3 from, Vector3 dir, out int floor, out int y, out int x, bool onlyUseVoxel = false)
    {
        floor = -1;
        x     = -1;
        y     = -1;

        bool hit = GeometryTool.RayHitPlane(from, dir, Vector3.up, transform.position + GetNowFlowerHeight(), out hitPoint);

        if (!hit)
        {
            return(false);
        }

        var voxel = GetHitVoxel(hitPoint);

        if (voxel == null)
        {
            return(false);
        }

        if (onlyUseVoxel)
        {
            if (!voxel.IsUse())
            {
                return(false);
            }
        }

        bool hitSphere = voxel.IsHit(hitPoint);

        if (!hitSphere)
        {
            return(false);
        }

        x     = voxel.x;
        y     = voxel.y;
        floor = voxel.floor;

        return(true);
    }