3
$\begingroup$

How might I generalize the following WASD question such that it works with any Graphics3D object and includes q and e for z(up and down) movement? For example qweasd[gr_].

Please comment if the question is too general or needs editing. Current code.

$\endgroup$
2
  • 3
    $\begingroup$ Your question tags seem inappropriate. Code-review doesn't apply because you present no code, and Version-10 doesn't apply because nothing specific to V10 is mentioned. $\endgroup$
    – m_goldberg
    Commented Sep 14, 2014 at 4:39
  • $\begingroup$ @m_goldberg true $\endgroup$
    – William
    Commented Sep 14, 2014 at 12:56

1 Answer 1

1
$\begingroup$

Here is my attempt.

Begin["esdf`"];
worldwidth = 300;
prmVIEWERHEIGHT = 2.5;
prmMOUSESENS = 0.01;
prmKEYSENS = 2;

pos = {-146.2715891902948`, -154.52068004641723`, 
   2.5`}(*{0.,-200,prmVIEWERHEIGHT}*);
moveDir = {0.6365371822219685`, 0.7712460149971068`, 0.`}(*{0,1,0}*);
viewDir = moveDir;
strafeDir = {0.7712460149971068`, -0.6365371822219685`, 0.`}(*{1,0,0}*);

cube = {Gray, EdgeForm[None], CapForm[None], 
   Tube[{{-150, -150, 0}, {-50, 0, 0}, {50, 0, 0}}, 20], 
   Blue // Lighter, 
   Translate[
    ExampleData[{"Geometry3D", "SpaceShuttle"}, "PolygonObjects"]~
     Scale~3, {0, 0, 6}]};
floor = {Texture@ExampleData[{"ColorTexture", "GreenMarble"}], 
    EdgeForm@None, 
    Polygon[{{-w, -w, 0}, {-w, w, 0}, {w, w, 0}, {w, -w, 0}}, 
     VertexTextureCoordinates -> {{0, 0}, {1, 0}, {1, 1}, {0, 
        1}}]} /. w -> worldwidth;

rotTrans := Function[x, Evaluate[RotationTransform[x, {0., 0., 1.}]]];
mp0 = MousePosition[];

mouse := (mousePos = MousePosition[];
   {mouseDx, mouseDy} = mousePos - mp0;
   mp0 = mousePos;
   viewDir = 
    RotationTransform[-prmMOUSESENS mouseDy, strafeDir]@viewDir;
   {moveDir, strafeDir, viewDir} = 
    rotTrans[-prmMOUSESENS mouseDx] /@ {moveDir, strafeDir, viewDir};);

keys := Switch[CurrentValue["EventKey"], ".", 
   pos += prmKEYSENS moveDir, "e", pos -= prmKEYSENS moveDir, "o", 
   pos -= prmKEYSENS strafeDir, "i", pos += prmKEYSENS strafeDir];

actions = {"MouseMoved" :> mouse, "KeyDown" :> keys};

SetOptions[
  CreateDocument[{Dynamic@
     EventHandler[
      Style[Graphics3D[{{Gray, EdgeForm@None, CapForm@None, 
          Tube[{{-150, -150, 0}, {-50, 0, 0}, {50, 0, 0}}, 20], 
          Blue // Lighter, 
          Translate[
           ExampleData[{"Geometry3D", "SpaceShuttle"}, 
             "PolygonObjects"]~Scale~3, {0, 0, 6}]}, floor}, 
        ViewVector -> {pos, pos + viewDir}, ViewRange -> {0.1, 300}, 
        Lighting -> "Neutral", Boxed -> False, ImageSize -> Full, 
        Background -> LightBlue, PlotRangePadding -> 0], 
       Selectable -> False, Editable -> False], actions]},
   CellMargins -> 0, ShowCellBracket -> False, 
   "TrackCellChangeTimes" -> False, WindowElements -> {}, 
   WindowFrame -> "Normal", WindowMargins -> Automatic], 
  NotebookEventActions -> actions];

End[];
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.