I am not sure how to do it - but I can tell why it doesn't work this way. Slices in Rust are represented by what is known as wide pointers - pointers with twice the width as a regular one. The first 8 bytes (for a 64 bit machine) contains the pointer to the data, while the second contains the length of the slice. When you call transmute all that happens is that the "type" is forcibly changed, without touching the actual bits. So, the pointer to a f32 slice becomes a pointer to Vertex slice, while the length "field" is untouched.
So as far as I can tell, transmuting a slice will not work the way you want it to. You could try transmuting an array.
If you don't want that dependency or the bounds it requires, see how they implement it. In addition to handling the size difference like @RedDocMD mentioned, there is no guarantee that the wide pointer order is (data, length), or that the order of two different wide pointers is the same. Thus the use of from_raw_parts, len, size_of_val, etc. They also take care around zero-sized types, alignment, etc.