Come up with another whistle and implement it. A whistle is something that extends the use of one of the things you are already doing. It is part of the basic model construction, but extended or cloned and modified in an interesting way. Ask your TAs to make sure this whistle is valid.
Modify your particle system so that the particles' velocities get initialized with the velocity of the hierarchy component from which they are emitted. The particles may still have their own inherent initial velocity. For example, if your model is a helicopter with a cannon launching packages out if it, each package's velocity will need to be initialized to the sum of the helicopter's velocity and the velocity imparted by the cannon.
Particles rendered as points or spheres may not look that realistic. You can achieve more spectacular effects with a simple technique called billboarding. A billboarded quad (aka "sprite") is a textured square that always faces the camera. For full credit, you should load a texture with transparency, and use the Textured Material or your own Material that has alpha blending.
Use the billboarded quads you implemented above to render the following effects.
Each of these effects is worth one whistle provided you have put in a whistle
worth of effort making the effect look good.
Fire (You'll probably want to use
additive blending for your particle)
Snow (example)
Water
fountain (example)
Fireworks
(example)
Add baking to your particle system. For simulations that are expensive to process, some systems allow you to cache the results of a simulation. This is called "baking." After simulating once, the cached simulation can then be played back without having to recompute the particle properties at each time step. See this page for more information on how to implement particle baking (although, note that this is an old webpage that refers to a different project. The function names may not apply, but the general logic for integrating baking is still useful).
Euler's method is a very simple technique for solving the system of differential equations that defines particle motion. However, more powerful methods can be used to get better, more accurate results. Implement your simulation engine using a higher-order method such as the Runge-Kutta technique. ( Numerical Recipes, Sections 16.0, 16.1) has a description of Runge-Kutta and pseudo-code.
Add levers (seesaws, hinged doors).
Add object that are “alive”: actuated with “muscles”, and reacting to the external stimuli (e.g. when ball gets near start moving)
Make a game out of it, where the game gives you a start and goal, along with a half-finished Rube Goldberg machine. The goal for the player is to place certain given objects (springs, cloth, walls, etc.) in order for the ball to reach the goal. Note: The game must be fully playable and contained within a unity scene, which means when you press the “Unity play button”, the physical simulation shouldn't start, but instead the game should start. You must create a ui for allowing the player to place objects within the scene. Note: The player is not allowed to use the built in Unity scene editing tools playing the games, the placing of the objects must be contained withih the game.
Perform collision detection with more complicated shapes. For complex scenes, you can even use the accelerated ray tracer and ray casting to determine if a collision is going to occur. Credit will vary with the complexity shapes and the sophistication of the scheme used for collision detection.
Add flocking behaviors to your particles to simulate creatures moving in flocks, herds, or schools. A convincing way of doing this is called "boids" (see here for a short flocking guide, and here for a demo and for more information). For full credit, use a model for your creatures that makes it easy to see their direction and orientation (as a minimal example, you could show this with colored pyramids, oriented towards the direction in which the creatures are pointing). For up to one more bell, make a realistic creature model and have it move realistically according to its motion path. For example, a bird model would flap its wings to gain speed and rise in the air, and hold its wings outstretched when turning or gliding.
Incorporate rigid-body simulations into your program, so that you can correctly simulate collisions and response between rigid objects in your scene.