public override void CreateScene(CreateSimpleTerrainScene sceneSettings) { int2 size = new int2(2, 2); float3 scale = new float3(10, 1.0f, 10); NativeArray <float> heights = new NativeArray <float>(size.x * size.y * UnsafeUtility.SizeOf <float>(), Allocator.Temp); { heights[0] = 0; heights[1] = 0; heights[2] = 0; heights[3] = 0; } var collider = TerrainCollider.Create(heights, size, scale, TerrainCollider.CollisionMethod.VertexSamples); CreatedColliders.Add(collider); float3 position = new float3(15.0f, -1.0f, -5.0f); CreateTerrainBody(position, collider); // Mark this one CollisionResponse.None collider = TerrainCollider.Create(heights, size, scale, TerrainCollider.CollisionMethod.VertexSamples); collider.As <TerrainCollider>().Material.CollisionResponse = CollisionResponsePolicy.None; CreatedColliders.Add(collider); position = new float3(15.0f, -1.0f, 10.0f); CreateTerrainBody(position, collider); }
public static BlobAssetReference <Collider> GenerateRandomTerrain(ref Random rnd) { int2 size = rnd.NextInt2(2, 50); float3 scale = rnd.NextFloat3(0.1f, new float3(1, 10, 1)); int numSamples = size.x * size.y; var heights = new NativeArray <float>(numSamples, Allocator.Temp, NativeArrayOptions.UninitializedMemory); for (int i = 0; i < numSamples; i++) { heights[i] = rnd.NextFloat(0, 1); } // CollisionMethod.Vertices will fail the unit tests, because it is a low-quality mode // that produces inaccurate manifolds. For now we just test CollisionMethod.Triangles return(TerrainCollider.Create(heights, size, scale, TerrainCollider.CollisionMethod.Triangles)); }
protected override void Start() { float3 gravity = new float3(0, -9.81f, 0); base.init(gravity); // Make heightfield data NativeArray <float> heights; int2 size; float3 scale; bool simple = false; bool flat = false; bool mountain = false; if (simple) { size = new int2(2, 2); scale = new float3(1, 0.1f, 1); heights = new NativeArray <float>(size.x * size.y * UnsafeUtility.SizeOf <float>(), Allocator.Temp); heights[0] = 1; heights[1] = 0; heights[2] = 0; heights[3] = 1; } else { size = new int2(SizeX, SizeZ); scale = new float3(ScaleX, ScaleY, ScaleZ); float period = 50.0f; heights = new NativeArray <float>(size.x * size.y * UnsafeUtility.SizeOf <float>(), Allocator.Temp); for (int j = 0; j < size.y; j++) { for (int i = 0; i < size.x; i++) { float a = (i + j) * 2.0f * (float)math.PI / period; heights[i + j * size.x] = flat ? 0.0f : math.sin(a); if (mountain) { float fractionFromCenter = 1.0f - math.min(math.length(new float2(i - size.x / 2, j - size.y / 2)) / (math.min(size.x, size.y) / 2), 1.0f); float mountainHeight = math.smoothstep(0.0f, 1, fractionFromCenter) * 25.0f; heights[i + j * size.x] += mountainHeight; } } } } // static terrain Entity staticEntity; { bool createMesh = false; var collider = createMesh ? CreateMeshTerrain(heights, new int2(SizeX, SizeZ), new float3(ScaleX, ScaleY, ScaleZ)) : TerrainCollider.Create(heights, size, scale, Method); bool compound = false; if (compound) { var instances = new NativeArray <CompoundCollider.ColliderBlobInstance>(4, Allocator.Temp); for (int i = 0; i < 4; i++) { instances[i] = new CompoundCollider.ColliderBlobInstance { Collider = collider, CompoundFromChild = new RigidTransform { pos = new float3((i % 2) * scale.x * (size.x - 1), 0.0f, (i / 2) * scale.z * (size.y - 1)), rot = quaternion.identity } }; } collider = Unity.Physics.CompoundCollider.Create(instances); instances.Dispose(); } float3 position = new float3(size.x - 1, 0.0f, size.y - 1) * scale * -0.5f; staticEntity = CreateStaticBody(position, quaternion.identity, collider); } }
public void Execute() { var heights = new NativeArray <float>(16, Allocator.Temp); TerrainCollider.Create(heights, new int2(4, 4), new float3(1f), CollisionMethod).Release(); }
private BlobAssetReference <Collider> CreateCollider(ColliderType type) { int numMeshes = type == ColliderType.Compound ? 2 : 1; ColliderMeshes = new Mesh[numMeshes]; BlobAssetReference <Collider> collider = default; switch (type) { case ColliderType.Sphere: collider = SphereCollider.Create(new SphereGeometry { Center = float3.zero, Radius = 0.5f }); break; case ColliderType.Triangle: collider = PolygonCollider.CreateTriangle(k_TriangleVertices[0], k_TriangleVertices[1], k_TriangleVertices[2]); break; case ColliderType.Quad: collider = PolygonCollider.CreateQuad(k_QuadVertices[0], k_QuadVertices[1], k_QuadVertices[2], k_QuadVertices[3]); break; case ColliderType.Box: collider = BoxCollider.Create(new BoxGeometry { Center = float3.zero, Orientation = quaternion.identity, Size = new float3(1.0f), BevelRadius = 0.0f }); break; case ColliderType.Capsule: collider = CapsuleCollider.Create(new CapsuleGeometry { Vertex0 = new float3(0, -0.5f, 0), Vertex1 = new float3(0, 0.5f, 0), Radius = 0.5f }); break; case ColliderType.Cylinder: // TODO: need someone to add throw new NotImplementedException(); case ColliderType.Convex: // Tetrahedron NativeArray <float3> points = new NativeArray <float3>(k_TetraherdonVertices, Allocator.TempJob); collider = ConvexCollider.Create(points, ConvexHullGenerationParameters.Default, CollisionFilter.Default); points.Dispose(); break; case ColliderType.Compound: var child1 = SphereCollider.Create(new SphereGeometry { Center = float3.zero, Radius = 0.5f }); ChildrenColliders.Add(child1); var child2 = BoxCollider.Create(new BoxGeometry { Center = float3.zero, Orientation = quaternion.identity, Size = new float3(1.0f), BevelRadius = 0.0f }); ChildrenColliders.Add(child2); NativeArray <ColliderBlobInstance> childrenBlobs = new NativeArray <ColliderBlobInstance>(2, Allocator.TempJob); childrenBlobs[0] = new ColliderBlobInstance { Collider = child1, CompoundFromChild = new RigidTransform { pos = new float3(0.5f, 0, 0), rot = quaternion.identity } }; childrenBlobs[1] = new ColliderBlobInstance { Collider = child2, CompoundFromChild = new RigidTransform { pos = new float3(-0.5f, 0, 0), rot = quaternion.identity } }; ColliderMeshes[0] = SceneCreationUtilities.CreateMeshFromCollider(child1); ColliderMeshes[1] = SceneCreationUtilities.CreateMeshFromCollider(child2); collider = CompoundCollider.Create(childrenBlobs); childrenBlobs.Dispose(); break; case ColliderType.Mesh: // Tetrahedron mesh NativeArray <float3> meshVertices = new NativeArray <float3>(k_TetraherdonVertices, Allocator.TempJob); NativeArray <int3> meshTriangles = new NativeArray <int3>(k_TetrahedronMeshTriangles, Allocator.TempJob); collider = MeshCollider.Create(meshVertices, meshTriangles); meshVertices.Dispose(); meshTriangles.Dispose(); break; case ColliderType.Terrain: int2 size = 2; float3 scale = 1; Random rand = new Random(0x9739); int numSamples = size.x * size.y; var heights = new NativeArray <float>(numSamples, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); for (int i = 0; i < numSamples; i++) { heights[i] = rand.NextFloat(0, 1); } collider = TerrainCollider.Create(heights, size, scale, TerrainCollider.CollisionMethod.VertexSamples); heights.Dispose(); break; default: throw new System.NotImplementedException(); } if (ColliderType != ColliderType.Compound) { ColliderMeshes[0] = SceneCreationUtilities.CreateMeshFromCollider(collider); } return(collider); }