diff --git a/lib/rbx_loader/src/loader.rs b/lib/rbx_loader/src/loader.rs
index 11a0448..bef9d8d 100644
--- a/lib/rbx_loader/src/loader.rs
+++ b/lib/rbx_loader/src/loader.rs
@@ -102,6 +102,7 @@ pub enum MeshType<'a>{
 	Union{
 		mesh_data:&'a [u8],
 		physics_data:&'a [u8],
+		size_float_bits:[u32;3],
 	},
 }
 #[derive(Hash,Eq,PartialEq)]
@@ -120,9 +121,14 @@ impl MeshIndex<'_>{
 		content:&'a str,
 		mesh_data:&'a [u8],
 		physics_data:&'a [u8],
+		size:&rbx_dom_weak::types::Vector3,
 	)->MeshIndex<'a>{
 		MeshIndex{
-			mesh_type:MeshType::Union{mesh_data,physics_data},
+			mesh_type:MeshType::Union{
+				mesh_data,
+				physics_data,
+				size_float_bits:[size.x.to_bits(),size.y.to_bits(),size.z.to_bits()]
+			},
 			content,
 		}
 	}
@@ -146,8 +152,9 @@ impl<'a> Loader for MeshLoader<'a>{
 				let data=read_entire_file(file_name)?;
 				crate::mesh::convert(RobloxMeshBytes::new(data))?
 			},
-			MeshType::Union{mut physics_data,mut mesh_data}=>{
+			MeshType::Union{mut physics_data,mut mesh_data,size_float_bits}=>{
 				// decode asset
+				let size=glam::Vec3::from_array(size_float_bits.map(f32::from_bits));
 				if !index.content.is_empty()&&(physics_data.is_empty()||mesh_data.is_empty()){
 					let RobloxAssetId(asset_id)=index.content.parse()?;
 					let file_name=format!("unions/{}",asset_id);
@@ -169,9 +176,9 @@ impl<'a> Loader for MeshLoader<'a>{
 							mesh_data=data.as_ref();
 						}
 					}
-					crate::union::convert(physics_data,mesh_data)?
+					crate::union::convert(physics_data,mesh_data,size)?
 				}else{
-					crate::union::convert(physics_data,mesh_data)?
+					crate::union::convert(physics_data,mesh_data,size)?
 				}
 			},
 		};
diff --git a/lib/rbx_loader/src/rbx.rs b/lib/rbx_loader/src/rbx.rs
index 72d0891..c54d95a 100644
--- a/lib/rbx_loader/src/rbx.rs
+++ b/lib/rbx_loader/src/rbx.rs
@@ -554,7 +554,7 @@ pub fn convert<'a>(
 					object.properties.get("CanCollide"),
 				)
 			{
-				let mut model_transform=planar64_affine3_from_roblox(cf,size);
+				let model_transform=planar64_affine3_from_roblox(cf,size);
 
 				if model_transform.matrix3.det().is_zero(){
 					let mut parent_ref=object.parent();
@@ -716,9 +716,6 @@ pub fn convert<'a>(
 						panic!("Mesh has no Mesh or Texture");
 					},
 					Shape::PhysicsData=>{
-						//The union mesh is sized already
-						model_transform=planar64_affine3_from_roblox(cf,&rbx_dom_weak::types::Vector3{x:2.0,y:2.0,z:2.0});
-
 						let mut content="";
 						let mut mesh_data:&[u8]=&[];
 						let mut physics_data:&[u8]=&[];
@@ -732,7 +729,7 @@ pub fn convert<'a>(
 							physics_data=data.as_ref();
 						}
 						let part_texture_description=get_texture_description(&mut temp_objects,render_config_deferred_loader,dom,object,size);
-						let mesh_index=MeshIndex::union(content,mesh_data,physics_data);
+						let mesh_index=MeshIndex::union(content,mesh_data,physics_data,size);
 						let mesh_id=mesh_deferred_loader.acquire_mesh_id(mesh_index);
 						(MeshAvailability::DeferredUnion(part_texture_description),mesh_id)
 					},
diff --git a/lib/rbx_loader/src/union.rs b/lib/rbx_loader/src/union.rs
index 644372e..331806e 100644
--- a/lib/rbx_loader/src/union.rs
+++ b/lib/rbx_loader/src/union.rs
@@ -52,7 +52,7 @@ impl MeshDataNormalChecker{
 }
 
 impl std::error::Error for Error{}
-pub fn convert(roblox_physics_data:&[u8],roblox_mesh_data:&[u8])->Result<model::Mesh,Error>{
+pub fn convert(roblox_physics_data:&[u8],roblox_mesh_data:&[u8],size:glam::Vec3)->Result<model::Mesh,Error>{
 	const NORMAL_FACES:usize=6;
 	let mut polygon_groups_normal_id=vec![Vec::new();NORMAL_FACES];
 
@@ -131,12 +131,12 @@ pub fn convert(roblox_physics_data:&[u8],roblox_mesh_data:&[u8])->Result<model::
 				mesh.vertices.get(vertex_id0.0 as usize).ok_or(Error::MissingVertexId(vertex_id0.0))?,
 				mesh.vertices.get(vertex_id1.0 as usize).ok_or(Error::MissingVertexId(vertex_id1.0))?,
 				mesh.vertices.get(vertex_id2.0 as usize).ok_or(Error::MissingVertexId(vertex_id2.0))?,
-			];
-			let vertex_norm=(glam::Vec3::from_slice(face[1])-glam::Vec3::from_slice(face[0]))
-			          .cross(glam::Vec3::from_slice(face[2])-glam::Vec3::from_slice(face[0])).to_array();
-			let normal=mb.acquire_normal_id(vec3::try_from_f32_array(vertex_norm).map_err(Error::Planar64Vec3)?);
-			face.into_iter().map(|&vertex_pos|{
-				let pos=mb.acquire_pos_id(vec3::try_from_f32_array(vertex_pos).map_err(Error::Planar64Vec3)?);
+			].map(|v|glam::Vec3::from_slice(v)/size);
+			let vertex_norm=(face[1]-face[0])
+			          .cross(face[2]-face[0]);
+			let normal=mb.acquire_normal_id(vec3::try_from_f32_array(vertex_norm.to_array()).map_err(Error::Planar64Vec3)?);
+			face.into_iter().map(|vertex_pos|{
+				let pos=mb.acquire_pos_id(vec3::try_from_f32_array(vertex_pos.to_array()).map_err(Error::Planar64Vec3)?);
 				Ok(mb.acquire_vertex_id(IndexedVertex{pos,tex,normal,color}))
 			}).collect()
 		}).collect::<Result<_,_>>()?)))