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 }
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); }
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); }
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); }