Är det möjligt att återge Graphics3D i en isometrisk projektion ? Jag vet att alternativet ViewPoint kan användas för ortogonal projektion genom att specificera, t.ex. ViewPoint -> {0, Infinity, 0}. Detta tar dock inte flera oändligheter, så jag kan inte göra ViewPoint -> {Infinity, -Infinity, Infinity}, till exempel.

Jag inser att jag kunde uppnå detta genom att rotera hela scenen omkring två axlar och med en ortogonal projektion:

Graphics3D[ Rotate[ Rotate[ Cuboid[{-.5, -.5, -.5}], Pi/4, {0, 0, 1} ], ArcTan[1/Sqrt[2]], {0, 1, 0} ], ViewPoint -> {-Infinity, 0, 0} ] 

Detta är dock ganska besvärligt och det är svårare att räkna ut de korrekta rotationerna för synvinkeln I ” Jag är intresserad av. Jag vill hellre bara specificera den oktant som man vill se scenen isometriskt från. Finns det faktiskt ett ”rätt” sätt att uppnå detta?

Kommentarer

  • Jag gjorde en isometrisk projektion här: mathematica.stackexchange.com/questions/28000/isometric-3d-plot/… .
  • @ MichaelE2 Åh okej, jag läste bara frågan och såg inte ' vad det hade med isometrisk plottning att göra (borde har läst kommentarerna också). Men jag antar att din inställning liknar min, förutom att det är obv att använda två vektorer för rotation väldigt enklare än att använda två vinklar.

Svar

Från och med V11.2 kan vi använda en kombination av ViewProjection och ViewPoint :

Graphics3D[Cuboid[], ViewProjection -> "Orthographic", ViewPoint -> {1, 1, 1}] 

Olika synpunkter:

v = Tuples[{Tuples[{-1, 1}, 3], IdentityMatrix[3]}]; Graphics3D[Cuboid[{-.5, -.5, -.5}, {1., 2., 4}], ViewProjection -> "Orthographic", ViewPoint -> #1, ViewVertical -> #2] & @@@ v 

ange bildbeskrivning här

Svar

[Redigera meddelande: Uppdaterad för att möjliggöra inställning av plotens vertikala riktning och för att åtgärda ett fel .]

Här är en liten generalisering av mitt svar på Isometrisk 3d-plot . För att få en isometrisk vy måste vi konstruera en ViewMatrix som roterar en vektor med formen {±1, ±1, ±1} till {0, 0, 1} och projicera ortogonalt på de två första koordinaterna.

ClearAll[isometricView]; isometricView[ g_Graphics3D, (* needed only for PlotRange *) v_ /; Equal @@ Abs[N@v] && 1. + v[[1]] != 1., (* view point {±1, ±1, ±1} *) vert_: {0, 0, 1}] := (* like ViewVertical; default: z-axis *) {TransformationMatrix[ RescalingTransform[ EuclideanDistance @@ Transpose[Charting`get3DPlotRange@ g] {{-1/2, 1/2}, {-1/2, 1/2}, {-1/2, 1/2}}]. RotationTransform[{-v, {0, 0, 1}}]. RotationTransform[{vert - Projection[vert, v], {0, 0, 1} - Projection[{0, 0, 1}, v]}]. RotationTransform[Mod[ArcTan @@ Most[v], Pi], v]. TranslationTransform[-Mean /@ (Charting`get3DPlotRange@ g)]], {{0, 1, 0, 0}, {1, 0, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}}; foo = Graphics3D[Cuboid[{-.5, -.5, -.5}, {1., 2., 4}]]; Show[foo, ViewMatrix -> isometricView[foo, {1, 1, 1}, {0, 0, 1}], ImagePadding -> 20, Axes -> True, AxesLabel -> {x, y, z}] Show[foo, ViewMatrix -> isometricView[foo, {-1, 1, 1}, {1, 1, 0}], ImagePadding -> 20, Axes -> True, AxesLabel -> {x, y, z}] 

Mathematica-grafik Mathematica-grafik

Alla kombinationer av synpunkter och vertikala axlar:

Mathematica-grafik

Obs !:

Att få ett exakt plotintervall som inkluderar stoppning är viktigt för datorer rätt visningsmatris. Det finns alternativ till den odokumenterade interna funktionen Charting`get3DPlotRange. Alexey Popkov har en metod här: Hur får man den riktiga PlotRange med AbsoluteOptions? Jag använde PlotRange /. AbsolutOptions[g, PlotRange] och multiplicerat med 1.02 (jag minns inte varför inte något som 1.04) för att approximera stoppningen i mitt svar till Isometrisk 3d-plot .

Min resurs för att förstå ViewMatrix har varit särskilt Heikes svar på Extrahera värden för ViewMatrix från en Graphics3D .

Den här uppdateringen svarar på Yves ” kommentar. Att arbeta med axlarna fick mig att inse att koordinatsystemet vänds (från ”högerhänt” till ”vänsterhänt). Därför ändrade jag projektionen från IdentityMatrix[4] till en som vänder x & y-koordinaterna.

Det kan vara en bra idé att Deploy grafiken för att förhindra musrotation. När grafiken roteras återställer fronten ViewMatrix på ett ganska ful sätt.

Kommentarer

  • Mycket trevligt – är det möjligt att rikta in z-axeln vertikalt?
  • @YvesKlett Det var lite svårare än jag trodde att det skulle bli, främst för att jag missförstått något.
  • Fantastiskt! Denna kommer att vara till nytta!

Svar

Du kan använda följande inlägg -processfunktion för att tillämpa en allmän parallell projektion:

parallelProjection[g_Graphics3D, axes_, pad_: 0.15] := Module[{pr3, pr2, ar, t}, pr3 = {-pad, pad} (#2 - #) & @@@ # + # &@Charting`get3DPlotRange@g; pr2 = MinMax /@ Transpose[[email protected]]; ar = Divide @@ Subtract @@@ pr2; t = AffineTransform@Append[Transpose@axes, {0, 0, -1}]; t = RescalingTransform@Append[pr2, pr3[[3]]].t; Show[g, AspectRatio -> 1/ar, ViewMatrix -> {TransformationMatrix[t], IdentityMatrix[4]}]]; 

Här definierar axes projektionen av x, y, z-axlar till 2d-plan och pad skapar ett rum för att visa axeltiketter.

Isometrisk projektion:

g = Graphics3D[Cuboid[], Axes -> True, AxesLabel -> {X, Y, Z}]; parallelProjection[g, {{-Sqrt[3]/2, -1/2}, {Sqrt[3]/2, -1/2}, {0, 1}}] 

ange bildbeskrivning här

Skåpprojektion:

α = π/4; parallelProjection[g, {{1, 0}, {0, 1}, -{Cos[α]/2, Sin[α]/2}}] 

ange bildbeskrivning här

Svar

Bara om du inte letar efter en helt korrekt lösning, utan istället bara en billig lösning.

Jag letade efter en ViewPoint->{Infinity,Infinity, Infinity} typ av lösning. Genom att ersätta Infinity med ett nummer som är tillräckligt stort (i mitt fall 500) kunde jag få de resultat jag letade efter.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *