궤적을 따라 카메라보기

Aug 30 2020

다음과 같은 애니메이션을 만들고 싶습니다. https://www.youtube.com/watch?v=rvzZmNW2_70

인터넷 검색 후이 문제에 대한 정보를 바로 아래에서 찾았습니다. https://twitter.com/bencbartlett/status/1278424544848621578 https://twitter.com/InertialObservr/status/1175188246734573568

애니메이션의 수학적 배경에 대해 잘 모르겠습니다. 주석 중 하나는 Frenet–Serret 공식을 참조합니다.https://en.wikipedia.org/wiki/Frenet-Serret_formulas.

애니메이션 제작자는 다음 정보를 제공했습니다.

카메라를 r (t-δt) + (r '× r' ')에 놓고 r (t) + r'(t)를 향하도록했습니다. δt는 지연을 추가하여 입자의 경로 뒤를 따르고 (r '× r' ')은 입자의 곡률에 수직 인 평면 위의 카메라를 오프셋하고 r (t) + r'(t)는 어디를 가리 킵니다. 간다.

카메라 옵션과 관련된 Mathematica 명령에 대한 도움이 필요합니다.

답변

4 AlexTrounev Sep 05 2020 at 21:38

몇 번의 실험 후에 비슷한 그림을 얻었지만 최종 애니메이션이이 포럼에 비해 너무 큽니다. 그래서 시각화의 원리를 보여주기 위해 작은 애니메이션을 만들었습니다. 먼저 필요한 모든 벡터를 만들었습니다.

L = NDSolveValue[{x'[t] == -3 (x[t] - y[t]), 
    y'[t] == -x[t] z[t] + 26.5 x[t] - y[t], z'[t] == x[t] y[t] - z[t],
     x[0] == z[0] == 0, y[0] == 1}, {x[t], y[t], z[t]}, {t, 0, 100}, 
   MaxStepSize -> 0.001];

n = NDSolveValue[{x'[t] == -3 (x[t] - y[t]), 
    y'[t] == -x[t] z[t] + 26.5 x[t] - y[t], z'[t] == x[t] y[t] - z[t],
     x[0] == z[0] == 0, y[0] == 1}, 
   Cross[{x'[t], y'[t], z'[t]}, {x''[t], y''[t], z''[t]}], {t, 0, 
    100}, MaxStepSize -> 0.001];
L1 = NDSolveValue[{x'[t] == -3 (x[t] - y[t]), 
    y'[t] == -x[t] z[t] + 26.5 x[t] - y[t], z'[t] == x[t] y[t] - z[t],
     x[0] == z[0] == 0, y[0] == 1}, {x'[t], y'[t], z'[t]}, {t, 0, 
    100}, MaxStepSize -> 0.001];

그런 다음 장면과 프레임을 만듭니다.

LA = ParametricPlot3D[L, {t, 0, 60}, PlotRange -> All, 
  Background -> Black, Boxed -> False, Axes -> False, 
  ColorFunction -> Function[{x, y, z, u}, ColorData["NeonColors"][u]],
   PlotPoints -> {100, 100}]
gr[t1_] := 
 Show[{LA, 
   Graphics3D[{Specularity[White, 4], Sphere[L /. t -> t1, .3]}]}, 
  Background -> Black, ImageSize -> {300, 300}, 
  SphericalRegion -> True, PlotRange -> All]

마지막으로 애니메이션을 만듭니다.

ListAnimate[Table[Show[gr[t1 + .1], 
   ViewVector -> {(L - 3 n /Norm[n]) /. {t -> t1}, 
     L1 /. t -> t1 + .1}], {t1, 0.6, 1.65, .009}]]] 

7 C.E. Aug 30 2020 at 23:38

이 답변을 기반으로하고 싶은 사람이 있으면 부담없이 사용하십시오. 로렌츠 어 트랙터를 그리는 것으로 시작합니다.

solutions[tmax_] := NDSolveValue[{
   x'[t] == -3 (x[t] - y[t]),
   y'[t] == -x[t] z[t] + 26.5 x[t] - y[t],
   z'[t] == x[t] y[t] - z[t],
   x[0] == z[0] == 0,
   y[0] == 1
   },
  {x, y, z},
  {t, 0, tmax}
  ]

{xsol, ysol, zsol} = solutions[100];

plot[tend_, tmax_] := Rasterize@Show[
   ParametricPlot3D[
    {xsol[t], ysol[t], zsol[t]},
    {t, 0, tend},
    PlotRange -> {{-15, 15}, {-25, 25}, {-10, 50}},
    ColorFunction -> Function[
      {x, y, z, u},
      ColorData["SolarColors", 1 - (tend - u)/tmax]
      ],
    ColorFunctionScaling -> False,
    PlotPoints -> 100,
    Background -> Black,
    Boxed -> False,
    Axes -> False
    ],
   Graphics3D[{
     White,
     Sphere[{xsol[tend], ysol[tend], zsol[tend]}]
     }
    ]
   ]

frames = plot[#, 100] & /@ Subdivide[1, 100, 1000];

ListAnimate[frames]

애니메이션에는 처음 100 개의 프레임 만 표시되며 공간을 절약하기 위해 잘라야했습니다. 어쨌든, 이것은 시간이 지남에 따라 곡선이 색이 희미 해지는 Lorentz 어 트랙터의 플롯입니다 (곡선 끝에서 멀어 질수록 더 어두워집니다).

카메라를 배치하려면 Tim이 대답에서 제안한대로 ViewVector와 함께 사용할 수 있습니다 FrenetSerretSystem. 다음과 같이 보입니다.

basis = Last[FrenetSerretSystem[{xsol[t], ysol[t], zsol[t]}, t]];

r = {xsol[#], ysol[#], zsol[#]} &;
origin[u_] := r[u - 0.1] + 0.1 (normal /. t -> u)
target[u_] := r[u] - 0.1 (tangent /. t -> u)

(* Put this into the plot function defined earlier *)
ViewVector -> {origin[tend], target[tend]},
ViewRange -> {-.01, 1000}

Flinty는 ViewRange아래 댓글에서 나를 도와주었습니다 . 그것 없이는 선이 끊어지고 좋아 보이지 않을 것입니다.

여기에서 멋진 애니메이션을 보여주고 싶었지만, 안타깝게도 모든 조각이 제자리에 있어도보기 좋게 보이기는 힘들다는 것이 밝혀졌습니다. origin및에 의해 제공된 카메라 위치 target는 카메라가 곡선의 끝을 따르도록 만들지 만, 그것만으로는 정말보기 좋게 만들기에는 충분하지 않습니다. 질문에서 링크하는 애니메이션의 작성자는 많은 시간을 조정하는 데 보냈을 것입니다. 또한 그는 글로우를 가능하게하는 멋진 프레임 워크를 사용하고있는 것 같습니다. 글로우 부분은 Mathematica에서 구현하기가 매우 어려울 것입니다.

6 TimLaska Aug 31 2020 at 09:23

Wolfram U 튜토리얼 Dynamic Visualization in the Wolfram Language 의 다운로드 가능한 노트북에 카메라를 제어하는 ​​방법에 대한 몇 가지 예가 있습니다 . 당신은 아마의 조합을 사용하려면 ViewVector, ViewVertical그리고 ViewAngle카메라를 제어 할 수 있습니다. ViewVector를 사용하여 전방을보고 ViewVertical카메라 방향을 조정합니다. 아래의 예에서, I는 설정 ViewVertical의 정상에 의해 주어질 FrenetSerretSystem.

knot = KnotData["Trefoil", "SpaceCurve"];
basis = Last[FrenetSerretSystem[knot[t], t]] // Simplify;
(* Space Curve Normal *)
n[t_] = basis[[2]];
{tangent, normal, binormal} = 
  Map[Arrow[{knot[t], knot[t] + #}] &, basis];
Manipulate[{Show[
    ParametricPlot3D[knot[s], {s, 0, 2 Pi}, PlotStyle -> Thick], 
    Graphics3D[{Thick, Blue, tangent, Red, normal, Purple, binormal}],
     PlotRange -> 3], 
   Show[ParametricPlot3D[knot[s], {s, 0, 2 Pi}, PlotStyle -> Thick], 
    PlotRange -> 6, ViewVector -> {knot[t - 0.01], knot[t]}, 
    ViewVertical -> n[t - 0.01], ViewAngle -> 90 Degree]} // 
  Evaluate, {t, 0, 2 Pi, Appearance -> {"Open"}}, 
 ControlPlacement -> Top]

2 MustafaKösem Aug 31 2020 at 06:37

@Sumit. 아래 코드에서 알 수 있듯이 ViewPoint 매개 변수만으로는 충분하지 않습니다. 더 많은 카메라 매개 변수가 필요합니다.

R = 1;
f[x_] := Sin[x];
w[x_] := Normalize[{1, f'[x], 0}];
u[x_] := Normalize[Cross[w[x], {0, 0, 1}]];
v[x_] := Cross[w[x], u[x]];
path1[x_] := {x, f[x], 0} + R u[x];
path2[x_] := {x, f[x], 0} - R u[x];
pipe = ParametricPlot3D[{x, f[x], 0} + R Cos[t] u[x] + 
    R Sin[t] v[x], {x, 0, 2 Pi}, {t, 0, 2 Pi}];
curve1 = ParametricPlot3D[{x, f[x], 0} + R u[x], {x, 0, 2 Pi}, 
   PlotStyle -> {Purple, Dashed, Thickness[0.02]}];
curve2 = ParametricPlot3D[{x, f[x], 0} - R u[x], {x, 0, 2 Pi}, 
   PlotStyle -> {Green, Dashed, Thickness[0.02]}];

Animate[
 Row[
  {Show[{pipe, curve1, curve2, 
     Graphics3D[{PointSize[.1], 
       Switch[Sign[Sin[x/2]], 
        1, {Purple, Point[path1[x]]}, -1, {Green, 
         Point[path2[x - 2 Pi]]}]}]}, ViewPoint -> {-0.8, 1.4, 3}, 
    ViewVertical -> {0.2, 1.8, 1}, ImageSize -> 400],
   Show[{pipe, curve1, curve2, 
     Graphics3D[{PointSize[.1], 
       Switch[Sign[Sin[x/2]], 
        1, {Purple, Point[path1[x]]}, -1, {Green, 
         Point[path2[x - 2 Pi]]}]}]}, 
    ViewPoint -> 
     Switch[Sign[Sin[x/2]], 1, path1[x], -1, path2[x - 2 Pi]], 
    ImageSize -> 400]}], {x, 0, 4 Pi}]
1 Sumit Aug 30 2020 at 19:19

당신은 필요합니다 ViewPoint

예를 들어, 대권을 따라 구에서 이동하는 방법이 있습니다. {Cos[a Pi], 0, Sin[a Pi]}

Manipulate[ SphericalPlot3D[1, {theta, 0, Pi}, {phi, 0, 2 Pi},
   ColorFunction -> "Rainbow", ViewPoint -> {Cos[a Pi], 0, Sin[a Pi]}], {a, 0, 2, 0.1}]