<でGraphics3Dをレンダリングすることは可能ですか? / div>等角投影ViewPointオプションは、たとえば次のように指定することで正射影に使用できることを知っています。 ViewPoint -> {0, Infinity, 0}。ただし、これは複数の無限大を必要としないため、たとえばViewPoint -> {Infinity, -Infinity, Infinity}を実行することはできません。

シーン全体を回転させることでこれを実現できることに気付きました。約2つの軸と正射影を使用:

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

ただし、これはかなり面倒であり、「視点Iの正しい回転を理解するのは困難です」。興味があります。シーンを等角投影で表示するオクタントを指定したいだけです。これを実現するための「適切な」方法は実際にありますか?

コメント

  • ここで等角投影を行いました: mathematica.stackexchange.com/questions/28000/isometric-3d-plot/ …
  • @ MichaelE2わかりました、質問の本文を読んだだけで、'等角投影との関係がわかりませんでした(コメントも読んだことがあります)しかし、回転に2つのベクトルを使用することが明白であることを除いて、あなたのアプローチは私のものと似ていると思います2つの角度を使用するよりも非常に簡単です。

回答

V11.2以降、 ViewProjection および ViewPoint

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

さまざまな利点:

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

ここに画像の説明を入力

回答

[通知の編集:プロットの垂直方向の設定を可能にし、エラーを修正するために更新されました。]

等尺性3Dプロットに対する私の答えを少し一般化したものです。アイソメビューを取得するには、 ViewMatrix の形式のベクトルを回転させるを作成する必要があります。 = “9a8e4396c2″>

から{0, 0, 1}に、最初の2つの座標に直交して投影します。

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グラフィックス Mathematicaグラフィックス

視点と垂直軸のすべての組み合わせ:

Mathematicaグラフィックス

注:

パディングを含む正確なプロット範囲を取得することは、計算にとって重要です正しいビューマトリックス。文書化されていない内部関数Charting`get3DPlotRangeに代わるものがあります。 Alexey Popkovのメソッドは次のとおりです: AbsoluteOptionsを使用して実際のPlotRangeを取得する方法 PlotRange /. AbsolutOptions[g, PlotRange]を使用し、<を掛けましたdiv id = "377918e0a4">

1.04のようなものではない理由を思い出せません)等尺性3Dプロット

ViewMatrixを理解するための私の頼りになるリソースは、特に平家の Graphics3DからViewMatrixの値を抽出します

この更新は、 Yves “コメント。軸を操作することで、座標系が反転していることに気付きました(「右手」から「左手」に)。そのため、投影法をIdentityMatrix[4]からx & y座標を反転するものに変更しました。

グラフィックを Deploy して、マウスによる回転を防ぐことをお勧めします。グラフィックが回転すると、フロントエンドはViewMatrixをかなり醜い方法でリセットします。

コメント

  • とてもいいです-z軸を垂直に揃えることは可能ですか?
  • @YvesKlett主に何かを誤解していたため、思ったより少し大変でした。
  • すごい!この便利です!

回答

次の投稿を使用できます-一般的な平行投影を適用するプロセス関数:

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

ここでaxesはx、yの投影を定義します。 2D平面へのz軸とpadは、軸ラベルを表示するためのスペースを作ります。

等角投影:

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

ここに画像の説明を入力

キャビネット投影:

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

ここに画像の説明を入力

回答

完全に正しい解決策を探しているのではなく、安価な回避策を探している場合に備えて。

ViewPoint->{Infinity,Infinity, Infinity}のような解決策を探していました。 Infinityを十分に大きい数(私の場合は500)に置き換えると、探していた結果を得ることができました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です