|
|
|
|
|
|
| |
| |
|
|
|
|
| |
| |
|
|
I write a macro use for create path for animations, the macro return an array of
<x,y,z> values. The problem I have is: how do I make to have a good rotation
between two angles? Actually the object look alwways in the same direction.
Here is the macro:
#macro calc_path(nbr_elem, AngleXY, AngleZ, seed1)
#local S0 = 0; //start
#local S1 = nbr_elem; //end
#local ALEA = seed(seed1);
#local Values = array[S1]
#local OX = 0; //Old X;
#local OY = 0; //Old Y;
#local OZ = 0; //Old Z;
#local OA = 0; //Old Angle;
#local OAz = 0; //Old Angle z;
#local X = 0;
#local Y = 0;
#local Z = 0;
#local AC = AngleXY;
#local AD = AC/2;
#while (S0<S1)
#local NA = (AD - floor(rand(ALEA)*AC))+OA;
#local OA = mod(NA,360);
#local C = cosd(NA);
#local S = sind(NA);
#local X = OX+C;
#local Y = OY+S;
#local NAz = floor(rand(ALEA)*AngleZ)+OAz;
#local OAz = mod(NAz,360);
#local Sz = sind(NAz);
#local Z = OZ+Sz;
#local Values[S0]= <X,Y,Z>;
#local OX = X;
#local OY = Y;
#local OZ = Z;
#local S0 = S0+1;
#end
Values
#end
And the initialisation and use of the macro.
#local ELM = 25;
#local V = array[ELM];
#local V = calc_path(ELM, 100, 70, 1234);
#local Shape = union {
box {<-0.25,0.0,-0.1> <0.5,0.25,0.1> pigment {color rgb <0.1,0.1,0.1>}}
box {< 0.25,0.1,-0.3> <0.5,0.15,0.3> pigment {color rgb <0.5,0.5,0.5>}}
}
union {
#local start = 0;
#while (start<ELM)
object {
Shape
translate V[start]
}
#local start = start+1;
#end
}
Can somebody help me?
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
> I write a macro use for create path for animations, the macro return an array of
> <x,y,z> values. The problem I have is: how do I make to have a good rotation
> between two angles? Actually the object look alwways in the same direction.
> Here is the macro:
>
> #macro calc_path(nbr_elem, AngleXY, AngleZ, seed1)
> #local S0 = 0; //start
> #local S1 = nbr_elem; //end
> #local ALEA = seed(seed1);
>
> #local Values = array[S1]
> #local OX = 0; //Old X;
> #local OY = 0; //Old Y;
> #local OZ = 0; //Old Z;
> #local OA = 0; //Old Angle;
> #local OAz = 0; //Old Angle z;
>
> #local X = 0;
> #local Y = 0;
> #local Z = 0;
> #local AC = AngleXY;
> #local AD = AC/2;
>
> #while (S0<S1)
> #local NA = (AD - floor(rand(ALEA)*AC))+OA;
> #local OA = mod(NA,360);
> #local C = cosd(NA);
> #local S = sind(NA);
>
> #local X = OX+C;
> #local Y = OY+S;
>
> #local NAz = floor(rand(ALEA)*AngleZ)+OAz;
> #local OAz = mod(NAz,360);
> #local Sz = sind(NAz);
> #local Z = OZ+Sz;
> #local Values[S0]= <X,Y,Z>;
> #local OX = X;
> #local OY = Y;
> #local OZ = Z;
> #local S0 = S0+1;
> #end
> Values
> #end
>
> And the initialisation and use of the macro.
>
> #local ELM = 25;
> #local V = array[ELM];
>
> #local V = calc_path(ELM, 100, 70, 1234);
>
> #local Shape = union {
> box {<-0.25,0.0,-0.1> <0.5,0.25,0.1> pigment {color rgb <0.1,0.1,0.1>}}
> box {< 0.25,0.1,-0.3> <0.5,0.15,0.3> pigment {color rgb <0.5,0.5,0.5>}}
> }
>
> union {
> #local start = 0;
> #while (start<ELM)
> object {
> Shape
> translate V[start]
> }
> #local start = start+1;
> #end
> }
>
> Can somebody help me?
>
>
The problem with using an array is that you only have discreete values.
If you want to change the number of frames in the animation, you need to
recompute the whole array.
Make a spline from your array. Any spline but the linear one can do.
Next, take two points: one for the location and a second one a little
bit away. Use them to orient your object. You can take a look at the
splinefollow example scene as an example of the principle.
The advantage been that you now can interpolate between your defined
points. This can mean that you may need to define fewer points.
Another option would be to have a spline for the location and another
one for the orientation: The first spline gives the rotation or
orientation of your object, the second one been used to translate the
object to the desider location. This enable you to have complete
controll of the orientation of your object. You can do something similar
for the camera: One spline define the path of the camera, the second
define the path of the look_at point.
Alain
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Alain <kua### [at] videotronca> wrote:
> The problem with using an array is that you only have discreete values.
> If you want to change the number of frames in the animation, you need to
> recompute the whole array.
>
> Make a spline from your array. Any spline but the linear one can do.
> Next, take two points: one for the location and a second one a little
> bit away. Use them to orient your object. You can take a look at the
> splinefollow example scene as an example of the principle.
> The advantage been that you now can interpolate between your defined
> points. This can mean that you may need to define fewer points.
>
> Another option would be to have a spline for the location and another
> one for the orientation: The first spline gives the rotation or
> orientation of your object, the second one been used to translate the
> object to the desider location. This enable you to have complete
> controll of the orientation of your object. You can do something similar
> for the camera: One spline define the path of the camera, the second
> define the path of the look_at point.
>
>
>
> Alain
Thank you very much for your answer, it's exactly what I want.
Lionel.
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
|
|