Làm thế nào để viết graffiti, tức là văn bản trên bề mặt đa giác trong Graphics3D?

Aug 17 2020

Có cách nào tương đối dễ dàng để đặt Văn bản [] trên Đa giác [] trong Graphics3D không? Ví dụ: tôi muốn văn bản của mình xuất hiện như thể được viết trên "bức tường" màu xám nhạt trong hình ảnh đính kèm, sao cho nó vẫn cố định vào tường khi góc nhìn được thay đổi.

Trả lời

5 TimLaska Aug 17 2020 at 10:17

Tôi sẽ xem qua video Wolfram-U cho Đồ họa 3D Nâng cao bằng Ngôn ngữ Wolfram và tải xuống sổ ghi chép. Nhìn vào slide 22 và billboard3Dchức năng vì tôi sẽ điều chỉnh mã để bao gồm "graffiti" trên sáu mặt bên dưới:

Clear[billboard3D];
billboard3D[s_, 
   width_, {x_, y_, z_}, {nx_, ny_, nz_}, {hx_, hy_, hz_}] :=
  Module[{img = Rasterize[s, "Image", Background -> None], height},
   height = width ImageAspectRatio[img];
   {
    FaceForm[White], EdgeForm[],
    Texture[ImageData[img]],
    GeometricTransformation[
     Polygon[{{-.5 width, .5 height, 0}, {.5 width, .5 height, 
        0}, {.5 width, -.5 height, 0}, {-.5 width, -.5 height, 0}}, 
      VertexTextureCoordinates -> {{0, 1}, {1, 1}, {1, 0}, {0, 0}}],
     Quiet@
      Composition[TranslationTransform[{x, y, z}], 
       RotationTransform[{{0, 1, 0}, {hx, hy, hz}}], 
       RotationTransform[{{0, 0, 1}, {nx, ny, nz}}]]]
    }
   ];

Framed[
 Graphics3D[{
   
   (* Add a Plot3D Object *)
   Plot3D[ 
     0.9 Exp[-9 ((x - 1/2)^2 + (y - 1/2)^2)], {x, 0, 1}, {y, 0, 1}, 
     PlotRange -> {0, 2}, ColorFunction -> "TemperatureMap", 
     PlotStyle -> Directive[Opacity[0.5], Red]][[1]],
   (* View frustum *)
   FaceForm[], EdgeForm[GrayLevel[.25]], Cuboid[],
   
   (* Camera *)
   FaceForm[GrayLevel[.25]], EdgeForm[], Specularity[White, 30],
   Cuboid[{.45, -1, .4}, {.55, -1.3, .6}],
   Cylinder[{{.475, -1.1, .65}, {.525, -1.1, .65}}, .05],
   Cylinder[{{.475, -1.2, .65}, {.525, -1.2, .65}}, .05],
   Cylinder[{{.5, -1, .5}, {.5, -.9, .5}}, .05],
   Cylinder[{{.5, -1.15, .5}, {.5, -.9, 0}}, .01],
   Cylinder[{{.5, -1.15, .5}, {.35, -1.3, 0}}, .01],
   Cylinder[{{.5, -1.15, .5}, {.65, -1.3, 0}}, .01],
   billboard3D[
    Style["ViewPoint", 24, Bold, 
     FontFamily -> "Courier"], .4, {.5, -1.15, .8}, {1, 0, 0}, {0, 0, 
     1}],
   
   (* View span *)
   GrayLevel[.25],
   With[{p = {.5, -.9, .5}}, 
    Line[{{p, {0, 0, 0}}, {p, {1, 0, 0}}, {p, {0, 0, 1}}, {p, {1, 0, 
        1}}}]],
   
   (* View angle *)
   Gray, Dashed,
   With[{p = {.5, -.9, .5}}, Line[{{p, {.5, 0, 1}, {.5, 0, 0}, p}}]],
   Arrowheads[{-.015, .015}], 
   Arrow[BezierCurve[{{.5, -.5, 
       0.28}, {.5, -.4, .5}, {.5, -.5, .72}}]],
   billboard3D[
    Style["ViewAngle", 24, Bold, 
     FontFamily -> "Courier"], .3, {.5, -.4, .45}, {1, 0, 0}, {0, 0, 
     1}],
   
   (* View vertical *)
   billboard3D[
    Style["ViewVertical", 24, Bold, 
     FontFamily -> "Courier"], .35, {.5, -.05, .75}, {1, 0, 
     0}, {0, -1, 0}],
   
   (* View center *)
   PointSize[Large], Point[{{.5, .5, .5}, {.5, 0, .5}}],
   Arrowheads[.015], Arrow[{{.5, .5, .5}, {.5, 0, .5}}],
   billboard3D[
    Style["ViewCenter", 24, Bold, 
     FontFamily -> "Courier"], .25, {.5, .25, .55}, {1, 0, 0}, {0, 0, 
     1}],
   
   (* View range *)
   Gray,
   Line[{{{1, 0, 0}, {1, 0, -.1}}, {{1, 1, 0}, {1, 1, -.1}}}],
   Arrowheads[{-.02, .02}], Arrow[{{1, 0, -0.05}, {1, 1, -.05}}],
   billboard3D[
    Style["ViewRange", 24, Bold, 
     FontFamily -> "Courier"], .4, {1.075, .5, -.1}, {1, 0, 0}, {0, 0,
      1}],
   
   (* View left wall *)
   billboard3D[
    Style["Left Wall", 24, Bold, FontFamily -> "Courier"], .35, {0, 
     0.5, .5}, {1, 0, 0}, {0, 0, 1}],
   
   (* View right wall *)
   billboard3D[
    Style["Right Wall", 24, Bold, FontFamily -> "Courier"], .35, {1, 
     0.5, .5}, {1, 0, 0}, {0, 0, 1}],
   
   (* View top wall *)
   billboard3D[
    Style["Top Wall", 24, Bold, FontFamily -> "Courier"], .35, {0.5, 
     0.5, 1}, {0, 0, 1}, {0, 1, 0}],
   
   (* View bottom wall *)
   billboard3D[
    Style["Bottom Wall", 24, Bold, 
     FontFamily -> "Courier"], .35, {0.5, 0.5, 0}, {0, 0, 1}, {0, 1, 
     0}],
   
   (* View front wall *)
   billboard3D[
    Style["Front Wall", 24, Bold, FontFamily -> "Courier"], .35, {0.5,
      0, 0.5}, {0, 0, 1}, {0, 0, 1}],
   
   (* View back wall *)
   billboard3D[
    Style["Back Wall", 24, Bold, FontFamily -> "Courier"], .35, {0.5, 
     1, 0.5}, {0, 0, 1}, {0, 0, 1}]
   
   },
  Boxed -> False, ImageSize -> 750, Lighting -> "Neutral",
  ViewPoint -> {5, -2, 1.5}
  ],
 FrameMargins -> 20, FrameStyle -> GrayLevel[.75]]