Here is that tutorial… hopefully it still works:
The basic steps are:
Create a thick cloud nParticle system.
On nParticleShape turn on “compute rotation”.
On the shape under add dynamic attributes select general and create the attribute userVector1PP from the particle tab (or any useVectorPP).
Set this from the rotationPP. This could be done in an expression but one can also simply create a connection:
connectAttr nParticleShape1.rotationPP nParticleShape1.userVector1PP
Connect a particle sampler info userVector1PP to the texture rotate of the fluid shader.
connectAttr -f particleSamplerInfo1.userVector1PP npThickCloudFluid.textureRotate;
The rendered texture will now represent the current rotate value on the particle. This rotation will be affected by collisions if compute rotation is on. If there are no collisions you could also set the AngularVelocityPP to make the particle spin. This velocity will damp over time based on the rotation damp value. The angular velocity is defined as a vector where the direction of the vector represents the axis of rotation and the length the velocity of rotation. If you just want to directly set rotation values, and don’t need them computed for you, then you may wish to only have a userVector1PP array and set that directly(leave compute rotation off… no need for the rotationPP array or connection from it)