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
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}]
A nézőpontok és a függőleges tengelyek összes kombinációja:
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 .
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>
Szekrény vetülete:
α = π/4; parallelProjection[g, {{1, 0}, {0, 1}, -{Cos[α]/2, Sin[α]/2}}]
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.