Rotation of 3D Plot using Euler angles

Click For Summary
SUMMARY

The discussion focuses on optimizing the rendering of 3D plots in Mathematica, specifically when using Euler angles for rotation. The user implements a rotation matrix function and creates 3D graphics for arrows and toruses. However, performance issues arise when attempting to display multiple dipoles simultaneously. The solution involves processing each dipole separately and then combining them for display, rather than plotting them all at once, which significantly improves performance.

PREREQUISITES
  • Familiarity with Mathematica programming language
  • Understanding of 3D graphics rendering concepts
  • Knowledge of Euler angles and rotation matrices
  • Experience with the Manipulate function in Mathematica
NEXT STEPS
  • Explore advanced techniques for optimizing 3D graphics in Mathematica
  • Learn about combining multiple Graphic3D objects into a single plot
  • Investigate the use of Inset for rendering complex scenes in 3D
  • Study the performance implications of using ParametricPlot3D in large datasets
USEFUL FOR

This discussion is beneficial for Mathematica users, 3D graphics developers, and researchers working on simulations that require efficient rendering of multiple objects in a 3D space.

Mr. Rho
Messages
14
Reaction score
1
So, I'm trying to plot a 3D "dipole" (an arrow with a small torus around it basically) in mathematica, and want to rotate it according to Euler angles...

I use this code for the rotation matrix:

rot[a, b, g] := RotationMatrix[g, {1, 0, 0}].RotationMatrix[b, {0, 1, 0}].RotationMatrix[a, {0, 0, 1}]

and I obtain the standard Euler angles rotation matrix.

For the arrow and the torus I'm using:

arrow[x_, y_, z_,a_, b_, g_, r_] := Graphics3D[{Red, Cone[{rot[a, b, g].{0, 0, 2^4 r} + {x, y, z}, rot[a, b, g].{0, 0, 2^4 r + 2^2 r} + {x, y, z}}, 3 r], Cylinder[{rot[a, b, g].{0, 0, 0} + {x, y, z}, rot[a, b, g].{0, 0, 2^4 r} + {x, y, z}}, r]}]

torus[x_, y_, z_, a_, b_, g_, r_] := ParametricPlot3D[rot[a, b, g].{(r*Cos[m] + 4 r) Cos[v], (r*Cos[m] + 4 r) Sin[v], r*Sin + z} + {x, y, z}, {m, 0, 2 Pi}, {v, 0, 2 Pi}, Mesh -> None, PlotStyle -> {Green, Opacity[.25]}]

(Note that I also introduced a boost) The next step is to show both plots using manipulate to change the angle and boost values, the code I use is simply:

Manipulate[Show[arrow[x,y,z-8,a,b,g,1], torus[x,y,z,a,b,g,1]], {x,0,1}, {y,0,1}, {z,0,1}, {a,0,2Pi}, {b,0,2Pi}, {g,0,2Pi}]

Everything is ok until here, the plot of a dipole is shown and it moves smootly. The problem is when I start introducing more and more arrows and torus. If I want, for example, 4 dipoles, the plot gets really really slow...

So, any plot optimization tips?

Thank you for your help!
 
Last edited:
I have seen complex combinations of plots bog down in a Manipulate. It seems doing only 4 dipoles (each with a Graphic3D and a ParametricPlot3D) shouldn't be too bad, but that may depend on the CPU/cores/memory of your system. Did you integrate each of the 4 within the one Graphic3D and one ParametricPlot3D or are you processing 8 separate delayed functions and then Show'ing that?

If so, you might also try creating a single (complex) graphic object and use a Rotate command against that (instead of doing all the ParametricPlot3D's for each).

In a worst case scenario when I have hundreds or thousands of objects floating around a 3D space (e.g. where I am doing a parallelized CPU or GPU based simulation of some early inflationary Universe N-Body gravitational model of theoretical particles), I create a 2D raster of it and simply do an Inset of that into the 3D space.
 
Last edited:
  • Like
Likes   Reactions: Mr. Rho
J Gregory Moxness said:
I have seen complex combinations of plots bog down in a Manipulate. It seems doing only 4 dipoles (each with a Graphic3D and a ParametricPlot3D) shouldn't be too bad, but that may depend on the CPU/cores/memory of your system. Did you integrate each of the 4 within the one Graphic3D and one ParametricPlot3D or are you processing 8 separate delayed functions and then Show'ing that?

If so, you might also try creating a single (complex) graphic object and use a Rotate command against that (instead of doing all the ParametricPlot3D's for each).

In a worst case scenario when I have hundreds or thousands of objects floating around a 3D space (e.g. where I am doing a parallelized CPU or GPU based simulation of some early inflationary Universe N-Body gravitational model of theoretical particles), I create a 2D raster of it and simply do an Inset of that into the 3D space.

Hi Gregory, thank you for your reply. The solution for me was processing the 4 separate dipoles and then showing that as you say, the problem was that I was trying to plot all the four dipoles at the same time
 
  • Like
Likes   Reactions: J Gregory Moxness

Similar threads

  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 6 ·
Replies
6
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 2 ·
Replies
2
Views
4K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K