|
|
Hi folks,
I wanted to animate the construction of some meshes based on parametric
equations, and am grappling with how to "linearize" the SDL so that I get the
behaviour of the Theta-Phi nested loop over the linear clock sequence.
I'm guessing the easiest way would be to have Phi follow a sawtooth type
function, which would imply using mod() - but I'm getting stuck.
Here's what I've worked out so far - I'd appreciate a little help visualizing
how to formulate the specific mod() function I need for this:
=========================================================
#declare ClockStep = 0.001;
#declare T_begin = -pi;
#declare T_end = pi;
#declare T_span = T_end-T_begin;
#declare P_begin = 0;
#declare P_end = 2*pi;
#declare P_span = P_end-P_begin;
#declare P_divisions = 36;
#for (Clock, 0, 1, ClockStep)
#declare Theta = T_begin + (Clock*T_span);
#declare Phi = P_begin + (P_span * mod (Clock, 1/P_divisions));
#debug concat( " Clock = ", str(Clock, 3, 3), " Theta = ", str(Theta, 3, 3),
" Phi = ", str(Phi, 3, 3), "\n")
#end // end for Clock
Post a reply to this message
|
|
|
|
I have something that works - partially - it doesn't seem to automatically give
a mesh as neat and complete as my static SDL scene does - this needed guessing
and tweaking the increments manually
I also seem to get an alternating brick arrangement rather than the radial array
of quadrilaterals that I do in the original. I'm guessing I may have switched
up Theta and Phi somehow... I'll have to look into that.
#version 3.7;
#include "colors.inc"
#include "debug.inc"
global_settings {
assumed_gamma 1.0
}
camera {
location <0, 2, -30.0>
look_at <0.0, 0.0, 0.0>
right x*image_width/image_height
}
light_source {
0*x // light's position (translated below)
color rgb <1,1,1> // light's color
translate <-20, 40, -20>
}
#macro _CH2RGB (HH)
#local H = mod(HH, 360);
#local H = (H < 0 ? H+360 : H);
#switch (H)
#range (0, 120)
#local R = (120- H) / 60;
#local G = ( H- 0) / 60;
#local B = 0;
#break
#range (120, 240)
#local R = 0;
#local G = (240- H) / 60;
#local B = ( H-120) / 60;
#break
#range (240, 360)
#local R = ( H-240) / 60;
#local G = 0;
#local B = (360- H) / 60;
#break
#end
<min(R,1), min(G,1), min(B,1)>
#end
#macro _CHSV2RGB(Color)
#local HSVFT = color Color;
#local H = (HSVFT.red);
#local S = (HSVFT.green);
#local V = (HSVFT.blue);
#local SatRGB = _CH2RGB(H);
#local RGB = ( ((1-S)*<1,1,1> + S*SatRGB) * V );
<RGB.red,RGB.green,RGB.blue,(HSVFT.filter),(HSVFT.transmit)>
#end
#declare cot = function (QQ) {cos(QQ)/sin(QQ)}
#declare ClockStep = 0.001;
#declare T_begin = 0;
#declare T_end = 2*pi;
#declare T_span = T_end-T_begin;
#declare P_begin = -pi;
#declare P_end = pi;
#declare P_span = P_end-P_begin;
#declare P_divisions = 360;
#declare r0 = 10;
#declare r1 = 4;
#declare Phi_inc = 2*pi*ClockStep*40; //(2*pi/360)*6;
#declare Theta_inc = 2*pi*ClockStep*25; //(2*pi/360)*2;
#declare Radius = 0.02;
#declare Spheres = true;
#declare Faces = true;
#declare Mesh = true;
#declare Colored = false;
#declare Spec = 0.0;
#declare Saturation = 0.8;
#declare X = function (T, P, R, r) {cos(T) * ( R + r * cos(P) )}
#declare Y = function (T, P, R, r) {sin(T) * ( R + r * cos(P) )}
#declare Z = function (P, r) {r * sin(P)}
#for (Clock, 0, 1, ClockStep)
#declare Theta = T_begin + (Clock*T_span);
//#declare Phi = P_begin + (P_span * mod (Clock, 1/P_divisions));
//#declare Phi = -(2*1/pi)*atan2(cot(Clock*pi/P_divisions),1);
#declare Phi = P_begin + P_span * (Clock*P_divisions -
floor(Clock*P_divisions));
//#debug concat( " Clock = ", str(Clock, 3, 3), " Theta = ", str(Theta, 3,
3), " Phi = ", str(Phi, 3, 3), "\n")
#declare X1 = X (Theta, Phi, r0, r1); //cos(Theta) * ( r0 + r1 * cos(Phi) );
#declare X2 = X (Theta, Phi + Phi_inc, r0, r1); //cos(Theta) * ( r0 + r1 *
cos(Phi + Phi_inc) );
#declare X3 = X (Theta + Theta_inc, Phi + Phi_inc, r0, r1); //cos(Theta +
Theta_inc) * ( r0 + r1 * cos(Phi + Phi_inc) );
#declare X4 = X (Theta + Theta_inc, Phi, r0, r1); //cos(Theta + Theta_inc) * (
r0 + r1 * cos(Phi) );
#declare Y1 = Y (Theta, Phi, r0, r1); //sin(Theta) * ( r0 + r1 * cos(Phi) );
#declare Y2 = Y (Theta, Phi + Phi_inc, r0, r1); //sin(Theta) * ( r0 + r1 *
cos(Phi + Phi_inc) );
#declare Y3 = Y (Theta + Theta_inc, Phi + Phi_inc, r0, r1); //sin(Theta +
Theta_inc) * ( r0 + r1 * cos(Phi + Phi_inc) );
#declare Y4 = Y (Theta + Theta_inc, Phi, r0, r1); //sin(Theta + Theta_inc) * (
r0 + r1 * cos(Phi) );
#declare Z1 = Z (Phi, r1);
#declare Z2 = Z (Phi + Phi_inc, r1);
#declare Z3 = Z (Phi + Phi_inc, r1);
#declare Z4 = Z (Phi, r1);
#declare P1 = <X1, Y1, Z1>;
#declare P2 = <X2, Y2, Z2>;
#declare P3 = <X3, Y3, Z3>;
#declare P4 = <X4, Y4, Z4>;
#declare Color = _CHSV2RGB(<Theta*60, Saturation, 1, 0, 0>);
#if (Faces)
triangle {<X1, Y1, Z1>, <X2, Y2, Z2>, <X3, Y3, Z3> texture {pigment {color
Color} finish {phong 0.3}} no_shadow}
triangle {<X3, Y3, Z3>, <X4, Y4, Z4>, <X1, Y1, Z1> texture {pigment {color
Color} finish {phong 0.3}} no_shadow}
#end // end if Faces
#if (Spheres)
sphere {P1, Radius*2 texture {pigment {color Color} finish {phong 0.3}}
no_shadow} // red spheres
sphere {P2, Radius*2 texture {pigment {color Color} finish {phong 0.3}}
no_shadow} // red spheres
sphere {P3, Radius*2 texture {pigment {color Color} finish {phong 0.3}}
no_shadow} // red spheres
sphere {P4, Radius*2 texture {pigment {color Color} finish {phong 0.3}}
no_shadow} // red spheres
#end // end if Spheres
#if (Mesh)
cylinder {P1, P2, Radius
#if (Colored)
texture {pigment {color Color} finish {phong 0.3}} no_shadow}
#else
texture {pigment {Black} finish {specular Spec}} no_shadow}
#end
cylinder {P2, P3, Radius
#if (Colored)
texture {pigment {color Color} finish {phong 0.3}} no_shadow}
#else
texture {pigment {Black} finish {specular Spec}} no_shadow}
#end
cylinder {P3, P4, Radius
#if (Colored)
texture {pigment {color Color} finish {phong 0.3}} no_shadow}
#else
texture {pigment {Black} finish {specular Spec}} no_shadow}
#end
cylinder {P4, P1, Radius
#if (Colored)
texture {pigment {color Color} finish {phong 0.3}} no_shadow}
#else
texture {pigment {Black} finish {specular Spec}} no_shadow}
#end
#end // end if Mesh
#end // end for Clock
Post a reply to this message
|
|