/// <summary> /// Interseccion Ray-OBB. /// Devuelve true y el punto q de colision si hay interseccion. /// </summary> public static bool intersectRayObb(TgcRay ray, TgcObb obb, out Vector3 q) { //Transformar Ray a OBB-space Vector3 a = ray.Origin; Vector3 b = ray.Origin + ray.Direction; a = obb.toObbSpace(a); b = obb.toObbSpace(b); TgcRay.RayStruct ray2 = new TgcRay.RayStruct(); ray2.origin = a; ray2.direction = Vector3.Normalize(b - a); //Crear AABB que representa al OBB Vector3 min = -obb.Extents; Vector3 max = obb.Extents; TgcBoundingBox.AABBStruct aabb = new TgcBoundingBox.AABBStruct(); aabb.min = min; aabb.max = max; //Hacer interseccion Ray-AABB if (TgcCollisionUtils.intersectRayAABB(ray2, aabb, out q)) { //Pasar q a World-Space q = obb.toWorldSpace(q); return true; } return false; }