How-to-update-things.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <!DOCTYPE html>
  2. <html lang="ar">
  3. <head>
  4. <meta charset="utf-8">
  5. <base href="../../../" />
  6. <script src="list.js"></script>
  7. <script src="page.js"></script>
  8. <link type="text/css" rel="stylesheet" href="page.css" />
  9. </head>
  10. <body class="rtl">
  11. <h1>كيفية تحديث الأشياء</h1>
  12. <div>
  13. <p>تقوم كل الكائنات بشكل ألي بتحديث حالتها تلقائيًا إذا تمت إضافتها إلى المشهد باستخدام</p>
  14. <code>
  15. var object = new THREE.Object3D();
  16. scene.add( object );
  17. </code>
  18. <p>أو إذا كانوا أبناء كائن آخر تمت إضافته إلى المشهد:</p>
  19. <code>
  20. var object1 = new THREE.Object3D();
  21. var object2 = new THREE.Object3D();
  22. object1.add( object2 );
  23. scene.add( object1 ); //object1 and object2 will automatically update their matrices
  24. </code>
  25. </div>
  26. <p>ومع ذلك ، إذا كنت تعلم أن الكائن سيكون ثابتًا ، فيمكنك تعطيل هذا وتحديث وضيفة التحديث يدويًا عند الحاجة فقط.</p>
  27. <code>
  28. object.matrixAutoUpdate = false;
  29. object.updateMatrix();
  30. </code>
  31. <h2>BufferGeometry</h2>
  32. <div>
  33. <p>
  34. يخزن BufferGeometries المعلومات (مثل مواضع الرأس ومؤشرات الوجه والعلامات والألوان وUVs وأي سمات مخصصة) في [page:BufferAttribute buffers] - أي ،
  35. [link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays typed arrays].
  36. هذا يجعلها بشكل عام أسرع من الهندسة الأساسية (standard geometry) ، بحساب تكلفة العمل بها إلى حد ما.
  37. </p>
  38. <p>
  39. فيما يتعلق بتحديث BufferGeometries ، فإن أهم شيء يجب فهمه هو أنه لا يمكنك تغيير حجم المخازن المؤقتة (هذا مكلف للغاية ، ويعادل بشكل أساسي إنشاء هندسة جديدة). ومع ذلك يمكنك تحديث محتوى المخازن المؤقتة.
  40. </p>
  41. <p>
  42. هذا يعني أنك إذا كنت تعرف أن إحدى سمات BufferGeometry ستنمو ، لنقل عدد الرؤوس ، فيجب عليك تخصيص مخزن مؤقت كبير بما يكفي لاحتواء أي رؤوس جديدة قد يتم إنشاؤها. بالطبع ، هذا يعني أيضًا أنه سيكون هناك حد أقصى لحجم BufferGeometry - لا توجد طريقة لإنشاء BufferGeometry يمكن تمديده حجم غير محدود.
  43. </p>
  44. <p>
  45. سنستخدم مثال السطر الذي سيتم تمديده في وقت العرض. سنخصص مساحة في المخزن المؤقت لـ 500 رأس لكننا نرسم اثنين فقط في البداية ، باستخدام [page:BufferGeometry.drawRange].
  46. </p>
  47. <code>
  48. var MAX_POINTS = 500;
  49. // geometry
  50. var geometry = new THREE.BufferGeometry();
  51. // attributes
  52. var positions = new Float32Array( MAX_POINTS * 3 ); // 3 vertices per point
  53. geometry.setAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
  54. // draw range
  55. var drawCount = 2; // draw the first 2 points, only
  56. geometry.setDrawRange( 0, drawCount );
  57. // material
  58. var material = new THREE.LineBasicMaterial( { color: 0xff0000 } );
  59. // line
  60. var line = new THREE.Line( geometry, material );
  61. scene.add( line );
  62. </code>
  63. <p>
  64. بعد ذلك سنضيف نقاطًا بشكل عشوائي إلى الخط باستخدام نمط مثل:
  65. </p>
  66. <code>
  67. var positions = line.geometry.attributes.position.array;
  68. var x, y, z, index;
  69. x = y = z = index = 0;
  70. for ( var i = 0, l = MAX_POINTS; i < l; i ++ ) {
  71. positions[ index ++ ] = x;
  72. positions[ index ++ ] = y;
  73. positions[ index ++ ] = z;
  74. x += ( Math.random() - 0.5 ) * 30;
  75. y += ( Math.random() - 0.5 ) * 30;
  76. z += ( Math.random() - 0.5 ) * 30;
  77. }
  78. </code>
  79. <p>
  80. إذا كنت تريد تغيير <em>عدد النقاط</em> التي تم إظهارها بعد العرض الأول ، فقم بما يلي:
  81. </p>
  82. <code>
  83. line.geometry.setDrawRange( 0, newValue );
  84. </code>
  85. <p>
  86. إذا كنت تريد تغيير قيم بيانات الموضع بعد العرض الأول ، فأنت بحاجة إلى تعيين علامة needsUpdate على النحو التالي:
  87. </p>
  88. <code>
  89. line.geometry.attributes.position.needsUpdate = true; // required after the first render
  90. </code>
  91. <p>
  92. إذا قمت بتغيير قيم بيانات الموقع بعد التصيير الأولي ، فقد تحتاج إلى استدعاء `` .computeBoundingSphere () 'لإعادة حساب المجال المحيط للهندسة.
  93. </p>
  94. <code>
  95. line.geometry.computeBoundingSphere();
  96. </code>
  97. <p>
  98. هنا مثال يعرض خطًا متحركًا يمكن تكييفه مع حالة الاستخدام الخاصة بك.
  99. [link:http://jsfiddle.net/w67tzfhx/ Here is a fiddle]
  100. </p>
  101. <h3>أمثلة</h3>
  102. <p>
  103. [example:webgl_custom_attributes WebGL / custom / attributes]<br />
  104. [example:webgl_buffergeometry_custom_attributes_particles WebGL / buffergeometry / custom / attributes / particles]
  105. </p>
  106. </div>
  107. <h2>الهندسة (Geometry)</h2>
  108. <div>
  109. <p>
  110. تتحكم العلامات التالية في تحديث سمات الهندسة المختلفة. قم بتعيين العلامات فقط للسمات التي تحتاج إلى تحديثها ، فالتحديثات مكلفة. بمجرد تغيير المخازن المؤقتة ، يتم إعادة تعيين هذه العلامات تلقائيًا إلى false. تحتاج إلى الاستمرار في ضبطها على true إذا كنت تريد الاستمرار في تحديث المخازن المؤقتة. لاحظ أن هذا ينطبق فقط على [page:Geometry] وليس [page:BufferGeometry].
  111. </p>
  112. <code>
  113. var geometry = new THREE.Geometry();
  114. geometry.verticesNeedUpdate = true;
  115. geometry.elementsNeedUpdate = true;
  116. geometry.morphTargetsNeedUpdate = true;
  117. geometry.uvsNeedUpdate = true;
  118. geometry.normalsNeedUpdate = true;
  119. geometry.colorsNeedUpdate = true;
  120. geometry.tangentsNeedUpdate = true;
  121. </code>
  122. <p>
  123. في الإصدارات السابقة لـ [link:https://github.com/mrdoob/three.js/releases/tag/r66 r66] ، تحتاج الشبكات أيضًا إلى تمكين العلامة <em>الديناميكية</em> (للاحتفاظ بالمصفوفات المكتوبة داخليًا):
  124. </p>
  125. <code>
  126. //removed after r66
  127. geometry.dynamic = true;
  128. </code>
  129. </div>
  130. <h2>المواد (Materials)</h2>
  131. <div>
  132. <p>يمكن تغيير جميع قيم الزي الرسمي بحرية (على سبيل المثال ، الألوان ، والأنسجة ، والعتامة ، وما إلى ذلك) ، ويتم إرسال القيم إلى الشادر (shader) في كل إطار.</p>
  133. <p>يمكن أيضًا تغيير المعلمات ذات الصلة بـ GLstate في أي وقت (depthTest, blending, polygonOffset, etc).</p>
  134. <p>لا يمكن تغيير الخصائص التالية بسهولة في وقت التشغيل (بمجرد تقديم المادة مرة واحدة على الأقل):</p>
  135. <ul>
  136. <li>numbers and types of uniforms</li>
  137. <li>presence or not of
  138. <ul>
  139. <li>texture</li>
  140. <li>fog</li>
  141. <li>vertex colors</li>
  142. <li>skinning</li>
  143. <li>morphing</li>
  144. <li>shadow map</li>
  145. <li>alpha test</li>
  146. </ul>
  147. </li>
  148. </ul>
  149. <p>تتطلب التغييرات في هذه بناء برنامج شادر (shader) جديد. سوف تحتاج إلى ضبط</p>
  150. <code>material.needsUpdate = true</code>
  151. <p>ضع في اعتبارك أن هذا قد يكون بطيئًا للغاية ويؤدي إلى اهتزاز في معدل الإطارات (خاصة على Windows ، حيث أن التحويل البرمجي للشادر (shader) يكون أبطأ في DirectX منه في OpenGL).</p>
  152. <p>للحصول على تجربة أكثر سلاسة ، يمكنك محاكاة التغييرات في هذه الميزات إلى حد ما من خلال الحصول على قيم "وهمية" مثل الأضواء صفر الكثافة أو الزخارف البيضاء أو الضباب الصفري.</p>
  153. <p>يمكنك تغيير المواد المستخدمة في القطع الهندسية بحرية ، ولكن لا يمكنك تغيير كيفية تقسيم الكائن إلى أجزاء (وفقًا لمواد الوجه). </p>
  154. <h3>إذا كنت بحاجة إلى تكوينات مختلفة من المواد أثناء وقت التشغيل:</h3>
  155. <p>إذا كان عدد المواد / القطع الصغيرًة ، فيمكنك تقسيم الجسم مسبقًا (مثل الشعر / الوجه / الجسم / الملابس العلوية / السراويل للإنسان ، أمامي / جوانب / الجزء العلوي / الزجاج / الإطار / الجزء الداخلي للسيارة). </p>
  156. <p>إذا كان الرقم كبيرًا (على سبيل المثال ، من المحتمل أن يكون كل وجه مختلفًا) ، ففكر في حل مختلف ، مثل استخدام السمات / القوام للحصول على مظهر مختلف لكل وجه.</p>
  157. <h3>أمثلة</h3>
  158. <p>
  159. [example:webgl_materials_car WebGL / materials / car]<br />
  160. [example:webgl_postprocessing_dof WebGL / webgl_postprocessing / dof]
  161. </p>
  162. </div>
  163. <h2>النسيج (Textures)</h2>
  164. <div>
  165. <p>يجب أن يتم تعيين العلامات التالية في الصورة ، canvas والفيديو والبيانات إذا تم تغييرها:</p>
  166. <code>
  167. texture.needsUpdate = true;
  168. </code>
  169. <p>العرض يستهدف التحديث تلقائيا.</p>
  170. <h3>أمثلة</h3>
  171. <p>
  172. [example:webgl_materials_video WebGL / materials / video]<br />
  173. [example:webgl_rtt WebGL / rtt]
  174. </p>
  175. </div>
  176. <h2>الكاميرات (Cameras)</h2>
  177. <div>
  178. <p>يتم تحديث موضع الكاميرا وهدفها تلقائيًا. إذا كنت بحاجة إلى التغيير</p>
  179. <ul>
  180. <li>
  181. fov
  182. </li>
  183. <li>
  184. aspect
  185. </li>
  186. <li>
  187. near
  188. </li>
  189. <li>
  190. far
  191. </li>
  192. </ul>
  193. <p>
  194. ثم ستحتاج إلى إعادة حساب مصفوفة الإسقاط(the projection matrix):
  195. </p>
  196. <code>
  197. camera.aspect = window.innerWidth / window.innerHeight;
  198. camera.updateProjectionMatrix();
  199. </code>
  200. </div>
  201. </body>
  202. </html>