Exemple #1
0
    static bool Separated(Vector3[] vertsA, Vector3[] vertsB, Vector3 axis, Obb obb)
    {
        // Handles the cross product = {0,0,0} case
        if (axis == Vector3.zero)
        {
            return(false);
        }

        var aMin = float.MaxValue;
        var aMax = float.MinValue;
        var bMin = float.MaxValue;
        var bMax = float.MinValue;

        // Define two intervals, a and b. Calculate their min and max values
        for (var i = 0; i < 8; i++)
        {
            var aDist = Vector3.Dot(vertsA[i], axis);
            aMin = aDist < aMin ? aDist : aMin;
            aMax = aDist > aMax ? aDist : aMax;
            var bDist = Vector3.Dot(vertsB[i], axis);
            bMin = bDist < bMin ? bDist : bMin;
            bMax = bDist > bMax ? bDist : bMax;
        }

        // One-dimensional intersection test between a and b
        var longSpan = Mathf.Max(aMax, bMax) - Mathf.Min(aMin, bMin);
        var sumSpan  = aMax - aMin + bMax - bMin;

        return(longSpan >= sumSpan); // > to treat touching as intersection
    }
Exemple #2
0
        public static string CreateSvg(XdObjectJson xdObject, [CanBeNull] Obb obb)
        {
            var defs = new List <IDefElement>();
            var body = CreateSvgLine(xdObject, defs);

            body.Parameter.Transform = new Transform();
            if (obb != null)
            {
                var rootForCalc = new RootElement
                {
                    Defs = defs.ToArray(),
                    Body = body,
                    Size = null,
                };
                var bounds = CalcBounds(rootForCalc.ToSvg());
                if (bounds.width > 0.0001f && bounds.height > 0.0001f)
                {
                    body.Parameter.Transform.Value.Tx = -bounds.x;
                    body.Parameter.Transform.Value.Ty = -bounds.y;
                }
            }

            var root = new RootElement
            {
                Defs = defs.ToArray(),
                Body = body,
                Size = obb?.Size,
            };

            body.Parameter.Opacity = 1.0f;
            return(root.ToSvg());
        }
    private bool Separted(Obb _a, Obb _b, Vector3 _axis)
    {
        float _aMax = float.MinValue;
        float _aMin = float.MaxValue;

        float _bMax = float.MinValue;
        float _bMin = float.MaxValue;


        for (int i = 0; i < _a.vertices.Length; i++)
        {
            float _adist = Vector3.Dot(_a.vertices[i], _axis);
            _aMax = (_adist > _aMax) ? _adist : _aMax;
            _aMin = (_adist < _aMin) ? _adist : _aMin;

            float _bdist = Vector3.Dot(_b.vertices[i], _axis);
            _bMax = (_bdist > _bMax) ? _bdist : _bMax;
            _bMin = (_bdist < _bMin) ? _bdist : _bMin;
        }

        float total  = Mathf.Max(_aMax, _bMax) - Mathf.Min(_aMin, _bMin);
        float result = (_aMax - _aMin) + (_bMax - _bMin);

        return(total > result);
    }
Exemple #4
0
    static bool Intersects(Obb a, Obb b)
    {
        if (Separated(a.Vertices, b.Vertices, a.Right, a))
        {
            return(false);
        }
        if (Separated(a.Vertices, b.Vertices, a.Up, a))
        {
            return(false);
        }
        if (Separated(a.Vertices, b.Vertices, a.Forward, a))
        {
            return(false);
        }

        if (Separated(a.Vertices, b.Vertices, b.Right, a))
        {
            return(false);
        }
        if (Separated(a.Vertices, b.Vertices, b.Up, a))
        {
            return(false);
        }
        if (Separated(a.Vertices, b.Vertices, b.Forward, a))
        {
            return(false);
        }

        if (Separated(a.Vertices, b.Vertices, Vector3.Cross(a.Right, b.Right), a))
        {
            return(false);
        }
        if (Separated(a.Vertices, b.Vertices, Vector3.Cross(a.Right, b.Up), a))
        {
            return(false);
        }
        if (Separated(a.Vertices, b.Vertices, Vector3.Cross(a.Right, b.Forward), a))
        {
            return(false);
        }

        if (Separated(a.Vertices, b.Vertices, Vector3.Cross(a.Up, b.Right), a))
        {
            return(false);
        }
        if (Separated(a.Vertices, b.Vertices, Vector3.Cross(a.Up, b.Up), a))
        {
            return(false);
        }
        if (Separated(a.Vertices, b.Vertices, Vector3.Cross(a.Up, b.Forward), a))
        {
            return(false);
        }

        if (Separated(a.Vertices, b.Vertices, Vector3.Cross(a.Forward, b.Right), a))
        {
            return(false);
        }
        if (Separated(a.Vertices, b.Vertices, Vector3.Cross(a.Forward, b.Up), a))
        {
            return(false);
        }
        if (Separated(a.Vertices, b.Vertices, Vector3.Cross(a.Forward, b.Forward), a))
        {
            return(false);
        }

        return(true);
    }
Exemple #5
0
 protected void UpdateTranslation()
 {
     _TranslationCurrent = Vector3.TransformCoordinate(_Translation.MemberwiseMult(Scale), Obb.GetOrientation());
     Obb.Center          = Position + _TranslationCurrent;
 }
        public override (IComponent[], IAsset[]) Render(XdObjectJson xdObject, Obb obb, XdAssetHolder assetHolder)
        {
            var textParser = new TextObjectParser();

            return(textParser.Render(xdObject, obb, assetHolder));
        }
    private bool CheckCollision(Obb _a, Obb _b)
    {
        if (Separted(_a, _b, _a.up))
        {
            return(false);
        }
        if (Separted(_a, _b, _a.right))
        {
            return(false);
        }
        if (Separted(_a, _b, _a.forward))
        {
            return(false);
        }

        if (Separted(_a, _b, _b.up))
        {
            return(false);
        }
        if (Separted(_a, _b, _b.right))
        {
            return(false);
        }
        if (Separted(_a, _b, _b.forward))
        {
            return(false);
        }

        // 每個面的法向量不夠做檢查的情況(a跟b做外積)
        if (Separted(_a, _b, Vector3.Cross(_a.up, _b.up)))
        {
            return(false);
        }
        if (Separted(_a, _b, Vector3.Cross(_a.up, _b.right)))
        {
            return(false);
        }
        if (Separted(_a, _b, Vector3.Cross(_a.up, _b.forward)))
        {
            return(false);
        }

        if (Separted(_a, _b, Vector3.Cross(_a.right, _b.up)))
        {
            return(false);
        }
        if (Separted(_a, _b, Vector3.Cross(_a.right, _b.right)))
        {
            return(false);
        }
        if (Separted(_a, _b, Vector3.Cross(_a.right, _b.forward)))
        {
            return(false);
        }

        if (Separted(_a, _b, Vector3.Cross(_a.forward, _b.up)))
        {
            return(false);
        }
        if (Separted(_a, _b, Vector3.Cross(_a.forward, _b.right)))
        {
            return(false);
        }
        if (Separted(_a, _b, Vector3.Cross(_a.forward, _b.forward)))
        {
            return(false);
        }

        return(true);
    }