Onko Graphics3D mahdollista renderöidä isometrinen projektio ? Tiedän, että vaihtoehtoa ViewPoint voidaan käyttää kohtisuorassa projektiossa määrittämällä esim. ViewPoint -> {0, Infinity, 0}. Tämä ei kuitenkaan vaadi useita äärettömyyksiä, joten en voi esimerkiksi tehdä ViewPoint -> {Infinity, -Infinity, Infinity}.

Ymmärrän, että voisin saavuttaa tämän kiertämällä koko näkymää noin kahdesta akselista ja käytetään kohtisuoraa projektiota:

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

Tämä on kuitenkin melko hankalaa ja on vaikeampaa selvittää näkökulman I oikeat kierrot ” Olen kiinnostunut. Määritän mieluummin vain oktantin, josta näkymää katsotaan isometrisesti. Onko tähän oikeastaan ”oikea” tapa?

Kommentit

  • Tein isometrisen projektion täällä: mathematica.stackexchange.com/questions/28000/isometric-3d-plot/… .
  • @ MichaelE2 Okei, luin vain kysymyksen rungon enkä ' nähnyt, mitä sillä oli tekemistä isometrisen piirtämisen kanssa (pitäisi Olen lukenut myös kommentit). Mutta luulen, että lähestymistapasi on samanlainen kuin minun, paitsi että kahden vektorin käyttö kiertämiseen on obv huomattavasti yksinkertaisempi kuin kahden kulman käyttö.

Vastaa

V11.2: sta lähtien voimme käyttää yhdistelmää ViewProjection ja ViewPoint :

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

Erilaisia etuja:

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

kirjoita kuvan kuvaus tähän

Vastaus

[Muokkaa ilmoitusta: Päivitetty sallimaan juonteen pystysuunnan asettamisen ja korjaamaan virheen .]

Tässä on pieni yleistys vastauksestani isometriseen kolmiulotteisuuteen . Isometrisen näkymän saamiseksi meidän on rakennettava ViewMatrix , joka kiertää vektoria muodossa {±1, ±1, ±1}{0, 0, 1} ja heijastetaan ortogonaalisesti kahdelle ensimmäiselle koordinaatille.

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-grafiikka Mathematica-grafiikka

Kaikki näkökulmien ja pystyakselien yhdistelmät:

Mathematica-grafiikka

Huomautukset :

Tarkan juonealueen saaminen, joka sisältää täytteen, on tärkeää laskennassa oikea näkymämatriisi. Dokumentoimattomalle sisäiselle toiminnolle Charting`get3DPlotRange on vaihtoehtoja. Alexey Popkovilla on menetelmä tässä: Kuinka saada todellinen PlotRange-alue AbsoluteOptionsin avulla? Käytin PlotRange /. AbsolutOptions[g, PlotRange] ja kerroin 1.02 (en muista, miksi en jotain 1.04), jotta voin arvioida vastaukseni Isometrinen kolmiulotteinen kaavio .

Oma resurssini ViewMatrix ymmärtämiseksi on ollut erityisesti Heiken vastaus Pura ViewMatrixin arvot Graphics3D: stä .

Tämä päivitys on vastaus Yves ” kommentti: Työskentely akseleilla sai minut ymmärtämään, että koordinaatistojärjestelmä on käännetty (”oikeakätisestä” vasenkätiseksi). Siksi muutin projektion IdentityMatrix[4] sellaiseksi, joka kääntää x & y -koordinaatit.

Se voi olla hyvä idea Deploy grafiikka estääksesi hiiren pyörimisen. Kun grafiikkaa käännetään, käyttöliittymä nollaa ViewMatrix melko rumalla tavalla.

Kommentit

  • Erittäin mukava – onko mahdollista kohdistaa z-akseli pystysuoraan?
  • @YvesKlett Se oli vähän vaikeampi kuin luulin olevan, lähinnä siksi, että olin ymmärtänyt jotain väärin.
  • Mahtavaa! Tämä on hyödyllinen!

Vastaa

Voit käyttää seuraavaa viestiä -process-funktio yleisen rinnakkaisen projektion käyttämiseksi:

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

Tässä axes määritetään x: n, y: n, z-akselit 2d-tasoon ja pad tekee tilaa akselien tarrojen näyttämiseen.

Isometrinen projektio:

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

kirjoita kuvan kuvaus tähän

Kaapin projektio:

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

kirjoita kuvan kuvaus tähän

Vastaa

Siinä tapauksessa, ettet etsi täysin oikeaa ratkaisua, vaan vain halpaa kiertotapaa.

Etsin ViewPoint->{Infinity,Infinity, Infinity} -tyyppistä ratkaisua. Korjaamalla Infinity tarpeeksi suurella luvulla (minun tapauksessani 500) voisin saada etsimäni tulokset.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *