Indeed there's no "pivot offset" in the billboarders.
You'll have to manually offset the rendering position to do that.
you can do either a world/3D pivot offset or a screen pivot offset.
Only the screen pivot offset will match the actual rotation of the billboard.
3D pivot offset
First, the simplest example: say you've got an axis-aligned billboard with your flame stretched on it.
the particle has its simulation position stored in the "Position" field.
Let's say you have the worldspace billboarding axis in the "Axis" field.
Create a new float3 field "DrawPosition", and change the "PositionField" property of the billboarder from "Position" to "DrawPosition". The billboarder will now use "DrawPosition" instead of "Position" to draw the particle.
in an evolve script, do this:
DrawPosition = Position + Axis * 0.5;
if "Position" is on the ground, this will move "DrawPosition" up along half the stretch axis, making the bottom of the billboard geometry rest on the ground.
Then, you can recompute Axis each frame and rotate it, for example like this:
Axis = rotate(scene.axisUp(), normalize(float3(0.5,0,0.2)), noise(scene.Time*1.5)*0.3 + 0.6);
This rotates the up axis along the float3(0.5,0,0.2) axis (the 'rotate' function expects the rotation axis to be normalized, hence the 'normalize' function), by some time-coherent random angle using the 1D noise() function, passing the scene time as a cursor into the noise.
You can also rotate it incrementally by using the 'dt' variable, which contains the current frame's time-step in seconds (will be 0.0166 when running at 60 fps), but it'll be harder to have a stable behavior.
I suggest you do like with the position: have a BaseAxis that doesn't move, and re-rotate that each frame into the final "Axis" field used by the billboarder. (Or "Axis" > "DrawAxis", whatever :) )
it'll use more memory in the particle storage, but will be easier to control / tweak, and will also avoid most imprecisions.
Screenspace pivot offset
the idea is to compute a screen-aligned axis and offset the billboard like above.
You can get the camera axes within evolve scripts by using "view.axisUp()" and "view.axisForward()" :
First, compute the rotation angle how you like:
Rotation = noise(scene.Time);
The billboard will rotate around its center.
Then, use that angle to rotate a vector aligned to the camera plane (up / side) :
float3 axis = view.axisUp() * cos(Rotation) - view.axisSide() * sin(Rotation);
And offset the draw position like before:
DrawPosition = Position + axis * Size;
Note that here, we don't do "Position + axis * 0.5" like with the axis aligned billboards.
This is because the "Axis" property of the axis-aligned billboards doesn't take the billboard size into account.
the "Size" property of billboards is in fact the radius, not the diameter, that's why we don't have to write "Position + axis * Size * 0.5"
Whereas the length of the axis given to the axis-aligned billboard is the length from the bottom to the top of the billboard geometry. (Hope this makes sense?)
It's less friendly than inputting a float2 offset in a predefined input-box in the billboard renderer, but you should still be able to achieve what you're after :)
Here are both techniques in action:
A builtin rotation offset is something we've been asked before and it will come in a later version, after v2.0 is released.
An example effect is available here: http://www.popcornfx.com/downloads/TestRotationPivot.pkkg
(right-click > Import package in your content browser)
Hope this helps !