Er det muligt at gengive Graphics3D i en isometrisk projektion ? Jeg ved, at indstillingen ViewPoint kan bruges til ortogonal projektion ved at angive f.eks. ViewPoint -> {0, Infinity, 0}. Dette tager dog ikke flere uendeligheder, så jeg kan ikke ViewPoint -> {Infinity, -Infinity, Infinity}, for eksempel.

Jeg er klar over, at jeg kunne opnå dette ved at rotere hele scenen omkring to akser og ved hjælp af en ortogonal fremspring:

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

Dette er dog ret besværligt, og det er sværere at finde ud af de korrekte rotationer for synspunktet I ” Jeg er interesseret i. Jeg ville hellere bare angive den oktant, hvorfra scenen kan ses isometrisk. Er der faktisk en “ordentlig” måde at opnå dette på?

Kommentarer

  • Jeg lavede en isometrisk projektion her: mathematica.stackexchange.com/questions/28000/isometric-3d-plot/… .
  • @ MichaelE2 Åh okay, jeg læste kun spørgsmålets krop og kunne ikke ' ikke se, hvad det havde at gøre med isometrisk tegning (skulle har også læst kommentarerne). Men jeg antager, at din tilgang ligner min, bortset fra at brug af to vektorer til rotation er obv meget enklere end at bruge to vinkler.

Svar

Fra V11.2 kan vi bruge en kombination af ViewProjection og ViewPoint :

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

Forskellige synspunkter:

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

indtast billedbeskrivelse her

Svar

[Rediger meddelelse: Opdateret for at tillade indstilling af plotens lodrette retning og for at rette en fejl .]

Her er en lille generalisering af mit svar på Isometrisk 3d-plot . For at få en isometrisk visning er vi nødt til at konstruere en ViewMatrix , der roterer en vektor med formen {±1, ±1, ±1} til {0, 0, 1} og projicere vinkelret på de to første koordinater.

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

Alle kombinationer af synspunkter og lodrette akser:

Mathematica-grafik

Bemærk :

At få et nøjagtigt plotområde, der inkluderer polstring, er vigtigt for computing den korrekte visningsmatrix. Der er alternativer til den udokumenterede interne funktion Charting`get3DPlotRange. Alexey Popkov har en metode her: Hvordan får man den rigtige PlotRange ved hjælp af AbsoluteOptions? Jeg brugte PlotRange /. AbsolutOptions[g, PlotRange] og ganget med 1.02 (jeg kan ikke huske hvorfor ikke noget som 1.04) for at tilnærme polstringen i mit svar til Isometrisk 3d-plot .

Min go-to-ressource til forståelse af ViewMatrix har især været Heikes svar på Uddrag værdier for ViewMatrix fra en Graphics3D .

Denne opdatering svarer til Yves “ kommentar. Arbejdet med akserne fik mig til at indse, at koordinatsystemet vendes (fra “højrehåndet” til “venstrehåndet). Derfor ændrede jeg projiceringen fra IdentityMatrix[4] til en, der vender x & y-koordinaterne.

Det kan være en god idé at Deploy grafikken for at forhindre rotation af musen. Når grafikken drejes, nulstiller frontend ViewMatrix på en ret grim måde.

Kommentarer

  • Meget flot – er det muligt at justere z-aksen lodret?
  • @YvesKlett Det var lidt sværere, end jeg troede, det ville være, primært fordi jeg havde misforstået noget.
  • Awesome! Denne kommer til nytte!

Svar

Du kan bruge følgende indlæg -processfunktion til at anvende en generel parallel 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]}]]; 

Her definerer axes projektionen af x, y, z-akser til 2d-plan og pad giver plads til at vise aksetiketter.

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}}] 

indtast billedebeskrivelse her

Skabsprojektion:

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

indtast billedbeskrivelse her

Svar

Bare hvis du ikke leder efter en helt korrekt løsning, men i stedet bare en billig løsning.

Jeg ledte efter en ViewPoint->{Infinity,Infinity, Infinity} slags løsning. Ved at erstatte Infinity med et stort nummer (i mit tilfælde 500) kunne jeg få de resultater, jeg ledte efter.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *