Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- rotate[\[Phi]_, \[Theta]_, \[Psi]_] := {{Cos[\[Phi]] Cos[\[Psi]], \
- -Cos[\[Phi]] Sin[\[Psi]],
- Sin[\[Phi]]}, {Cos[\[Psi]] Sin[\[Theta]] Sin[\[Phi]] +
- Cos[\[Theta]] Sin[\[Psi]],
- Cos[\[Theta]] Cos[\[Psi]] -
- Sin[\[Theta]] Sin[\[Phi]] Sin[\[Psi]], -Cos[\[Phi]] \
- Sin[\[Theta]]}, {-Cos[\[Theta]] Cos[\[Psi]] Sin[\[Phi]] +
- Sin[\[Theta]] Sin[\[Psi]],
- Cos[\[Psi]] Sin[\[Theta]] + Cos[\[Theta]] Sin[\[Phi]] Sin[\[Psi]],
- Cos[\[Theta]] Cos[\[Phi]]}}
- face[\[Theta]_, \[Phi]_, \[Psi]_, p2_, p3_, ori_] :=
- Module[{v1, v2, v3, v4},
- v1 = rotate[\[Phi], \[Theta], \[Psi]].ori;
- v2 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2);
- v3 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2 + p3);
- v4 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p3);
- Polygon[{{v1.{1, 0, 0}, v1.{0, 1, 0}},
- {v2.{1, 0, 0}, v2.{0, 1, 0}},
- {v3.{1, 0, 0}, v3.{0, 1, 0}},
- {v4.{1, 0, 0}, v4.{0, 1, 0}}}]
- ]
- renderorder[\[Theta]_, \[Phi]_, \[Psi]_, p2_, p3_, ori_] :=
- Module[{v1, v2, v3, v4},
- v1 = rotate[\[Phi], \[Theta], \[Psi]].ori;
- v2 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2);
- v3 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2 + p3);
- v4 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p3);
- Mean[Flatten@{{v1.{0, 0, 1}},
- {v2.{0, 0, 1}},
- {v3.{0, 0, 1}},
- {v4.{0, 0, 1}}}]
- ]
- shader[\[Theta]_, \[Phi]_, \[Psi]_, p2_, p3_, ori_] :=
- Module[{v1, v2, v3, v4, lvec, nvec},
- v1 = rotate[\[Phi], \[Theta], \[Psi]].ori;
- v2 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2);
- v3 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p2 + p3);
- v4 = rotate[\[Phi], \[Theta], \[Psi]].(ori + p3);
- lvec = {-1, 1, 1};
- nvec = Cross[v2 - v1, v3 - v1];
- 1 - ArcCos[lvec.nvec/(Norm[lvec] Norm[nvec])]/\[Pi]
- ]
- surfaces = {
- {{1, 0, 0}, {0, 1, 0}, {0, 0, 0}},
- {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}},
- {{1, 0, 0}, {0, 0, 1}, {0, 0, 0}},
- {{1, 0, 0}, {0, 0, 1}, {0, 1, 0}},
- {{0, 1, 0}, {0, 0, 1}, {0, 0, 0}},
- {{0, 1, 0}, {0, 0, 1}, {1, 0, 0}}};
- Module[{\[Theta] = 0, \[Phi] = 0, \[Psi] = 0, \[Delta] = \[Pi]/24,
- order, shade},
- Framed@Pane[
- EventHandler[Dynamic[
- order =
- Transpose[
- SortBy[Table[{i,
- renderorder[\[Theta], \[Phi], \[Psi], surfaces[[i]][[1]],
- surfaces[[i]][[2]], surfaces[[i]][[3]]]}, {i, 1,
- Length[surfaces]}] // N, Last]][[1]];
- Show[
- Graphics[
- Table[{(GrayLevel[
- shader[\[Theta], \[Phi], \[Psi], surfaces[[#]][[1]],
- surfaces[[#]][[2]], surfaces[[#]][[3]]]] & /@
- order)[[i]], (face[\[Theta], \[Phi], \[Psi],
- surfaces[[#]][[1]], surfaces[[#]][[2]],
- surfaces[[#]][[3]]] & /@ order)[[i]]}, {i, 1,
- Length[surfaces]}]]
- , PlotRange -> {{-2, 2}, {-2,
- 2}}]], {"UpArrowKeyDown" :> (\[Theta] = \[Theta] + \[Delta]),
- "LeftArrowKeyDown" :> (\[Phi] = \[Phi] - \[Delta]),
- "DownArrowKeyDown" :> (\[Theta] = \[Theta] - \[Delta]),
- "RightArrowKeyDown" :> (\[Phi] = \[Phi] + \[Delta]), {"KeyDown",
- "w"} :> (\[Psi] = \[Psi] - \[Delta])}]
- ]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement