2
0

hello_node.html 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta name="generator" content="Asciidoctor 1.5.4">
  8. <title>jMonkeyEngine 3 Tutorial (2) - Hello Node</title>
  9. <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
  10. <style>
  11. /* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
  12. /* Remove comment around @import statement below when using as a custom stylesheet */
  13. /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
  14. article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
  15. audio,canvas,video{display:inline-block}
  16. audio:not([controls]){display:none;height:0}
  17. [hidden],template{display:none}
  18. script{display:none!important}
  19. html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
  20. body{margin:0}
  21. a{background:transparent}
  22. a:focus{outline:thin dotted}
  23. a:active,a:hover{outline:0}
  24. h1{font-size:2em;margin:.67em 0}
  25. abbr[title]{border-bottom:1px dotted}
  26. b,strong{font-weight:bold}
  27. dfn{font-style:italic}
  28. hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
  29. mark{background:#ff0;color:#000}
  30. code,kbd,pre,samp{font-family:monospace;font-size:1em}
  31. pre{white-space:pre-wrap}
  32. q{quotes:"\201C" "\201D" "\2018" "\2019"}
  33. small{font-size:80%}
  34. sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
  35. sup{top:-.5em}
  36. sub{bottom:-.25em}
  37. img{border:0}
  38. svg:not(:root){overflow:hidden}
  39. figure{margin:0}
  40. fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
  41. legend{border:0;padding:0}
  42. button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
  43. button,input{line-height:normal}
  44. button,select{text-transform:none}
  45. button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
  46. button[disabled],html input[disabled]{cursor:default}
  47. input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
  48. input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
  49. input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
  50. button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
  51. textarea{overflow:auto;vertical-align:top}
  52. table{border-collapse:collapse;border-spacing:0}
  53. *,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
  54. html,body{font-size:100%}
  55. body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto}
  56. a:hover{cursor:pointer}
  57. img,object,embed{max-width:100%;height:auto}
  58. object,embed{height:100%}
  59. img{-ms-interpolation-mode:bicubic}
  60. .left{float:left!important}
  61. .right{float:right!important}
  62. .text-left{text-align:left!important}
  63. .text-right{text-align:right!important}
  64. .text-center{text-align:center!important}
  65. .text-justify{text-align:justify!important}
  66. .hide{display:none}
  67. body{-webkit-font-smoothing:antialiased}
  68. img,object,svg{display:inline-block;vertical-align:middle}
  69. textarea{height:auto;min-height:50px}
  70. select{width:100%}
  71. .center{margin-left:auto;margin-right:auto}
  72. .spread{width:100%}
  73. p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
  74. .subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
  75. div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
  76. a{color:#2156a5;text-decoration:underline;line-height:inherit}
  77. a:hover,a:focus{color:#1d4b8f}
  78. a img{border:none}
  79. p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
  80. p aside{font-size:.875em;line-height:1.35;font-style:italic}
  81. h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
  82. h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
  83. h1{font-size:2.125em}
  84. h2{font-size:1.6875em}
  85. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
  86. h4,h5{font-size:1.125em}
  87. h6{font-size:1em}
  88. hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
  89. em,i{font-style:italic;line-height:inherit}
  90. strong,b{font-weight:bold;line-height:inherit}
  91. small{font-size:60%;line-height:inherit}
  92. code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
  93. ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
  94. ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
  95. ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
  96. ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
  97. ul.square{list-style-type:square}
  98. ul.circle{list-style-type:circle}
  99. ul.disc{list-style-type:disc}
  100. ul.no-bullet{list-style:none}
  101. ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
  102. dl dt{margin-bottom:.3125em;font-weight:bold}
  103. dl dd{margin-bottom:1.25em}
  104. abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
  105. abbr{text-transform:none}
  106. blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
  107. blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
  108. blockquote cite:before{content:"\2014 \0020"}
  109. blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
  110. blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
  111. @media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
  112. h1{font-size:2.75em}
  113. h2{font-size:2.3125em}
  114. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
  115. h4{font-size:1.4375em}}
  116. table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
  117. table thead,table tfoot{background:#f7f8f7;font-weight:bold}
  118. table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
  119. table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
  120. table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
  121. table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
  122. body{tab-size:4}
  123. h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
  124. h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
  125. .clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
  126. .clearfix:after,.float-group:after{clear:both}
  127. *:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
  128. pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
  129. .keyseq{color:rgba(51,51,51,.8)}
  130. kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
  131. .keyseq kbd:first-child{margin-left:0}
  132. .keyseq kbd:last-child{margin-right:0}
  133. .menuseq,.menu{color:rgba(0,0,0,.8)}
  134. b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
  135. b.button:before{content:"[";padding:0 3px 0 2px}
  136. b.button:after{content:"]";padding:0 2px 0 3px}
  137. p a>code:hover{color:rgba(0,0,0,.9)}
  138. #header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
  139. #header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
  140. #header:after,#content:after,#footnotes:after,#footer:after{clear:both}
  141. #content{margin-top:1.25em}
  142. #content:before{content:none}
  143. #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
  144. #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
  145. #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
  146. #header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
  147. #header .details span:first-child{margin-left:-.125em}
  148. #header .details span.email a{color:rgba(0,0,0,.85)}
  149. #header .details br{display:none}
  150. #header .details br+span:before{content:"\00a0\2013\00a0"}
  151. #header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
  152. #header .details br+span#revremark:before{content:"\00a0|\00a0"}
  153. #header #revnumber{text-transform:capitalize}
  154. #header #revnumber:after{content:"\00a0"}
  155. #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
  156. #toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
  157. #toc>ul{margin-left:.125em}
  158. #toc ul.sectlevel0>li>a{font-style:italic}
  159. #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
  160. #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
  161. #toc li{line-height:1.3334;margin-top:.3334em}
  162. #toc a{text-decoration:none}
  163. #toc a:active{text-decoration:underline}
  164. #toctitle{color:#7a2518;font-size:1.2em}
  165. @media only screen and (min-width:768px){#toctitle{font-size:1.375em}
  166. body.toc2{padding-left:15em;padding-right:0}
  167. #toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
  168. #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
  169. #toc.toc2>ul{font-size:.9em;margin-bottom:0}
  170. #toc.toc2 ul ul{margin-left:0;padding-left:1em}
  171. #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
  172. body.toc2.toc-right{padding-left:0;padding-right:15em}
  173. body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
  174. @media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
  175. #toc.toc2{width:20em}
  176. #toc.toc2 #toctitle{font-size:1.375em}
  177. #toc.toc2>ul{font-size:.95em}
  178. #toc.toc2 ul ul{padding-left:1.25em}
  179. body.toc2.toc-right{padding-left:0;padding-right:20em}}
  180. #content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  181. #content #toc>:first-child{margin-top:0}
  182. #content #toc>:last-child{margin-bottom:0}
  183. #footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
  184. #footer-text{color:rgba(255,255,255,.8);line-height:1.44}
  185. .sect1{padding-bottom:.625em}
  186. @media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}
  187. .sect1+.sect1{border-top:1px solid #efefed}
  188. #content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
  189. #content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
  190. #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
  191. #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
  192. #content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
  193. .audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
  194. .admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
  195. table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
  196. .paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
  197. table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
  198. .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
  199. .admonitionblock>table td.icon{text-align:center;width:80px}
  200. .admonitionblock>table td.icon img{max-width:none}
  201. .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
  202. .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
  203. .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
  204. .exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
  205. .exampleblock>.content>:first-child{margin-top:0}
  206. .exampleblock>.content>:last-child{margin-bottom:0}
  207. .sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  208. .sidebarblock>:first-child{margin-top:0}
  209. .sidebarblock>:last-child{margin-bottom:0}
  210. .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
  211. .exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
  212. .literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
  213. .sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
  214. .literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
  215. .literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
  216. @media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
  217. @media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
  218. .literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
  219. .listingblock pre.highlightjs{padding:0}
  220. .listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
  221. .listingblock pre.prettyprint{border-width:0}
  222. .listingblock>.content{position:relative}
  223. .listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
  224. .listingblock:hover code[data-lang]:before{display:block}
  225. .listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
  226. .listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
  227. table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
  228. table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
  229. table.pyhltable td.code{padding-left:.75em;padding-right:0}
  230. pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
  231. pre.pygments .lineno{display:inline-block;margin-right:.25em}
  232. table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
  233. .quoteblock{margin:0 1em 1.25em 1.5em;display:table}
  234. .quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
  235. .quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
  236. .quoteblock blockquote{margin:0;padding:0;border:0}
  237. .quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
  238. .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
  239. .quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
  240. .quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
  241. .quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
  242. .quoteblock .quoteblock blockquote:before{display:none}
  243. .verseblock{margin:0 1em 1.25em 1em}
  244. .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
  245. .verseblock pre strong{font-weight:400}
  246. .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
  247. .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
  248. .quoteblock .attribution br,.verseblock .attribution br{display:none}
  249. .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
  250. .quoteblock.abstract{margin:0 0 1.25em 0;display:block}
  251. .quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
  252. .quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
  253. table.tableblock{max-width:100%;border-collapse:separate}
  254. table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
  255. table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
  256. table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
  257. table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
  258. table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
  259. table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
  260. table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
  261. table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
  262. table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
  263. table.frame-all{border-width:1px}
  264. table.frame-sides{border-width:0 1px}
  265. table.frame-topbot{border-width:1px 0}
  266. th.halign-left,td.halign-left{text-align:left}
  267. th.halign-right,td.halign-right{text-align:right}
  268. th.halign-center,td.halign-center{text-align:center}
  269. th.valign-top,td.valign-top{vertical-align:top}
  270. th.valign-bottom,td.valign-bottom{vertical-align:bottom}
  271. th.valign-middle,td.valign-middle{vertical-align:middle}
  272. table thead th,table tfoot th{font-weight:bold}
  273. tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
  274. tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
  275. p.tableblock>code:only-child{background:none;padding:0}
  276. p.tableblock{font-size:1em}
  277. td>div.verse{white-space:pre}
  278. ol{margin-left:1.75em}
  279. ul li ol{margin-left:1.5em}
  280. dl dd{margin-left:1.125em}
  281. dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
  282. ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
  283. ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
  284. ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
  285. ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em}
  286. ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}
  287. ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
  288. ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
  289. ul.inline>li>*{display:block}
  290. .unstyled dl dt{font-weight:400;font-style:normal}
  291. ol.arabic{list-style-type:decimal}
  292. ol.decimal{list-style-type:decimal-leading-zero}
  293. ol.loweralpha{list-style-type:lower-alpha}
  294. ol.upperalpha{list-style-type:upper-alpha}
  295. ol.lowerroman{list-style-type:lower-roman}
  296. ol.upperroman{list-style-type:upper-roman}
  297. ol.lowergreek{list-style-type:lower-greek}
  298. .hdlist>table,.colist>table{border:0;background:none}
  299. .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
  300. td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
  301. td.hdlist1{font-weight:bold;padding-bottom:1.25em}
  302. .literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
  303. .colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
  304. .colist>table tr>td:last-of-type{padding:.25em 0}
  305. .thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
  306. .imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
  307. .imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
  308. .imageblock>.title{margin-bottom:0}
  309. .imageblock.thumb,.imageblock.th{border-width:6px}
  310. .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
  311. .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
  312. .image.left{margin-right:.625em}
  313. .image.right{margin-left:.625em}
  314. a.image{text-decoration:none;display:inline-block}
  315. a.image object{pointer-events:none}
  316. sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
  317. sup.footnote a,sup.footnoteref a{text-decoration:none}
  318. sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
  319. #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
  320. #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
  321. #footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}
  322. #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
  323. #footnotes .footnote:last-of-type{margin-bottom:0}
  324. #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
  325. .gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
  326. .gist .file-data>table td.line-data{width:99%}
  327. div.unbreakable{page-break-inside:avoid}
  328. .big{font-size:larger}
  329. .small{font-size:smaller}
  330. .underline{text-decoration:underline}
  331. .overline{text-decoration:overline}
  332. .line-through{text-decoration:line-through}
  333. .aqua{color:#00bfbf}
  334. .aqua-background{background-color:#00fafa}
  335. .black{color:#000}
  336. .black-background{background-color:#000}
  337. .blue{color:#0000bf}
  338. .blue-background{background-color:#0000fa}
  339. .fuchsia{color:#bf00bf}
  340. .fuchsia-background{background-color:#fa00fa}
  341. .gray{color:#606060}
  342. .gray-background{background-color:#7d7d7d}
  343. .green{color:#006000}
  344. .green-background{background-color:#007d00}
  345. .lime{color:#00bf00}
  346. .lime-background{background-color:#00fa00}
  347. .maroon{color:#600000}
  348. .maroon-background{background-color:#7d0000}
  349. .navy{color:#000060}
  350. .navy-background{background-color:#00007d}
  351. .olive{color:#606000}
  352. .olive-background{background-color:#7d7d00}
  353. .purple{color:#600060}
  354. .purple-background{background-color:#7d007d}
  355. .red{color:#bf0000}
  356. .red-background{background-color:#fa0000}
  357. .silver{color:#909090}
  358. .silver-background{background-color:#bcbcbc}
  359. .teal{color:#006060}
  360. .teal-background{background-color:#007d7d}
  361. .white{color:#bfbfbf}
  362. .white-background{background-color:#fafafa}
  363. .yellow{color:#bfbf00}
  364. .yellow-background{background-color:#fafa00}
  365. span.icon>.fa{cursor:default}
  366. .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
  367. .admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
  368. .admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
  369. .admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
  370. .admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
  371. .admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
  372. .conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
  373. .conum[data-value] *{color:#fff!important}
  374. .conum[data-value]+b{display:none}
  375. .conum[data-value]:after{content:attr(data-value)}
  376. pre .conum[data-value]{position:relative;top:-.125em}
  377. b.conum *{color:inherit!important}
  378. .conum:not([data-value]):empty{display:none}
  379. dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
  380. h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
  381. p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
  382. p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
  383. p{margin-bottom:1.25rem}
  384. .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
  385. .exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
  386. .print-only{display:none!important}
  387. @media print{@page{margin:1.25cm .75cm}
  388. *{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
  389. a{color:inherit!important;text-decoration:underline!important}
  390. a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
  391. a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
  392. abbr[title]:after{content:" (" attr(title) ")"}
  393. pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
  394. thead{display:table-header-group}
  395. svg{max-width:100%}
  396. p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
  397. h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
  398. #toc,.sidebarblock,.exampleblock>.content{background:none!important}
  399. #toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
  400. .sect1{padding-bottom:0!important}
  401. .sect1+.sect1{border:0!important}
  402. #header>h1:first-child{margin-top:1.25rem}
  403. body.book #header{text-align:center}
  404. body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
  405. body.book #header .details{border:0!important;display:block;padding:0!important}
  406. body.book #header .details span:first-child{margin-left:0!important}
  407. body.book #header .details br{display:block}
  408. body.book #header .details br+span:before{content:none!important}
  409. body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
  410. body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
  411. .listingblock code[data-lang]:before{display:block}
  412. #footer{background:none!important;padding:0 .9375em}
  413. #footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
  414. .hide-on-print{display:none!important}
  415. .print-only{display:block!important}
  416. .hide-for-print{display:none!important}
  417. .show-for-print{display:inherit!important}}
  418. </style>
  419. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
  420. <style>
  421. /* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
  422. /*pre.CodeRay {background-color:#f7f7f8;}*/
  423. .CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
  424. .CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
  425. .CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
  426. table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
  427. table.CodeRay td{vertical-align: top;line-height:1.45}
  428. table.CodeRay td.line-numbers{text-align:right}
  429. table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
  430. table.CodeRay td.code{padding:0 0 0 .5em}
  431. table.CodeRay td.code>pre{padding:0}
  432. .CodeRay .debug{color:#fff !important;background:#000080 !important}
  433. .CodeRay .annotation{color:#007}
  434. .CodeRay .attribute-name{color:#000080}
  435. .CodeRay .attribute-value{color:#700}
  436. .CodeRay .binary{color:#509}
  437. .CodeRay .comment{color:#998;font-style:italic}
  438. .CodeRay .char{color:#04d}
  439. .CodeRay .char .content{color:#04d}
  440. .CodeRay .char .delimiter{color:#039}
  441. .CodeRay .class{color:#458;font-weight:bold}
  442. .CodeRay .complex{color:#a08}
  443. .CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
  444. .CodeRay .color{color:#099}
  445. .CodeRay .class-variable{color:#369}
  446. .CodeRay .decorator{color:#b0b}
  447. .CodeRay .definition{color:#099}
  448. .CodeRay .delimiter{color:#000}
  449. .CodeRay .doc{color:#970}
  450. .CodeRay .doctype{color:#34b}
  451. .CodeRay .doc-string{color:#d42}
  452. .CodeRay .escape{color:#666}
  453. .CodeRay .entity{color:#800}
  454. .CodeRay .error{color:#808}
  455. .CodeRay .exception{color:inherit}
  456. .CodeRay .filename{color:#099}
  457. .CodeRay .function{color:#900;font-weight:bold}
  458. .CodeRay .global-variable{color:#008080}
  459. .CodeRay .hex{color:#058}
  460. .CodeRay .integer,.CodeRay .float{color:#099}
  461. .CodeRay .include{color:#555}
  462. .CodeRay .inline{color:#000}
  463. .CodeRay .inline .inline{background:#ccc}
  464. .CodeRay .inline .inline .inline{background:#bbb}
  465. .CodeRay .inline .inline-delimiter{color:#d14}
  466. .CodeRay .inline-delimiter{color:#d14}
  467. .CodeRay .important{color:#555;font-weight:bold}
  468. .CodeRay .interpreted{color:#b2b}
  469. .CodeRay .instance-variable{color:#008080}
  470. .CodeRay .label{color:#970}
  471. .CodeRay .local-variable{color:#963}
  472. .CodeRay .octal{color:#40e}
  473. .CodeRay .predefined{color:#369}
  474. .CodeRay .preprocessor{color:#579}
  475. .CodeRay .pseudo-class{color:#555}
  476. .CodeRay .directive{font-weight:bold}
  477. .CodeRay .type{font-weight:bold}
  478. .CodeRay .predefined-type{color:inherit}
  479. .CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
  480. .CodeRay .key{color:#808}
  481. .CodeRay .key .delimiter{color:#606}
  482. .CodeRay .key .char{color:#80f}
  483. .CodeRay .value{color:#088}
  484. .CodeRay .regexp .delimiter{color:#808}
  485. .CodeRay .regexp .content{color:#808}
  486. .CodeRay .regexp .modifier{color:#808}
  487. .CodeRay .regexp .char{color:#d14}
  488. .CodeRay .regexp .function{color:#404;font-weight:bold}
  489. .CodeRay .string{color:#d20}
  490. .CodeRay .string .string .string{background:#ffd0d0}
  491. .CodeRay .string .content{color:#d14}
  492. .CodeRay .string .char{color:#d14}
  493. .CodeRay .string .delimiter{color:#d14}
  494. .CodeRay .shell{color:#d14}
  495. .CodeRay .shell .delimiter{color:#d14}
  496. .CodeRay .symbol{color:#990073}
  497. .CodeRay .symbol .content{color:#a60}
  498. .CodeRay .symbol .delimiter{color:#630}
  499. .CodeRay .tag{color:#008080}
  500. .CodeRay .tag-special{color:#d70}
  501. .CodeRay .variable{color:#036}
  502. .CodeRay .insert{background:#afa}
  503. .CodeRay .delete{background:#faa}
  504. .CodeRay .change{color:#aaf;background:#007}
  505. .CodeRay .head{color:#f8f;background:#505}
  506. .CodeRay .insert .insert{color:#080}
  507. .CodeRay .delete .delete{color:#800}
  508. .CodeRay .change .change{color:#66f}
  509. .CodeRay .head .head{color:#f4f}
  510. </style>
  511. </head>
  512. <body class="article toc2 toc-left">
  513. <div id="header">
  514. <h1>jMonkeyEngine 3 Tutorial (2) - Hello Node</h1>
  515. <div id="toc" class="toc2">
  516. <div id="toctitle">Table of Contents</div>
  517. <ul class="sectlevel1">
  518. <li><a href="#code-sample">Code Sample</a></li>
  519. <li><a href="#understanding-the-terminology">Understanding the Terminology</a></li>
  520. <li><a href="#understanding-the-code">Understanding the Code</a>
  521. <ul class="sectlevel2">
  522. <li><a href="#what-is-a-pivot-node">What is a Pivot Node?</a></li>
  523. </ul>
  524. </li>
  525. <li><a href="#how-do-i-populate-the-scenegraph">How do I Populate the Scenegraph?</a></li>
  526. <li><a href="#how-do-i-transform-spatials">How do I Transform Spatials?</a></li>
  527. <li><a href="#how-do-i-troubleshoot-spatials">How do I Troubleshoot Spatials?</a></li>
  528. <li><a href="#how-do-i-add-custom-data-to-spatials">How do I Add Custom Data to Spatials?</a></li>
  529. <li><a href="#conclusion">Conclusion</a></li>
  530. </ul>
  531. </div>
  532. </div>
  533. <div id="content">
  534. <div id="preamble">
  535. <div class="sectionbody">
  536. <div class="paragraph">
  537. <p>Previous: <a href="jme3/beginner/hello_simpleapplication.html">Hello SimpleApplication</a>,
  538. Next: <a href="jme3/beginner/hello_asset.html">Hello Assets</a>.</p>
  539. </div>
  540. <div class="paragraph">
  541. <p>In this tutorial we will have a look at the creation of a 3D scene.</p>
  542. </div>
  543. <div class="ulist">
  544. <ul>
  545. <li>
  546. <p>This tutorial assumes that you know what <a href="jme3/the_scene_graph.html">the Scene Graph</a> is.</p>
  547. </li>
  548. <li>
  549. <p>For a visual introduction, check out <a href="jme3/scenegraph_for_dummies.html">Scene Graph for Dummies</a>.</p>
  550. </li>
  551. </ul>
  552. </div>
  553. <div class="paragraph">
  554. <p>When creating a 3D game</p>
  555. </div>
  556. <div class="olist arabic">
  557. <ol class="arabic">
  558. <li>
  559. <p>You create some scene objects like players, buildings, etc.</p>
  560. </li>
  561. <li>
  562. <p>You add the objects to the scene.</p>
  563. </li>
  564. <li>
  565. <p>You move, resize, rotate, color, and animate them.</p>
  566. </li>
  567. </ol>
  568. </div>
  569. <div class="paragraph">
  570. <p>You will learn that the scene graph represents the 3D world, and why the rootNode is important. You will learn how to create simple objects, how to let them carry custom data (such as health points), and how to “transform them by moving, scaling, and rotating. You will understand the difference between the two types of “Spatials in the scene graph: Nodes and Geometries.</p>
  571. </div>
  572. </div>
  573. </div>
  574. <div class="sect1">
  575. <h2 id="code-sample">Code Sample</h2>
  576. <div class="sectionbody">
  577. <div class="listingblock">
  578. <div class="content">
  579. <pre class="CodeRay highlight"><code data-lang="java">----<span class="keyword">package</span> <span class="namespace">jme3test.helloworld</span>;</code></pre>
  580. </div>
  581. </div>
  582. <div class="paragraph">
  583. <p>import com.jme3.app.SimpleApplication;
  584. import com.jme3.material.Material;
  585. import com.jme3.math.ColorRGBA;
  586. import com.jme3.math.Vector3f;
  587. import com.jme3.scene.Geometry;
  588. import com.jme3.scene.Node;
  589. import com.jme3.scene.shape.Box;</p>
  590. </div>
  591. <div class="paragraph">
  592. <p>/** Sample 2 - How to use nodes as handles to manipulate objects in the scene.
  593. * You can rotate, translate, and scale objects by manipulating their parent nodes.
  594. * The Root Node is special: Only what is attached to the Root Node appears in the scene. */
  595. public class HelloNode extends SimpleApplication {</p>
  596. </div>
  597. <div class="literalblock">
  598. <div class="content">
  599. <pre>public static void main(String[] args){
  600. HelloNode app = new HelloNode();
  601. app.start();
  602. }</pre>
  603. </div>
  604. </div>
  605. <div class="literalblock">
  606. <div class="content">
  607. <pre>@Override
  608. public void simpleInitApp() {</pre>
  609. </div>
  610. </div>
  611. <div class="literalblock">
  612. <div class="content">
  613. <pre>/** create a blue box at coordinates (1,-1,1) */
  614. Box box1 = new Box(1,1,1);
  615. Geometry blue = new Geometry("Box", box1);
  616. blue.setLocalTranslation(new Vector3f(1,-1,1));
  617. Material mat1 = new Material(assetManager,
  618. "Common/MatDefs/Misc/Unshaded.j3md");
  619. mat1.setColor("Color", ColorRGBA.Blue);
  620. blue.setMaterial(mat1);</pre>
  621. </div>
  622. </div>
  623. <div class="literalblock">
  624. <div class="content">
  625. <pre>/** create a red box straight above the blue one at (1,3,1) */
  626. Box box2 = new Box(1,1,1);
  627. Geometry red = new Geometry("Box", box2);
  628. red.setLocalTranslation(new Vector3f(1,3,1));
  629. Material mat2 = new Material(assetManager,
  630. "Common/MatDefs/Misc/Unshaded.j3md");
  631. mat2.setColor("Color", ColorRGBA.Red);
  632. red.setMaterial(mat2);</pre>
  633. </div>
  634. </div>
  635. <div class="literalblock">
  636. <div class="content">
  637. <pre>/** Create a pivot node at (0,0,0) and attach it to the root node */
  638. Node pivot = new Node("pivot");
  639. rootNode.attachChild(pivot); // put this node in the scene</pre>
  640. </div>
  641. </div>
  642. <div class="literalblock">
  643. <div class="content">
  644. <pre> /** Attach the two boxes to the *pivot* node. (And transitively to the root node.) */
  645. pivot.attachChild(blue);
  646. pivot.attachChild(red);
  647. /** Rotate the pivot node: Note that both boxes have rotated! */
  648. pivot.rotate(.4f,.4f,0f);
  649. }
  650. }----
  651. Build and run the code sample. You should see two colored boxes tilted at the same angle.</pre>
  652. </div>
  653. </div>
  654. </div>
  655. </div>
  656. <div class="sect1">
  657. <h2 id="understanding-the-terminology">Understanding the Terminology</h2>
  658. <div class="sectionbody">
  659. <div class="paragraph">
  660. <p>In this tutorial, you learn some new terms:</p>
  661. </div>
  662. <table class="tableblock frame-all grid-all spread">
  663. <colgroup>
  664. <col style="width: 50%;">
  665. <col style="width: 50%;">
  666. </colgroup>
  667. <thead>
  668. <tr>
  669. <th class="tableblock halign-left valign-top">What you want to do</th>
  670. <th class="tableblock halign-left valign-top">How you say it in JME3 terminology</th>
  671. </tr>
  672. </thead>
  673. <tbody>
  674. <tr>
  675. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  676. <p>Lay out the 3D scene</p>
  677. </div></div></td>
  678. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  679. <p>Populate the scene graph</p>
  680. </div></div></td>
  681. </tr>
  682. <tr>
  683. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  684. <p>Create scene objects</p>
  685. </div></div></td>
  686. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  687. <p>Create Spatials (e.g. create Geometries)</p>
  688. </div></div></td>
  689. </tr>
  690. <tr>
  691. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  692. <p>Make an object appear in the scene</p>
  693. </div></div></td>
  694. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  695. <p>Attach a Spatial to the rootNode</p>
  696. </div></div></td>
  697. </tr>
  698. <tr>
  699. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  700. <p>Make an object disappear from the scene</p>
  701. </div></div></td>
  702. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  703. <p>Detach the Spatial from the rootNode</p>
  704. </div></div></td>
  705. </tr>
  706. <tr>
  707. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  708. <p>Position/move, turn, or resize an object</p>
  709. </div></div></td>
  710. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  711. <p>Translate, or rotate, or scale an object = transform an object.</p>
  712. </div></div></td>
  713. </tr>
  714. </tbody>
  715. </table>
  716. <div class="paragraph">
  717. <p>Every JME3 application has a rootNode: Your game automatically inherits the <code>rootNode</code> object from SimpleApplication. Everything attached to the rootNode is part of the scene graph. The elements of the scene graph are Spatials.</p>
  718. </div>
  719. <div class="ulist">
  720. <ul>
  721. <li>
  722. <p>A Spatial contains the location, rotation, and scale of an object.</p>
  723. </li>
  724. <li>
  725. <p>A Spatial can be loaded, transformed, and saved.</p>
  726. </li>
  727. <li>
  728. <p>There are two types of Spatials: Nodes and Geometries.</p>
  729. </li>
  730. </ul>
  731. </div>
  732. <table class="tableblock frame-all grid-all spread">
  733. <colgroup>
  734. <col style="width: 100%;">
  735. </colgroup>
  736. <tbody>
  737. <tr>
  738. <td class="tableblock halign-left valign-top"><div></div></td>
  739. </tr>
  740. <tr>
  741. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  742. <p>Geometry</p>
  743. </div></div></td>
  744. </tr>
  745. <tr>
  746. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  747. <p>Node</p>
  748. </div></div></td>
  749. </tr>
  750. <tr>
  751. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  752. <p>Visibility:</p>
  753. </div></div></td>
  754. </tr>
  755. <tr>
  756. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  757. <p>A Geometry is a visible scene object.</p>
  758. </div></div></td>
  759. </tr>
  760. <tr>
  761. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  762. <p>A Node is an invisible “handle for scene objects.</p>
  763. </div></div></td>
  764. </tr>
  765. <tr>
  766. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  767. <p>Purpose:</p>
  768. </div></div></td>
  769. </tr>
  770. <tr>
  771. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  772. <p>A Geometry stores an object&#8217;s looks.</p>
  773. </div></div></td>
  774. </tr>
  775. <tr>
  776. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  777. <p>A Node groups Geometries and other Nodes together.</p>
  778. </div></div></td>
  779. </tr>
  780. <tr>
  781. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  782. <p>Examples:</p>
  783. </div></div></td>
  784. </tr>
  785. <tr>
  786. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  787. <p>A box, a sphere, a player, a building, a piece of terrain, a vehicle, missiles, NPCs, etc…</p>
  788. </div></div></td>
  789. </tr>
  790. <tr>
  791. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  792. <p>The <code>rootNode</code>, a floor node grouping several terrains, a custom vehicle-with-passengers node, a player-with-weapon node, an audio node, etc…</p>
  793. </div></div></td>
  794. </tr>
  795. </tbody>
  796. </table>
  797. </div>
  798. </div>
  799. <div class="sect1">
  800. <h2 id="understanding-the-code">Understanding the Code</h2>
  801. <div class="sectionbody">
  802. <div class="paragraph">
  803. <p>What happens in the code snippet? You use the <code>simpleInitApp()</code> method that was introduced in the first tutorial to initialize the scene.</p>
  804. </div>
  805. <div class="olist arabic">
  806. <ol class="arabic">
  807. <li>
  808. <p>You create the first box Geometry.</p>
  809. <div class="ulist">
  810. <ul>
  811. <li>
  812. <p>Create a Box shape with extents of (1,1,1), that makes the box 2x2x2 world units big.</p>
  813. </li>
  814. <li>
  815. <p>Position the box at (1,-1,1) using the setLocalTranslation() method.</p>
  816. </li>
  817. <li>
  818. <p>Wrap the Box shape into a Geometry.</p>
  819. </li>
  820. <li>
  821. <p>Create a blue material.</p>
  822. </li>
  823. <li>
  824. <p>Apply the blue material to the Box Geometry.</p>
  825. </li>
  826. </ul>
  827. </div>
  828. </li>
  829. </ol>
  830. </div>
  831. <div class="listingblock">
  832. <div class="content">
  833. <pre> Box box1 = new Box(1,1,1);
  834. Geometry blue = new Geometry("Box", box1);
  835. blue.setLocalTranslation(new Vector3f(1,-1,1));
  836. Material mat1 = new Material(assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
  837. mat1.setColor("Color", ColorRGBA.Blue);
  838. blue.setMaterial(mat1);----
  839. . You create a second box Geometry.
  840. ** Create a second Box shape with the same size.
  841. ** Position the second box at (1,3,1). This is straight above the first box, with a gap of 2 world units inbetween.
  842. ** Wrap the Box shape into a Geometry.
  843. ** Create a red material.
  844. ** Apply the red material to the Box Geometry.
  845. [source,java]</pre>
  846. </div>
  847. </div>
  848. <div class="literalblock">
  849. <div class="content">
  850. <pre>Box box2 = new Box(1,1,1);
  851. Geometry red = new Geometry("Box", box2);
  852. red.setLocalTranslation(new Vector3f(1,3,1));
  853. Material mat2 = new Material(assetManager,
  854. "Common/MatDefs/Misc/Unshaded.j3md");
  855. mat2.setColor("Color", ColorRGBA.Red);
  856. red.setMaterial(mat2);----</pre>
  857. </div>
  858. </div>
  859. <div class="olist arabic">
  860. <ol class="arabic">
  861. <li>
  862. <p>You create a pivot Node.</p>
  863. <div class="ulist">
  864. <ul>
  865. <li>
  866. <p>Name the Node “pivot.</p>
  867. </li>
  868. <li>
  869. <p>By default the Node is positioned at (0,0,0).</p>
  870. </li>
  871. <li>
  872. <p>Attach the Node to the rootNode.</p>
  873. </li>
  874. <li>
  875. <p>The Node has no visible appearance in the scene.</p>
  876. </li>
  877. </ul>
  878. </div>
  879. </li>
  880. </ol>
  881. </div>
  882. <div class="listingblock">
  883. <div class="content">
  884. <pre> Node pivot = new Node("pivot");
  885. rootNode.attachChild(pivot);----
  886. If you run the application with only the code up to here, the scene appears empty. This is because a Node is invisible, and you have not yet attached any visible Geometries to the rootNode.
  887. . Attach the two boxes to the pivot node.
  888. [source,java]</pre>
  889. </div>
  890. </div>
  891. <div class="literalblock">
  892. <div class="content">
  893. <pre> pivot.attachChild(blue);
  894. pivot.attachChild(red);----
  895. If you run the app with only the code up to here, you see two cubes: A red cube straight above a blue cube.</pre>
  896. </div>
  897. </div>
  898. <div class="olist arabic">
  899. <ol class="arabic">
  900. <li>
  901. <p>Rotate the pivot node.</p>
  902. <div class="listingblock">
  903. <div class="content">
  904. <pre class="CodeRay highlight"><code data-lang="java">---- pivot.rotate( <span class="float">0.4f</span> , <span class="float">0.4f</span> , <span class="float">0.0f</span> );----
  905. If you run the app now, you see two boxes on top of each other <span class="error">–</span> both tilted at the same angle.</code></pre>
  906. </div>
  907. </div>
  908. </li>
  909. </ol>
  910. </div>
  911. <div class="sect2">
  912. <h3 id="what-is-a-pivot-node">What is a Pivot Node?</h3>
  913. <div class="paragraph">
  914. <p>You can transform (e.g. rotate) Geometries around their own center, or around a user defined center point. A user defined center point for one or more Geometries is called a pivot.</p>
  915. </div>
  916. <div class="ulist">
  917. <ul>
  918. <li>
  919. <p>In this example, you have grouped two Geometries by attaching them to one pivot Node. You use the pivot Node as a handle to rotate the two Geometries together around one common center. Rotating the pivot Node rotates all attached Geometries, in one step. The pivot node is the center of the rotation. Before attaching the other Geometries, make certain that the pivot node is at (0,0,0). Transforming a parent Node to transform all attached child Spatials is a common task. You will use this method a lot in your games when you move Spatials around.<br>
  920. <strong>Examples:</strong> A vehicle and its driver move together; a planet with its moon orbits the sun.</p>
  921. </li>
  922. <li>
  923. <p>Contrast this case with the other option: If you don&#8217;t create an extra pivot node and transform a Geometry, then every transformation is done relative to the Geometry&#8217;s origin (typically the center).<br>
  924. <strong>Examples:</strong> If you rotate each cube directly (using <code>red.rotate(0.1f , 0.2f , 0.3f);</code> and <code>blue.rotate(0.5f , 0.0f , 0.25f);</code>), then each cube is rotated individually around its center. This is similar to a planet rotating around its own center.</p>
  925. </li>
  926. </ul>
  927. </div>
  928. </div>
  929. </div>
  930. </div>
  931. <div class="sect1">
  932. <h2 id="how-do-i-populate-the-scenegraph">How do I Populate the Scenegraph?</h2>
  933. <div class="sectionbody">
  934. <table class="tableblock frame-all grid-all spread">
  935. <colgroup>
  936. <col style="width: 50%;">
  937. <col style="width: 50%;">
  938. </colgroup>
  939. <thead>
  940. <tr>
  941. <th class="tableblock halign-left valign-top">Task…?</th>
  942. <th class="tableblock halign-left valign-top">Solution!</th>
  943. </tr>
  944. </thead>
  945. <tbody>
  946. <tr>
  947. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  948. <p>Create a Spatial</p>
  949. </div></div></td>
  950. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  951. <p>Create a Mesh shape, wrap it into a Geometry, and give it a Material. For example:</p>
  952. </div>
  953. <div class="listingblock">
  954. <div class="content">
  955. <pre class="CodeRay highlight"><code data-lang="java">----<span class="predefined-type">Box</span> mesh = <span class="keyword">new</span> <span class="predefined-type">Box</span>(Vector3f.ZERO, <span class="integer">1</span>, <span class="integer">1</span>, <span class="integer">1</span>); <span class="comment">// a cuboid default mesh</span>
  956. Geometry thing = <span class="keyword">new</span> Geometry(<span class="string"><span class="delimiter">&quot;</span><span class="content">thing</span><span class="delimiter">&quot;</span></span>, mesh);
  957. Material mat = <span class="keyword">new</span> Material(assetManager,
  958. <span class="string"><span class="delimiter">&quot;</span><span class="content">Common/MatDefs/Misc/ShowNormals.j3md</span><span class="delimiter">&quot;</span></span>);
  959. thing.setMaterial(mat);----</code></pre>
  960. </div>
  961. </div></div></td>
  962. </tr>
  963. <tr>
  964. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  965. <p>Make an object appear in the scene</p>
  966. </div></div></td>
  967. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  968. <p>Attach the Spatial to the <code>rootNode</code>, or to any node that is attached to the rootNode.</p>
  969. </div>
  970. <div class="listingblock">
  971. <div class="content">
  972. <pre class="CodeRay highlight"><code data-lang="java">----rootNode.attachChild(thing);----</code></pre>
  973. </div>
  974. </div></div></td>
  975. </tr>
  976. <tr>
  977. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  978. <p>Remove objects from the scene</p>
  979. </div></div></td>
  980. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  981. <p>Detach the Spatial from the <code>rootNode</code>, and from any node that is attached to the rootNode.</p>
  982. </div>
  983. <div class="listingblock">
  984. <div class="content">
  985. <pre class="CodeRay highlight"><code data-lang="java">----rootNode.detachChild(thing);----
  986. [source,java]
  987. ----rootNode.detachAllChildren();----</code></pre>
  988. </div>
  989. </div></div></td>
  990. </tr>
  991. <tr>
  992. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  993. <p>Find a Spatial in the scene by the object&#8217;s name, or ID, or by its position in the parent-child hierarchy.</p>
  994. </div></div></td>
  995. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  996. <p>Look at the node&#8217;s children or parent:</p>
  997. </div>
  998. <div class="listingblock">
  999. <div class="content">
  1000. <pre class="CodeRay highlight"><code data-lang="java">----Spatial thing = rootNode.getChild(<span class="string"><span class="delimiter">&quot;</span><span class="content">thing</span><span class="delimiter">&quot;</span></span>);----
  1001. [source,java]
  1002. ----Spatial twentyThird = rootNode.getChild(<span class="integer">22</span>);----
  1003. [source,java]
  1004. ----Spatial parent = myNode.getParent();----</code></pre>
  1005. </div>
  1006. </div></div></td>
  1007. </tr>
  1008. <tr>
  1009. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1010. <p>Specify what should be loaded at the start</p>
  1011. </div></div></td>
  1012. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1013. <p>Everything you initialize and attach to the <code>rootNode</code> in the <code>simpleInitApp()</code> method is part of the scene at the start of the game.</p>
  1014. </div></div></td>
  1015. </tr>
  1016. </tbody>
  1017. </table>
  1018. </div>
  1019. </div>
  1020. <div class="sect1">
  1021. <h2 id="how-do-i-transform-spatials">How do I Transform Spatials?</h2>
  1022. <div class="sectionbody">
  1023. <div class="paragraph">
  1024. <p>There are three types of 3D transformation: Translation, Scaling, and Rotation.</p>
  1025. </div>
  1026. <table class="tableblock frame-all grid-all spread">
  1027. <colgroup>
  1028. <col style="width: 25%;">
  1029. <col style="width: 25%;">
  1030. <col style="width: 25%;">
  1031. <col style="width: 25%;">
  1032. </colgroup>
  1033. <thead>
  1034. <tr>
  1035. <th class="tableblock halign-left valign-top">Translation moves Spatials</th>
  1036. <th class="tableblock halign-left valign-top">X-axis</th>
  1037. <th class="tableblock halign-left valign-top">Y-axis</th>
  1038. <th class="tableblock halign-left valign-top">Z-axis</th>
  1039. </tr>
  1040. </thead>
  1041. <tbody>
  1042. <tr>
  1043. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1044. <p>Specify the new location in three dimensions: How far away is it from the origin going right-up-forward?<br>
  1045. To move a Spatial <em>to</em> specific coordinates, such as (0,40.2f,-2), use:</p>
  1046. </div>
  1047. <div class="listingblock">
  1048. <div class="content">
  1049. <pre class="CodeRay highlight"><code data-lang="java">----thing.setLocalTranslation( <span class="keyword">new</span> Vector3f( <span class="float">0.0f</span>, <span class="float">40.2f</span>, -<span class="float">2.0f</span> ) );----
  1050. To move a Spatial _by_ a certain amount, e.g. higher up (y=<span class="float">40.2f</span>) and further back (z=-<span class="float">2.0f</span>):</code></pre>
  1051. </div>
  1052. </div>
  1053. <div class="listingblock">
  1054. <div class="content">
  1055. <pre class="CodeRay highlight"><code data-lang="java">----thing.move( <span class="float">0.0f</span>, <span class="float">40.2f</span>, -<span class="float">2.0f</span> );----</code></pre>
  1056. </div>
  1057. </div></div></td>
  1058. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1059. <p>+right -left</p>
  1060. </div></div></td>
  1061. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1062. <p>+up -down</p>
  1063. </div></div></td>
  1064. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1065. <p>+forward -backward</p>
  1066. </div></div></td>
  1067. </tr>
  1068. </tbody>
  1069. </table>
  1070. <table class="tableblock frame-all grid-all spread">
  1071. <colgroup>
  1072. <col style="width: 25%;">
  1073. <col style="width: 25%;">
  1074. <col style="width: 25%;">
  1075. <col style="width: 25%;">
  1076. </colgroup>
  1077. <thead>
  1078. <tr>
  1079. <th class="tableblock halign-left valign-top">Scaling resizes Spatials</th>
  1080. <th class="tableblock halign-left valign-top">X-axis</th>
  1081. <th class="tableblock halign-left valign-top">Y-axis</th>
  1082. <th class="tableblock halign-left valign-top">Z-axis</th>
  1083. </tr>
  1084. </thead>
  1085. <tbody>
  1086. <tr>
  1087. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1088. <p>Specify the scaling factor in each dimension: length, height, width.<br>
  1089. A value between 0.0f and 1.0f shrinks the Spatial; bigger than 1.0f stretches it; 1.0f keeps it the same.<br>
  1090. Using the same value for each dimension scales proportionally, different values stretch it.<br>
  1091. To scale a Spatial 10 times longer, one tenth the height, and keep the same width:</p>
  1092. </div>
  1093. <div class="listingblock">
  1094. <div class="content">
  1095. <pre class="CodeRay highlight"><code data-lang="java">----thing.scale( <span class="float">10.0f</span>, <span class="float">0.1f</span>, <span class="float">1.0f</span> );----</code></pre>
  1096. </div>
  1097. </div></div></td>
  1098. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1099. <p>length</p>
  1100. </div></div></td>
  1101. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1102. <p>height</p>
  1103. </div></div></td>
  1104. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1105. <p>width</p>
  1106. </div></div></td>
  1107. </tr>
  1108. </tbody>
  1109. </table>
  1110. <table class="tableblock frame-all grid-all spread">
  1111. <colgroup>
  1112. <col style="width: 25%;">
  1113. <col style="width: 25%;">
  1114. <col style="width: 25%;">
  1115. <col style="width: 25%;">
  1116. </colgroup>
  1117. <thead>
  1118. <tr>
  1119. <th class="tableblock halign-left valign-top">Rotation turns Spatials</th>
  1120. <th class="tableblock halign-left valign-top">X-axis</th>
  1121. <th class="tableblock halign-left valign-top">Y-axis</th>
  1122. <th class="tableblock halign-left valign-top">Z-axis</th>
  1123. </tr>
  1124. </thead>
  1125. <tbody>
  1126. <tr>
  1127. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1128. <p>3-D rotation is a bit tricky (<a href="jme3/rotate.html">learn details here</a>). In short: You can rotate around three axes: Pitch, yaw, and roll. You can specify angles in degrees by multiplying the degrees value with <code>FastMath.DEG_TO_RAD</code>.<br>
  1129. To roll an object 180° around the z axis:</p>
  1130. </div>
  1131. <div class="listingblock">
  1132. <div class="content">
  1133. <pre class="CodeRay highlight"><code data-lang="java">----thing.rotate( <span class="float">0f</span> , <span class="float">0f</span> , <span class="integer">180</span>*FastMath.DEG_TO_RAD );----
  1134. Tip: If your game idea calls <span class="keyword">for</span> a serious amount of rotations, it is worth looking into &lt;&lt;jme3/quaternion<span class="error">#</span>,quaternion&gt;&gt;s, a data structure that can combine and store rotations efficiently.</code></pre>
  1135. </div>
  1136. </div>
  1137. <div class="listingblock">
  1138. <div class="content">
  1139. <pre class="CodeRay highlight"><code data-lang="java">----thing.setLocalRotation(
  1140. <span class="keyword">new</span> Quaternion().fromAngleAxis(<span class="integer">180</span>*FastMath.DEG_TO_RAD, <span class="keyword">new</span> Vector3f(<span class="integer">1</span>,<span class="integer">0</span>,<span class="integer">0</span>)));----</code></pre>
  1141. </div>
  1142. </div></div></td>
  1143. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1144. <p>pitch = nodding your head</p>
  1145. </div></div></td>
  1146. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1147. <p>yaw = shaking your head</p>
  1148. </div></div></td>
  1149. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1150. <p>roll = cocking your head</p>
  1151. </div></div></td>
  1152. </tr>
  1153. </tbody>
  1154. </table>
  1155. </div>
  1156. </div>
  1157. <div class="sect1">
  1158. <h2 id="how-do-i-troubleshoot-spatials">How do I Troubleshoot Spatials?</h2>
  1159. <div class="sectionbody">
  1160. <div class="paragraph">
  1161. <p>If you get unexpected results, check whether you made the following common mistakes:</p>
  1162. </div>
  1163. <table class="tableblock frame-all grid-all spread">
  1164. <colgroup>
  1165. <col style="width: 50%;">
  1166. <col style="width: 50%;">
  1167. </colgroup>
  1168. <thead>
  1169. <tr>
  1170. <th class="tableblock halign-left valign-top">Problem?</th>
  1171. <th class="tableblock halign-left valign-top">Solution!</th>
  1172. </tr>
  1173. </thead>
  1174. <tbody>
  1175. <tr>
  1176. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1177. <p>A created Geometry does not appear in the scene.</p>
  1178. </div></div></td>
  1179. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1180. <p>Have you attached it to (a node that is attached to) the rootNode?<br>
  1181. Does it have a Material?<br>
  1182. What is its translation (position)? Is it behind the camera or covered up by another Geometry?<br>
  1183. Is it too tiny or too gigantic to see?<br>
  1184. Is it too far from the camera? (Try <a href="http://javadoc.jmonkeyengine.org/com/jme3/renderer/Camera.html#setFrustumFar(float)">cam.setFrustumFar</a>(111111f); to see further)</p>
  1185. </div></div></td>
  1186. </tr>
  1187. <tr>
  1188. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1189. <p>A Spatial rotates in unexpected ways.</p>
  1190. </div></div></td>
  1191. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1192. <p>Did you use radian values, and not degrees? (If you used degrees, multiply them with FastMath.DEG_TO_RAD to convert them to radians) <br>
  1193. Did you create the Spatial at the origin (Vector.ZERO) before moving it?<br>
  1194. Did you rotate around the intended pivot node or around something else?<br>
  1195. Did you rotate around the right axis?</p>
  1196. </div></div></td>
  1197. </tr>
  1198. <tr>
  1199. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1200. <p>A Geometry has an unexpected Color or Material.</p>
  1201. </div></div></td>
  1202. <td class="tableblock halign-left valign-top"><div><div class="paragraph">
  1203. <p>Did you reuse a Material from another Geometry and have inadvertently changed its properties? (If so, consider cloning it: mat2 = mat.clone(); )</p>
  1204. </div></div></td>
  1205. </tr>
  1206. </tbody>
  1207. </table>
  1208. </div>
  1209. </div>
  1210. <div class="sect1">
  1211. <h2 id="how-do-i-add-custom-data-to-spatials">How do I Add Custom Data to Spatials?</h2>
  1212. <div class="sectionbody">
  1213. <div class="paragraph">
  1214. <p>Many Spatials represent game characters or other entities that the player can interact with. The above code that rotates the two boxes around a common center (pivot) could be used for a spacecraft docked to a orbiting space station, for example.</p>
  1215. </div>
  1216. <div class="paragraph">
  1217. <p>Depending on your game, game entities do not only change their position, rotation, or scale (the transformations that you just learned about). Game entities also have custom properties, such as health, inventory carried, equipment worn for a character, or hull strength and fuel left for a spacecraft. In Java, you represent entity data as class variables, e.g. floats, Strings, or Arrays.</p>
  1218. </div>
  1219. <div class="paragraph">
  1220. <p>You can add custom data directly to any Node or Geometry. <strong>You do not need to extend the Node class to include variables</strong>!
  1221. For example, to add a custom id number to a node, you would use:</p>
  1222. </div>
  1223. <div class="listingblock">
  1224. <div class="content">
  1225. <pre class="CodeRay highlight"><code data-lang="java">----pivot.setUserData( <span class="string"><span class="delimiter">&quot;</span><span class="content">pivot id</span><span class="delimiter">&quot;</span></span>, <span class="integer">42</span> );----
  1226. To read <span class="local-variable">this</span> Node<span class="string"><span class="delimiter">'</span><span class="content">s id number elsewhere, you would use:</span></span></code></pre>
  1227. </div>
  1228. </div>
  1229. <div class="listingblock">
  1230. <div class="content">
  1231. <pre class="CodeRay highlight"><code data-lang="java">----<span class="type">int</span> id = pivot.getUserData( <span class="string"><span class="delimiter">&quot;</span><span class="content">pivot id</span><span class="delimiter">&quot;</span></span> ); ----
  1232. By using different Strings keys (here the key is <span class="error">`</span>pivot id<span class="error">`</span>), you can get and set several values <span class="keyword">for</span> whatever data the Spatial needs to carry. When you start writing your game, you might add a fuel value to a car node, speed value to an airplane node, or number of gold coins to a player node, and much more. However, one should note that only custom objects that <span class="directive">implements</span> Savable can be passed.</code></pre>
  1233. </div>
  1234. </div>
  1235. </div>
  1236. </div>
  1237. <div class="sect1">
  1238. <h2 id="conclusion">Conclusion</h2>
  1239. <div class="sectionbody">
  1240. <div class="paragraph">
  1241. <p>You have learned that your 3D scene is a scene graph made up of Spatials: Visible Geometries and invisible Nodes. You can transform Spatials, or attach them to nodes and transform the nodes. You know the easiest way how to add custom entity properties (such as player health or vehicle speed) to Spatials.</p>
  1242. </div>
  1243. <div class="paragraph">
  1244. <p>Since standard shapes like spheres and boxes get old fast, continue with the next chapter where you learn to <a href="jme3/beginner/hello_asset.html">load assets such as 3-D models</a>.</p>
  1245. </div>
  1246. <div class="paragraph">
  1247. <p>&lt;tags&gt;&lt;tag target="beginner" /&gt;&lt;tag target="rootNode" /&gt;&lt;tag target="node" /&gt;&lt;tag target="intro" /&gt;&lt;tag target="documentation" /&gt;&lt;tag target="color" /&gt;&lt;tag target="spatial" /&gt;&lt;tag target="geometry" /&gt;&lt;tag target="scenegraph" /&gt;&lt;tag target="mesh" /&gt;&lt;/tags&gt;</p>
  1248. </div>
  1249. </div>
  1250. </div>
  1251. </div>
  1252. <div id="footer">
  1253. <div id="footer-text">
  1254. Last updated 2016-05-21 23:44:18 UTC
  1255. </div>
  1256. </div>
  1257. </body>
  1258. </html>