[R] RGL 'front' upwards default in rendering image

Joe Byers joe-byers at utulsa.edu
Tue Oct 3 20:27:34 CEST 2006

Thanx for the help.  Other comments are posted inline below.


Duncan Murdoch wrote:
> On 10/3/2006 11:31 AM, Joe Byers wrote:
>> thanks for the reply.
>> I wish I could create a self contained example of the problem, but I 
>> can't.
>> My task is displaying the surface generated from a simulation of 
>> Forward prices for a selected trajectory.  The x axis is time from 
>> 9/25/06 to 3/31/2007 or 133X1 vector of integers. The z axis is the 
>> expiration month of the forwards as integers (1-36), the y axis is 
>> price.  For each day(x) there are 36 prices (y).  surface3d displays 
>> the surface but displays the z axis in reverse order and the x axis 
>> in reverse order as well.  I can rotate the image 180 degrees but 
>> time on the x axis is running  from right to left instead of left to 
>> right.  My z axis is now in ascending order.
>> I have read the documentation for rgl and much of the supported 
>> documents on neosciences web site, but I can not understand how to 
>> generate the image with the displaying the x axis left to right and z 
>> axis in ascending order.  I think that rotation matrix or a setting 
>> in rgl.materials will do it, but I can't figure out which one.  This 
>> mathematical conversions is beyond me.
> Generally I'd suggest using surface3d, which uses the same conventions 
> as persp and other R functions, rather than rgl.surface, which uses 
> the OpenGL/computer graphics conventions.
> If you do that, you would want x and y to be the fixed variables (rows 
> and columns) and z to be the response.
surface3d instead of rgl.surface seems to have worked.  I need to work 
out issued with the axis labels and placement, but you made some 
suggestions below that I will try.  I think I have my y and z ases 
turned around.  The documentation for rgl.surface uses y and surface3d 
uses z in their examples, but the examples do the same thing.

One note is surface3d uses a white background instead of black that 
rgl.surface has.  I did  see the rgl.bg method that I will experiment 
with to see how this works.

>> Here is my code
>> library(rgl);
>> #set x and z vectors
>> x<-as.numeric(as.date(rownames(calday.1),order='ymd'));
>> z<-as.numeric(colnames(a)[1:ncurve]); #only use the portion of the 
>> curve with data, exclude NaN's
>>     res<-par3d('zoom'=5);
>>             #attempt to set the image/window size, constrained to 
>> 0,0,256,256 wish I could change this to 0,0,640,640
> That's on my wish list too.  All I can suggest is that in the current 
> release in Windows in MDI mode, the Windows|Tile command works.
> (The difficulty is that rgl is portable to 3 incompatible windowing 
> systems.  Things like setting the size of a Window thus take much more 
> work than you'd expect.  More than three times as much, because I 
> don't think there's anybody who is familiar with all 3 systems.)
I do understand.  I know windows, and have a linux server running that 
is used for a data warehouse and web server at home.  Here at the 
university of Tulsa, I am stuck with Windows only in our college.  But I 
am not a OS programmer, and for that matter not a very good high level 
programmer either:).
>>     res<- rotationMatrix(pi,0, 1, 0) # attempt to set rotation, does 
>> not make a difference
> That just stored a matrix.  You need to use view3d to set the 
> userMatrix to that value.
>> #create a x labels vectors that somewhat matches in the image, trial 
>> and error here
>> labels<-as.character(as.date(x))# could just use rownames(calday.1)
>> labels<-labels[c(1,n%/%6,n%/%4,n%/%3,n%/%2,(n*2)%/%3,(n*3)%/%4,(n*5)%/%6,n)] 
>>     i=1;
>>     y<-ez[,,i]; # set y array
>>     #create the y axis labels,again trial and error to fit, using 7 
>> slots from 0 to the max(y)
>> labelsy<-as.character(format(max(y)*rep(1/7,8)*(seq(1:8)-1),digits=2))
>> #pretty colors thank you rgl docs.
>>     ylim <- range(y)
>>     ylen <- ylim[2] - ylim[1] + 1
>>     colorlut <- terrain.colors(ylen) # height color lookup table
>>     col <- colorlut[ y-ylim[1]+1 ] # assign colors to heights for 
>> each point
>> #generate the surface
>>         rgl.surface(x,z,y,ylim=c(0,max(ez[,,i])),back='lines',color=col)
>>         title3d(xlab='Date',zlab='Contract Month');#,ylab='Price $'); 
>> #sub='Forward curve Trajectory 1',
>>         axis3d('x--',labels=labels,nticks=9)
>>         axis3d('y+-',labels=labelsy,nticks=8)
>>         axis3d('z--',labels=as.character(z),nticks=ncurve);
> You can use the "at" argument to set ticks at some location and 
> "labels" to set the text to something else.  For example, you might 
> want to reverse one of the axes if the direction isn't the one you want.
> Duncan Murdoch
>> Thank you
>> Joe
>> Duncan Murdoch wrote:
>>> Joe Byers wrote:
>>>> The documentation for surface3d and rgl.surface in the package RGL 
>>>> states
>>>> "'surface3d' always draws the surface with the `front' upwards
>>>>       (i.e. towards higher 'z' values).  This can be used to render 
>>>> the
>>>>       top and bottom differently; see 'rgl.material' and the example
>>>>       below."
>>>> Is there a way to override this default?  I have search all the 
>>>> related methods help and the documents on RGL's website.
>>> There are lots of ways to override it:  as the docs say, rgl.surface 
>>> is more flexible than surface3d, and you can draw triangles or quads 
>>> arbitrarily.  What sort of thing do you want to do?
>>> Duncan Murdoch
>> ------------------------------------------------------------------------
>> ______________________________________________
>> R-help at stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide 
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.

More information about the R-help mailing list