The idea of putting "phong" on the surface was discussed ages ago, and I won't re-open that question here. For the shadow, we will just replot our surface (defined as z(x,y)) in a little bit strange way: instead of letting the x and y run through their corresponding ranges, we will restrict y to be equal to the maximum of the yrange. By doing so, we get this
reset unset colorbox; unset key set iso 2, 50 set parametric; set urange [0:1]; set vrange [0:1.2] set table 'tb.tab' splot u, v, 1 unset table unset parametric set iso 100, 100 set xrange [-3:3] set yrange [-3:3] set zrange [0:1.2] set table 't.tab' splot exp(-x*x-y*y)+0.1*rand(0) unset table set ticslevel 0 set pm3d set cbrange [0:4] f(x,y,z,a,b,s) = z*(exp(-(x-a)*(x-a)/s-(y-b)*(y-b)/s)/3.0+0.66) set palette defined (0 "#ff2222", 1 "#ffeeee", 2 "#aaaaaa", 3 "#2222ff", 4 "#8888ff") splot 'tb.tab' u ($1*6.0-3.0):(3):2:($2+3.0) w pm3d, \ '' u (-3):($1*6.0-3.0):2:($2+3.0) w pm3d, \ '' u ($1*6.0-3.0):($2*6.0-3.0):(0):(2.1) w pm3d, \ 't.tab' u ($1+1.0):(3):($3*0.7):(2.1) w pm3d,\ '' u 1:2:3:(f($1,$2,$3,-0.5,-0.5,.8)) w pm3dFirst, we create the data that will be our background, then some dummy data, which in this particular case will be a noise Gaussian function in 2D. Then we move the surface to the bottom of the zrange, by setting the ticslevel to 0. The next step is the definition of the cbrange. We need to "overdefine" this, i.e., our cbrange is much larger, than the actual data range. The reason for this is that in this way, we can use the same colour palette, and we do not have resort to multiplot. The basic problem with multiplot is that we since we want to plot onto the same graph, we would have to re-set the border, tics, labels, and so on. By using the same plot, and same palette, we can avoid all this hassle. The price we pay is that our palette will be a bit more complicated, but we can live with that. Now, we have to define our palette, which will change between red and almost white for [0:1], and between blue, and almost white for [3:4]. We also defined a value at 2, which we will use for colouring the shadow, but the two main ranges are [0:1], and [3:4]. Note that we define disjoint ranges, thereby not walking into a trouble with the end points.
Finally, we plot our background, and function. Pay attention to plots like
splot 'tb.tab' u ($1*6.0-3.0):(3):2:($2+3.0) w pm3dThis will plot a plane between x [-3:3], and z [0:1] at y=3, with a colour given by the value of ($2+3.0). This is nothing but pushing all z values in the plot into the [3:4] colour range.
At the very end, we plot our function's shadow, namely,
't.tab' u ($1+1.0):(3):($3*0.7):(2.1) w pm3dwhere the x values are shifted by 1.0 (so as to give the impression that the surface is lit from the (-1:-1) direction), the y values are all restricted to 3, which is the maximum of the yrange, and the z values are multiplied by 0.7, again for the same reason. Colouring is done by using one single value, 2.1. The very last step is to plot the surface itself, using the colouring given by f(...). If you want to have another direction for the lighting, or have a tighter focus, you should change the parameters in this function.
Fabioulus. Have you considered posting your samples to the
ReplyDeleteofficial gnuplot demo section ?
Thanks for visiting! How does that work? I mean, I haven't administrator privileges there. But everything is free, so if you find a way of moving the samples there, just go ahead! Even if someone inserted a link to this page, that would already be helpful.
ReplyDeleteCheers,
Zoltán
Hi Zoltán, This stuff is brilliant. I may have something to contribute later, but for now I just wanted to say thank you ever so much.
ReplyDeleteThanks for the kind words! I would be interested in any new ideas, suggestions or proposals.
ReplyDeleteCheers,
Zoltán