Wolfram mathematica 如何从多个Graphics3D对象中选择一个并在Mathematica中更改其坐标?

Wolfram mathematica 如何从多个Graphics3D对象中选择一个并在Mathematica中更改其坐标?,wolfram-mathematica,Wolfram Mathematica,在问题的公认答案中,“Sjoerd C de Vries证明了在3D图形中选择一个对象并改变其颜色是可能的 我想知道,在带有两个或多个对象(例如两个长方体)的Graphics3D中,是否有可能(以与上面类似的方式)选择一个并更改其坐标(通过移动或其他方式)?我在这里部分重用了Sjoerd的代码,但可能类似于此 DynamicModule[{pos10, pos11 = {0, 0, 0}, pos12 = {0, 0, 0}, pos20, pos21 = {0, 0, 0}, pos22

在问题的公认答案中,“Sjoerd C de Vries证明了在3D图形中选择一个对象并改变其颜色是可能的


我想知道,在带有两个或多个对象(例如两个长方体)的
Graphics3D中,是否有可能(以与上面类似的方式)选择一个并更改其坐标(通过移动或其他方式)?

我在这里部分重用了Sjoerd的代码,但可能类似于此

DynamicModule[{pos10, pos11 = {0, 0, 0}, 
  pos12 = {0, 0, 0}, pos20, pos21 = {0, 0, 0}, pos22 = {0, 0, 0}}, 
 Graphics3D[{EventHandler[
    Dynamic[{Translate[Cuboid[], pos11]}, ImageSize -> Tiny], 
   {"MouseDown" :> (pos10 = Mean@MousePosition["Graphics3DBoxIntercepts"]),
    "MouseDragged" :> (pos11 = 
      pos12 + Mean@MousePosition["Graphics3DBoxIntercepts"] - pos10),
    "MouseUp" :> (pos12 = pos11)}], 
  EventHandler[
   Dynamic[{Translate[Cuboid[{1, 1, 1}], pos21]}, ImageSize -> Tiny], 
   {"MouseDown" :> (pos20 = Mean@MousePosition["Graphics3DBoxIntercepts"]),
    "MouseDragged" :> (pos21 = 
       pos22 + Mean@MousePosition["Graphics3DBoxIntercepts"] - pos20),
    "MouseUp" :> (pos22 = pos21)}]},
  PlotRange -> {{-3, 3}, {-3, 3}, {-3, 3}}]]
请注意,这只是移动平面中的长方体,因此必须旋转边界框以使其垂直于该平面移动,但通过添加修改器关键点来引入第三个维度应该不会太难


编辑

谢谢你的评论。下面是上述代码的更新版本。在这个版本中,如果立方体恰好移动到外部,立方体将跳回边界框内,这样应该可以解决立方体消失的问题

DynamicModule[{init, cube, bb, restrict, generate},
 init = {{0, 0, 0}, {2, 1, 0}};
 bb = {{-3, 3}, {-3, 3}, {-3, 3}};
 cube[pt_, scale_] := 
  Translate[Scale[Cuboid[{-1/2, -1/2, -1/2}, {1/2, 1/2, 1/2}], scale], pt];
 restrict[pt_] := MapThread[Min[Max[#1[[1]], #2], #1[[2]]] &, {bb, pt}];
 generate[pos_, scale_] := Module[{mp, pos0, pos1, pos2},
   mp := MousePosition["Graphics3DBoxIntercepts"];
   pos1 = pos;
   EventHandler[
    Dynamic[{cube[pos1, scale]}, ImageSize -> Tiny], 
    {"MouseDown" :> (pos0 = LeastSquares[Transpose[mp], pos1].mp), 
     "MouseDragged" :> 
       ((pos1 = #[[2]] + Projection[pos0 - #[[2]], #[[1]] - #[[2]]]) &@mp),
     "MouseUp" :> (pos1 = restrict[pos1])}]];

 Graphics3D[generate[#, 1] & /@ init, PlotRange -> bb, PlotRangePadding -> .5]
]

这是一个极好的问题。我想您希望能够像在3D建模应用程序中一样,在三维空间中移动对象?理想情况下,是的。但我会满足于更少。“通过添加修改键来引入第三维度应该不会太难。”-对我来说,恐怕是这样。哇,从代码上看,它比我想象的要好。:-)当你将长方体完全向左(或向右)移动时,它们就会消失,恢复似乎不可能。这有点恶心。@nilo谢谢(我想)。我会看看我能做些什么来处理从盒子里移出的物体。有大量的代码重复,因此也可以简化。哇!这么一小段代码产生了多么强大的效果,做得好!