/// <summary> /// min(ax + by + cz + d) = min(ax) + min(by) + min(cz) + min(d) /// max(ax + by + cz + d) = max(ax) + max(by) + max(cz) + max(d) /// /// Prev_Box = [min, max] = [c - r, c + r] = [min(cx +- rx, cy +- ry, cz +- rz), max(cx +- rx, cy +- ry, cz +- rz)] /// Post_Box = [M(c-r), M(c+r)] = [min(M(cx +- rx, cy +- ry, cz +- rz, 1)), max(M(cx +- rx, cy +- ry, cz +- rz, 1))] /// =[min(M0(cx +- rx) + M1(cy +- ry) + M2(cz +- rz) + M3), max(M0(cx +- rx)+ M1(cy +- ry)+ M2(cz +- rz)+M3)] /// =[min(M0(cx +- rx)) + min(M1(cy +- ry)) + min(M2(cz +- rz)) + M3, max(M0(cx +- rx)) + max(M1(cy +- ry)) + max(M2(cz +- rz)) + M3] /// </summary> public void UpdateTransform() { ModelWorldMatrix = Drawer.transform.localToWorldMatrix; Vector3 xa = ModelWorldMatrix.GetColumn(0) * Model.Box.Min.x; Vector3 xb = ModelWorldMatrix.GetColumn(0) * Model.Box.Max.x; Vector3 ya = ModelWorldMatrix.GetColumn(1) * Model.Box.Min.y; Vector3 yb = ModelWorldMatrix.GetColumn(1) * Model.Box.Max.y; Vector3 za = ModelWorldMatrix.GetColumn(2) * Model.Box.Min.z; Vector3 zb = ModelWorldMatrix.GetColumn(2) * Model.Box.Max.z; Vector3 last = ModelWorldMatrix.GetColumn(3); float w = 1.0f / ModelWorldMatrix[3, 3]; Box.Min = w * (Vector3.Min(xa, xb) + Vector3.Min(ya, yb) + Vector3.Min(za, zb) + last); Box.Max = w * (Vector3.Max(xa, xb) + Vector3.Max(ya, yb) + Vector3.Max(za, zb) + last); Box.ToMidSize(); }