<에서 Graphics3D를 렌더링 할 수 있습니까? / div> 등각 투영 ? ViewPoint 옵션은 다음을 지정하여 직교 투영에 사용할 수 있다는 것을 알고 있습니다. ViewPoint -> {0, Infinity, 0}. 그래도 여러 무한대가 필요하지 않으므로 예를 들어 ViewPoint -> {Infinity, -Infinity, Infinity}를 수행 할 수 없습니다.

전체 장면을 회전하여이를 달성 할 수 있다는 것을 알고 있습니다. 두 축에 대해 직교 투영을 사용합니다.

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

그러나 이것은 다소 번거롭고 시점 I에 대한 올바른 회전을 파악하기가 더 어렵습니다. 관심이 있습니다. 씬을 등각 투영 적으로 볼 8 분원을 지정하고 싶습니다. 실제로 이것을 달성하는 “적절한”방법이 있습니까?

댓글

  • 여기에서 등각 투영을했습니다. mathematica.stackexchange.com/questions/28000/isometric-3d-plot/ … .
  • @ MichaelE2 알겠습니다. 질문 본문 만 읽고 ' 등각 투영 플로팅과 어떤 관련이 있는지 확인하지 않았습니다 ( 댓글도 읽었습니다.) 그러나 회전에 두 개의 벡터를 사용하는 것이 obv라는 점을 제외하고는 귀하의 접근 방식이 저와 비슷하다고 생각합니다. 두 각도를 사용하는 것보다 훨씬 간단합니다.

답변

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 

여기에 이미지 설명 입력

답변

[공지 수정 : 플롯의 수직 방향 설정을 허용하고 오류를 수정하도록 업데이트되었습니다. .]

다음은 Isometric 3d Plot 에 대한 제 답변을 약간 일반화 한 것입니다. 등각 투영 뷰를 얻으려면 iv id 형식의 벡터를 회전하는 ViewMatrix 를 생성해야합니다. = “9a8e4396c2″>

{0, 0, 1}로 전환하고 처음 두 좌표에 직각으로 투영합니다.

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]를 사용하고 1.02 (1.04와 같은 것들이 Isometric 3d Plot .

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의 투영을 정의합니다. z 축을 2D 평면에 연결하고 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)로 바꾸면 원하는 결과를 얻을 수있었습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다