This is quite easy to do. First get the position of each particle, then get the position of the location you want the particles to point to. From this you can calculate the aim direction thus:
aimPP = targetPosition - position
To get this done in Maya, follow these steps:
1. On your particle object, create a new per-particle vector attributes, called aimPP.
2. Create an expression on the particle:
//
// CREATION EXPRESSION
//
float $targetX = targetLocation.translateX;
float $targetY = targetLocation.translateY;
float $targetZ = targetLocation.translateZ;
vector $targetPosition = <<$targetX, $targetY, $targetZ>>;
aimPP = $targetPosition - position;
spriteTwistPP = rand(-0.25, 0.25);
spriteTwistPP = rand(-0.25, 0.25);
// RUNTIME BEFORE DYNAMICS EXPRESSION
//
float $targetX = targetLocation.translateX;
float $targetY = targetLocation.translateY;
float $targetZ = targetLocation.translateZ;
vector $targetPosition = <<$targetX, $targetY, $targetZ>>;
aimPP = $targetPosition - position;
aimUpAxisPP = << 0, sin(frame*spriteTwistPP), cos(frame*spriteTwistPP) >>;
aimUpAxisPP = << 0, sin(frame*spriteTwistPP), cos(frame*spriteTwistPP) >>;
Now, I was expecting
vector $targetPosition = targetLocation.translate;
to work, but for some reason I cannot think of, it does not work, so I have taken each of the components and constructed the vector from those. Not very elegant but it does the job. If anyone knows why the vector cannot be assigned, please do let me know!
vector $targetPosition = targetLocation.translate;
to work, but for some reason I cannot think of, it does not work, so I have taken each of the components and constructed the vector from those. Not very elegant but it does the job. If anyone knows why the vector cannot be assigned, please do let me know!
3. On the particle shape, set the Aim Direction in the Instancer (Geometry Replacement) section to the aimPP attribute.
If you want the particle instances to rotate as well as face the camera, I am using the spriteTwistPP attribute and then create a new per particle vector attribute called aimUpAxisPP.
Create a random value for spriteTwistPP in the creation expression, then in the runtime before dynamics expression, add the line
aimUpAxisPP = << 0, sin(frame*spriteTwistPP), cos(frame*spriteTwistPP) >>;
Create a random value for spriteTwistPP in the creation expression, then in the runtime before dynamics expression, add the line
aimUpAxisPP = << 0, sin(frame*spriteTwistPP), cos(frame*spriteTwistPP) >>;
Now, for the Aim Up Axis in the Instancer options, choose aimUpAxisPP
Now you can instance any geometry to the particle object and the instances will behave like sprite particles. You can render them with Arnold, too!