Lehetséges-e Graphics3D renderelni egy izometrikus vetület ? Tudom, hogy a ViewPoint opció használható az ortogonális vetítéshez, megadva pl. ViewPoint -> {0, Infinity, 0}. Ez azonban nem igényel több végtelenséget, így például nem tehetek ViewPoint -> {Infinity, -Infinity, Infinity} t.

Tudomásul veszem, hogy ezt a teljes jelenet forgatásával elérhettem. körülbelül két tengely és egy merőleges vetület használata:

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

Ez azonban meglehetősen nehézkes, és “nehezebb kitalálni az I nézőpont helyes elforgatásait” érdekelne. Inkább csak megadnám azt az oktánt, amelyből izometrikusan tekinthetjük meg a jelenetet. Valójában van “megfelelő” módszer ennek elérésére?

Megjegyzések

  • Izometrikus vetítést készítettem itt: mathematica.stackexchange.com/questions/28000/isometric-3d-plot/… .
  • @ MichaelE2 Na jó, csak a kérdéstestet olvastam, és nem láttam ' hogy mi köze van az izometrikus ábrázoláshoz (kéne elolvastam a hozzászólásokat is.) De gondolom, hogy a te megközelítésed hasonló az enyémhez, azzal a különbséggel, hogy két vektor használata a forgatáshoz obv lényegesen egyszerűbb, mint két szög használata.

Válasz

A V11.2-től kezdve használhatjuk a div id = “5eb4da9423″>

ViewProjection és ViewPoint :

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

Különböző előnyök:

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

írja ide a kép leírását

Válasz

[Megjegyzés szerkesztése: Frissítve a diagram függőleges irányának beállításához és egy hiba kijavításához .]

Íme egy kis általánosítás a izometrikus 3d diagramra adott válaszomra. Izometrikus nézet megszerzéséhez fel kell állítanunk egy ViewMatrix elemet, amely elforgatja a {±1, ±1, ±1} {0, 0, 1} és merőlegesen vetít az első két koordinátára.

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

A nézőpontok és a függőleges tengelyek összes kombinációja:

Mathematica grafika

Megjegyzések:

A számításhoz fontos, hogy pontos, a kitöltést tartalmazó diagramtartományt kapjon a helyes nézetmátrix. A dokumentálatlan belső funkciónak Charting`get3DPlotRange vannak alternatívái. Alekszej Popkovnak itt van egy módszere: Hogyan szerezhetem meg a valódi PlotRange-ot az AbsoluteOptions használatával? A PlotRange /. AbsolutOptions[g, PlotRange] -et használtam, és szoroztam a div id = “377918e0a4″>

(nem emlékszem, miért ne lehetne valami hasonló: 1.04), hogy közelítsem a párnázatot a válaszomban a következőre: div div = = b0979c50f4 “>

Izometrikus 3D-s rajz .

A ViewMatrix megértéséhez szükséges forrásom különösen Heike válasza a A ViewMatrix értékeinek kivonása a Graphics3D-ből .

Ez a frissítés a Yves “ megjegyzés: A tengelyekkel való munka rájött, hogy a koordinátarendszer átfordult (“jobbkezes” -ről “balkezesre”). Ezért megváltoztattam a vetítést IdentityMatrix[4] -ről olyanra, amely megfordítja az x & y koordinátákat.

Lehet, hogy jó ötlet Deploy a grafika, hogy megakadályozzuk az egér általi forgatást. A grafika elforgatásakor az elülső végzet meglehetősen csúnya módon alaphelyzetbe állítja az ViewMatrix fájlt.

Megjegyzések

  • Nagyon szép – lehetséges-e a z tengely függőleges irányba igazítása?
  • @YvesKlett Ez valamivel nehezebb volt, mint gondoltam volna, főleg azért, mert valamit félreértettem.
  • Félelmetes! Ez jól fog jönni!

Válasz

Használhatja a következő bejegyzést -process függvény az általános párhuzamos vetítés alkalmazásához:

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

Itt axes definiálja x, y vetületét, z tengelyek a 2d síkig és pad helyet biztosít a tengelyek címkéinek megjelenítéséhez. div>

ide írja be a kép leírását

Szekrény vetülete:

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

írja ide a kép leírását

Válasz

Arra az esetre, ha nem teljesen helyes megoldást keres, hanem csak olcsó megoldást keres.

ViewPoint->{Infinity,Infinity, Infinity} típusú megoldást kerestem. Ha az Infinity-t elég nagy számmal helyettesítem (esetemben 500), akkor elérhetem a kívánt eredményeket.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük