24th February 2002 01:31 UTC
Multiple settings superscope
I'm trying to make a superscope that changes between a number of different settings (i.e., ring, anchored scope, cross, flying vu, etc.). But I can't figure out the timing. Any help...?
Archive: Multiple settings superscope
dirkdeftly
24th February 2002 01:31 UTC
Multiple settings superscope
I'm trying to make a superscope that changes between a number of different settings (i.e., ring, anchored scope, cross, flying vu, etc.). But I can't figure out the timing. Any help...?
UnConeD
24th February 2002 23:55 UTC
Suppose you have four different 'shapes'. Let 'sh' be a number from 0 to 3 that defines which shape you're drawing. You can either increase it every beat (sh=(sh+1)%4) or set it randomly (sh=rand(4)), or whatever.
Calculate your shapes like this:
What happens is this...csh
=sh;
x=if(csh,0,xcodefor1stshape);
y=if(csh,0,ycodefor1stshape);
csh=csh-1;
x=if(csh,x,xcodefor2ndshape);
y=if(csh,y,ycodefor2ndshape);
csh=csh-1;
x=if(csh,x,xcodefor3rdshape);
y=if(csh,y,ycodefor3rdshape);
csh=csh-1;
x=if(csh,x,xcodefor4thshape);
y=if(csh,y,ycodefor4thshape);
dirkdeftly
25th February 2002 07:20 UTC
I knew how to calculate the shapes, I just needed to find out how to time it correctly. What I'm trying to get is something that will morph between the shapes, like in your "Reflect on it," just with 5 shapes (more or less) instead of 2. I've figured out how to fade between two, it's fairly simple (i'll use a circle and a cross here):
init:
n=579; tpi=acos(-1)*2
frame:
t=t-0.01;
pixel:
circ=i*tpi; sx1=sin(c); sy1=cos(c);
test=above(i,0.5); sx2=if(test,i*4-3,0); sy2=if(test,0,i*4-1);
x1=sx1*sin(t)+sx2*cos(t); y1=sy1*sin(t)+sy2*cos(t); z1=v/3;
continue...
But it's when you add the third shape that things get confusing. My best guess is that you need to create 3 timers; one for each shape. So what you get is this (i'll now add the "anchored scope"):
init:
n=579; tpi=acos(-1)*2
frame:
at=(at+0.1)%100; s=(s+equal(at,0))%3; ts1=if(s,if(above(ts1,0.04),ts1-0.05,0),if(below(ts1,0.96),ts1+0.05,1)); ts2=if(s-1,if(above(ts2,0.04),ts1-0.05,0),if(below(ts2,0.96),ts1+0.05,1)); ts3=if(s-2,if(above(ts1,0.04),ts1-0.05,0),if(below(ts1,0.96),ts1+0.05,1));
pixel:
circ=i*tpi;
sx1=sin(circ); sy1=cos(circ); sz1=v/3;
test=above(i,0.5); sx2=if(test,i*4-3,0); sy2=if(test,i*4-1,0); sz2=v/3;
sx3=i; sy3=v*i;
x1=sx1*ts1+sx2*ts2+sx3*ts3;
y1=sy1*ts1+sy2*ts2+sy3*ts3;
z1=sz1*ts1+sz2*ts2;
continue...
which makes at ("alarm timer") hit zero every thousanth frame, which increments s, which sets off the shape timers. This really should work, but apparently it doesn't...
UnConeD
25th February 2002 07:54 UTC
It really depends on what you want to do. If you want to morph between the 5 shapes independantly, you'll need 'n' weights in the range of 0-1 that add up to 1 (for the most desirable effect). You'll need to find a function that passes through most of the n-space containing all possible values.
If you just want to go from A to B, then from B to C, etc., you can use the code I wrote below for jumping from one shape into another. Simply use "from A to B" as shape one, "from B to C" as shape two, etc.
Something like this (I use PHP style code for hilighting):
This will have a value 'ip' that just goes from 0 to 1 and returns to 0 afterwards, and a value 'sh' that will increase every time 'ip' is wrapped around. So if your first shape uses 'ip' to interpolate between x1 and x2, and the second shape uses 'ip' to interpolate between x2 and x3, you'll get a nice morph from x1 to x3, passing through x2.init
{
ip=0;
sh=0;
}
frame{
ip=ip+0.01;next=equal(ip,1);
sh=if(next,(sh+1)%4,sh);
ip=if(next,0,ip);
}
LittleBuddy88
25th February 2002 21:21 UTC
Atero, I think I've done a similar morphing sequence once, reacting on beat, but otherwise equal to what you did.
And I can see but one problem with your code, I don't know if more exists, I just looked through it quickly, but simple, I think AVS sets ANY non-zero value to TRUE, this means that all of your scopes are executed, except one...
Not sure if that's the case though :/
1 more thing, I'm not 100% sure if the % operator works with float values...
Linus
BlurPak2k1
26th February 2002 01:54 UTC
okay i got the first one (random number change (and i even used it :D))
but the other two....
...well you, eh, lost me :D
dirkdeftly
26th February 2002 02:54 UTC
I think I've finally figured it out! I used this exact code for a color changing circle, cross, and anchored scope:
init:
n=579; tpi=acos(-1)*2; ixyt=rand(100)/1000-0.05; ixzt=rand(100)/1000-0.05; iyzt=rand(100)/1000-0.05; sr=rand(100)/200; sg=rand(100)/200; sb=rand(100)/200;
beat:
ixyt=rand(100)/1000-0.05; ixzt=rand(100)/1000-0.05; iyzt=rand(100)/1000-0.05; sr=rand(100)/200; sg=rand(100)/200; sb=rand(100)/200;
frame:
at=(at+1)%1000; c=equal(at,0); s=if(c,s+1,s)%3; s1=equal(s,0); s2=equal(s,1); s3=equal(s,2); ts1=t*s1+(1-t)*s2; ts2=t*s2+(1-t)*s3; ts3=t*s3+(1-t)*s1; t=if(c,0,t+0.01*below(t,1)); xyt=xyt+ixyt; xzt=xzt+ixzt; yzt=yzt+iyzt; r=r*0.9+sr/10; g=g*0.9+sg/10; bl=bl*0.9+sb/10;
pixel:
circ=i*tpi; sx1=sin(circ); sy1=cos(circ); sz1=v/3;
test=above(i,0.5);
sx2=if(test,i*4-3,0); sy2=if(test,0,i*4-1);
sz2=v/3; sx3=i; sy3=v*i; sz3=0;
x1=sx1*ts1+sx2*ts2+sx3*ts3;
y1=sy1*ts1+sy2*ts2+sy3*ts3;
z1=sz1*ts1+sz2*ts2+sz3*ts3;
x2=x1*sin(xyt)-y1*cos(xyt); y2=x1*cos(xyt)+y1*sin(xyt);
x3=x2*sin(xzt)-z1*cos(xzt); z2=x2*cos(xzt)+z1*sin(xzt);
y3=y2*sin(yzt)-z2*cos(yzt); z3=y2*cos(yzt)+z2*sin(yzt);
x=x3/(z3/2+1); y=y3/(z3/2+1);
red=r*2; green=g*2; blue=bl*2;
And it works, perfectly! Yay happy. Thanx for the code, though, UnConeD, I learned from it (seriously; i've been trying to figure out ways of speeding up these kinds of things)
I was going to add in a flying VU, but then AVS turned nazi on me, and when I was about to add the code, it brought up the "Winamp tried to buy drugs from an illegal alien prostitute in a chop shop and will be shut down" message and I hit spacebar before I could read it, so Windows (which was nazi in the first place) closed the program before I could save. Anyway, if anyone wants to use this code, go ahead...
Edit:
This means the code for morphing scopes is this:
frame:
at=(at+1)%HT; c=equal(at,0); s=if(c,s+1,s)%NS; s1=equal(s,0); s2=equal(s,1); s3=equal(s,2);
...repeat this type of statement NS times
ts1=t*s1+(1-t)*s2; ts2=t*s2+(1-t)*s3; ts3=t*s3+(1-t)*s4;
...repeat this type of statement NS times, making sure the last one ends with ...+(1-t)*s1
t=if(c,0,t+0.01*below(t,1));
pixel:
(shapes go here, label them s(AXIS)(SHAPE))
x=sx1*ts1+sx2*ts2+sx3*ts3...; repeat that block (sxn*tsn) NS times
and you can repeat that entire statement for 2 or 3 axes, replacing x with y and z, of course.
MT=time taken for the shape to change, in frames
NS=number of shapes used
AXIS=the axis (x and y, and z if you're using a 3D scope)
SHAPE=the shape number you're coding
If anyone still finds this vague, just ask...
BlurPak2k1
27th February 2002 18:24 UTC
i cant really tell where your circle is in your code there but...
int:
x=sin(t+i)+v;
y=cos(t+i);
red=cos(tan(t)+x);
green=sin(tan(-t)+y);
blue=cos(tan(x-y));
Fork me on GitHub