Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I have a two-dimensional streamline plot from a fluid dynamics simulation. I am wondering: is it possible to somehow allow Mathematica to treat the streamline plot as a plane in three-dimensional plot so that I can apply a camera perspective transformation to the resulting three-dimensional plot?

To provide a bit more information, I have three-dimensional scenes (an example of which is shown below) for which I am running fluid dynamics simulations. As a result of these simulations, I obtain a series of two-dimensional windflow velocity fields, which are cross-sections of the true three-dimensional windflow velocity fields. These fields quantify the direction and speed of the wind through the environment subject to the geometry constraints of the scene and some user-defined parameters and boundary conditions.

A three-dimensional scene in 3DS Max.  A red plane has been inserted to provide the desired perspective for the planar streamline plot.

For visualization purposes, I'm interested in transforming and overlaying one or more of the two-dimensional streamline plots of the velocity fields onto my three-dimensional scene such that the two-dimensional streamline plot takes the place of the red plane in the image below. Although I could simply rasterize the streamline plot, treat it as a texture for the plane, and render the scene in 3DS Max, I'm hoping to overlay the streamline plots as vector graphics.

Addendum: As per Yves' suggestion, I have supplied a subsampled version of the windflow velocity field that I am using for my plots. Using his wonderful script, I am able to take a two-dimensional streamline plot and rotate/scale it as if it was a three-dimensional plot.

data = {{{1, 1}, {1.0, 0.0}}, {{11, 1}, {0.971194, 0.0}}, {{21, 1}, {0.963011, 0.0}}, {{31, 1}, {0.993688, 0.0}}, {{41, 1}, {1.023889, 0.0}}, {{51, 1}, {1.024193, 0.0}}, {{61, 1}, {1.010802, 0.0}}, {{71, 1}, {1.032089, 0.0}}, {{81, 1}, {1.026697, 0.0}}, {{91, 1}, {0.987981, 0.0}}, {{101, 1}, {1.025693, 0.0}}, {{111, 1}, {1.105825, 0.0}}, {{121, 1}, {1.098795, 0.0}}, {{131, 1}, {1.065537, 0.0}}, {{141, 1}, {1.012451, 0.0}}, {{151, 1}, {1.0, 0.0}}, {{1, 11}, {1.0, -0.083697}}, {{11, 11}, {0.932164, -0.106793}}, {{21, 11}, {0.925340, -0.192984}}, {{31, 11}, {1.122307, -0.187170}}, {{41, 11}, {1.161864, 0.085156}}, {{51, 11}, {0.976324, 0.115229}}, {{61, 11}, {0.978851, 0.035055}}, {{71, 11}, {1.049432, -0.030869}}, {{81, 11}, {0.936428, 0.062604}}, {{91, 11}, {0.912342, -0.146168}}, {{101, 11}, {1.147333, -0.143745}}, {{111, 11}, {1.166712, 0.127165}}, {{121, 11}, {1.041843, 0.129961}}, {{131, 11}, {1.045287, 0.083479}}, {{141, 11}, {0.994206, 0.122328}}, {{151, 11}, {1.0, 0.132739}}, {{1, 21}, {1.0, -0.023829}}, {{11, 21}, {0.890156, -0.030084}}, {{21, 21}, {0.674394, -0.050241}}, {{31, 21}, {0.0, 0.0}}, {{41, 21}, {0.658960, -0.210046}}, {{51, 21}, {0.716182, 0.091213}}, {{61, 21}, {0.472093, -0.225292}}, {{71, 21}, {0.732020, 0.265153}}, {{81, 21}, {0.843532, 0.369957}}, {{91, 21}, {0.279971, -0.348445}}, {{101, 21}, {0.963035, -0.753370}}, {{111, 21}, {1.002857, 0.538380}}, {{121, 21}, {0.756004, 0.204065}}, {{131, 21}, {0.806599, -0.138649}}, {{141, 21}, {0.913204,  0.279003}}, {{151, 21}, {1.0, 0.159432}}, {{1, 31}, {1.0, 0.044899}}, {{11, 31}, {0.908289, 0.060171}}, {{21, 31}, {0.856098, 0.122421}}, {{31, 31}, {0.762294, 0.042601}}, {{41, 31}, {0.0, 0.0}}, {{51, 31}, {-0.438033, 0.780580}}, {{61, 31}, {0.382021, -0.726038}}, {{71, 31}, {0.550500, -0.113628}}, {{81, 31}, {0.860478, 0.363810}}, {{91, 31}, {1.373814, -0.269792}}, {{101, 31}, {0.153576, -0.482892}}, {{111, 31}, {0.113453, 0.274464}}, {{121, 31}, {0.286391, 0.307524}}, {{131, 31}, {0.275092, -0.174137}}, {{141, 31}, {0.651551, -0.053446}}, {{151, 31}, {1.0, 0.028982}}, {{1, 41}, {1.0, 0.091944}}, {{11, 41}, {0.942248, 0.107845}}, {{21, 41}, {0.914909, 0.147823}}, {{31, 41}, {0.914062, 0.226842}}, {{41, 41}, {1.090780, 0.280458}}, {{51, 41}, {1.423264, 0.011814}}, {{61, 41}, {1.084930, -0.364051}}, {{71, 41}, {0.899861, -0.177124}}, {{81, 41}, {0.992899, -0.106340}}, {{91, 41}, {1.136605, -0.039446}}, {{101, 41}, {0.830366, 0.086879}}, {{111, 41}, {0.653521, 0.119604}}, {{121, 41}, {0.862727, 0.513709}}, {{131, 41}, {1.041204, -0.599559}}, {{141, 41}, {0.911816, -0.171321}}, {{151, 41}, {1.0, -0.089802}}, {{1, 51}, {1.0, 0.0}}, {{11, 51}, {0.972851, 0.0}}, {{21, 51}, {0.958161, 0.0}}, {{31, 51}, {0.956957, 0.0}}, {{41, 51}, {1.008198, 0.0}}, {{51, 51}, {1.082196, 0.0}}, {{61, 51}, {1.119506, 0.0}}, {{71, 51}, {1.011644, 0.0}}, {{81, 51}, {0.905500, 0.0}}, {{91, 51}, {0.811638, 0.0}}, {{101, 51}, {0.953396, 0.0}}, {{111, 51}, {0.978083, 0.0}}, {{121, 51}, {1.166181, 0.0}}, {{131, 51}, {1.289609, 0.0}}, {{141, 51}, {1.066669, 0.0}}, {{151, 51}, {1.0, 0.0}}};

ListStreamPlot[data, StreamPoints -> Fine][[1]] /. Arrow[pts_] :> Arrow[{#[[1]], 0, #[[2]]} & /@ pts] // Graphics3D

A three-dimensional streamline plot in Mathematica

The only remaining question that I have is: how can I change the camera perspective parameters of the plot? Specifically, I would like change the perspective of the three-dimensional streamline plot such that the bounding box around the plot takes the shape of a trapezoid and the streamline trajectories are modified accordingly. I am aware that Graphics3D has ViewAngle, ViewPoint, and ViewVector options, but I am unsure as to how to use them in the context of Yves' script.

share|improve this question
2  
Code (at least a minimum working example) to go with your question would be great. –  Yves Klett May 8 at 6:51
1  
But for starters, this might give you an idea how to transfer 2D elements to 3D: StreamPlot[{x, -y}, {x, -3, 3}, {y, -3, 3}][[1]] /. Arrow[pts_] :> Arrow[{#[[1]], 0, #[[2]]} & /@ pts] // Graphics3D –  Yves Klett May 8 at 6:56
    
Take a look at non-Affine transforms of 2D polygons with textures or use info from ViewMatrix values. –  Kuba May 9 at 7:59
    
Also, take a look at Texture if you put Polygon with this SteamPlot in 3D space the transformation will be automatic, as shown in the second answer from the first link. –  Kuba May 9 at 8:17

1 Answer 1

up vote 3 down vote accepted

I am not entirely sure how you want to proceed, but if you transfer your 2D data to 3-space and render that, then you can just plug in any combination of view-related options you like (in this case just ViewPoint). You can also apply Translate or similar functions to position/align your objects:

ypos = 25;

data3d = ListStreamPlot[data, StreamPoints -> Fine][[1]] /. 
   Arrow[pts_] :> Arrow[{#[[1]], ypos, #[[2]]} & /@ pts];

addon = Translate[
     ExampleData[{"Geometry3D", "SpaceShuttle"}, 
      "PolygonObjects"], #] & /@ RandomReal[{0, 50}, {10, 3}];

Graphics3D[{addon, data3d}, ViewPoint -> .8 {-1, -1, 0}, Axes -> True,
  AxesLabel -> {"x", "y", "z"}]

Mathematica graphics

share|improve this answer
    
Out of curiosity, is there any way to add black borders around the individual arrows? The reason that I ask is that I ended up using a StreamColorFunction to accent the differences in the horizontal and vertical wind flows. However, when I go to overlay the StreamLinePlot on my image, the arrows can be a bit difficult to distinguish from the background content in the image. I thought about just stacking two StreamLinePlots, one that had a high thickness and was black and another that had a smaller thickness and the corresponding color map; I didn't know if there are better options, though. –  isledge May 10 at 8:18

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.