|
@@ -11,24 +11,24 @@
|
|
|
<div>
|
|
|
<p>تقوم كل الكائنات بشكل ألي بتحديث حالتها تلقائيًا إذا تمت إضافتها إلى المشهد باستخدام</p>
|
|
|
<code>
|
|
|
-const object = new THREE.Object3D();
|
|
|
-scene.add( object );
|
|
|
+ const object = new THREE.Object3D();
|
|
|
+ scene.add( object );
|
|
|
</code>
|
|
|
<p>أو إذا كانوا أبناء كائن آخر تمت إضافته إلى المشهد:</p>
|
|
|
<code>
|
|
|
-const object1 = new THREE.Object3D();
|
|
|
-const object2 = new THREE.Object3D();
|
|
|
+ const object1 = new THREE.Object3D();
|
|
|
+ const object2 = new THREE.Object3D();
|
|
|
|
|
|
-object1.add( object2 );
|
|
|
-scene.add( object1 ); //object1 and object2 will automatically update their matrices
|
|
|
+ object1.add( object2 );
|
|
|
+ scene.add( object1 ); //object1 and object2 will automatically update their matrices
|
|
|
</code>
|
|
|
</div>
|
|
|
|
|
|
<p>ومع ذلك ، إذا كنت تعلم أن الكائن سيكون ثابتًا ، فيمكنك تعطيل هذا وتحديث وضيفة التحديث يدويًا عند الحاجة فقط.</p>
|
|
|
|
|
|
<code>
|
|
|
-object.matrixAutoUpdate = false;
|
|
|
-object.updateMatrix();
|
|
|
+ object.matrixAutoUpdate = false;
|
|
|
+ object.updateMatrix();
|
|
|
</code>
|
|
|
|
|
|
<h2>BufferGeometry</h2>
|
|
@@ -48,62 +48,67 @@ object.updateMatrix();
|
|
|
سنستخدم مثال السطر الذي سيتم تمديده في وقت العرض. سنخصص مساحة في المخزن المؤقت لـ 500 رأس لكننا نرسم اثنين فقط في البداية ، باستخدام [page:BufferGeometry.drawRange].
|
|
|
</p>
|
|
|
<code>
|
|
|
-const MAX_POINTS = 500;
|
|
|
+ const MAX_POINTS = 500;
|
|
|
|
|
|
-// geometry
|
|
|
-const geometry = new THREE.BufferGeometry();
|
|
|
+ // geometry
|
|
|
+ const geometry = new THREE.BufferGeometry();
|
|
|
|
|
|
-// attributes
|
|
|
-const positions = new Float32Array( MAX_POINTS * 3 ); // 3 vertices per point
|
|
|
-geometry.setAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
|
|
|
+ // attributes
|
|
|
+ const positions = new Float32Array( MAX_POINTS * 3 ); // 3 vertices per point
|
|
|
+ geometry.setAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
|
|
|
|
|
|
-// draw range
|
|
|
-const drawCount = 2; // draw the first 2 points, only
|
|
|
-geometry.setDrawRange( 0, drawCount );
|
|
|
+ // draw range
|
|
|
+ const drawCount = 2; // draw the first 2 points, only
|
|
|
+ geometry.setDrawRange( 0, drawCount );
|
|
|
|
|
|
-// material
|
|
|
-const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );
|
|
|
+ // material
|
|
|
+ const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );
|
|
|
|
|
|
-// line
|
|
|
-const line = new THREE.Line( geometry, material );
|
|
|
-scene.add( line );
|
|
|
+ // line
|
|
|
+ const line = new THREE.Line( geometry, material );
|
|
|
+ scene.add( line );
|
|
|
</code>
|
|
|
<p>
|
|
|
بعد ذلك سنضيف نقاطًا بشكل عشوائي إلى الخط باستخدام نمط مثل:
|
|
|
</p>
|
|
|
<code>
|
|
|
-const positionAttribute = line.geometry.getAttribute( 'position' );
|
|
|
+ const positionAttribute = line.geometry.getAttribute( 'position' );
|
|
|
|
|
|
-let x = 0, y = 0, z = 0;
|
|
|
+ let x = 0, y = 0, z = 0;
|
|
|
|
|
|
-for ( let i = 0; i < positionAttribute.count; i ++ ) {
|
|
|
+ for ( let i = 0; i < positionAttribute.count; i ++ ) {
|
|
|
|
|
|
- positionAttribute.setXYZ( i, x, y, z );
|
|
|
+ positionAttribute.setXYZ( i, x, y, z );
|
|
|
|
|
|
- x += ( Math.random() - 0.5 ) * 30;
|
|
|
- y += ( Math.random() - 0.5 ) * 30;
|
|
|
- z += ( Math.random() - 0.5 ) * 30;
|
|
|
+ x += ( Math.random() - 0.5 ) * 30;
|
|
|
+ y += ( Math.random() - 0.5 ) * 30;
|
|
|
+ z += ( Math.random() - 0.5 ) * 30;
|
|
|
|
|
|
-}
|
|
|
+ }
|
|
|
</code>
|
|
|
+
|
|
|
<p>
|
|
|
إذا كنت تريد تغيير <em>عدد النقاط</em> التي تم إظهارها بعد العرض الأول ، فقم بما يلي:
|
|
|
</p>
|
|
|
+
|
|
|
<code>
|
|
|
-line.geometry.setDrawRange( 0, newValue );
|
|
|
+ line.geometry.setDrawRange( 0, newValue );
|
|
|
</code>
|
|
|
+
|
|
|
<p>
|
|
|
إذا كنت تريد تغيير قيم بيانات الموضع بعد العرض الأول ، فأنت بحاجة إلى تعيين علامة needsUpdate على النحو التالي:
|
|
|
</p>
|
|
|
+
|
|
|
<code>
|
|
|
-positionAttribute.needsUpdate = true; // required after the first render
|
|
|
+ positionAttribute.needsUpdate = true; // required after the first render
|
|
|
</code>
|
|
|
|
|
|
<p>
|
|
|
إذا قمت بتغيير قيم بيانات الموقع بعد التصيير الأولي ، فقد تحتاج إلى استدعاء `` .computeBoundingSphere () 'لإعادة حساب المجال المحيط للهندسة.
|
|
|
</p>
|
|
|
+
|
|
|
<code>
|
|
|
-line.geometry.computeBoundingSphere();
|
|
|
+ line.geometry.computeBoundingSphere();
|
|
|
</code>
|
|
|
|
|
|
<p>
|
|
@@ -143,6 +148,7 @@ line.geometry.computeBoundingSphere();
|
|
|
</ul>
|
|
|
|
|
|
<p>تتطلب التغييرات في هذه بناء برنامج شادر (shader) جديد. سوف تحتاج إلى ضبط</p>
|
|
|
+
|
|
|
<code>material.needsUpdate = true</code>
|
|
|
|
|
|
<p>ضع في اعتبارك أن هذا قد يكون بطيئًا للغاية ويؤدي إلى اهتزاز في معدل الإطارات (خاصة على Windows ، حيث أن التحويل البرمجي للشادر (shader) يكون أبطأ في DirectX منه في OpenGL).</p>
|
|
@@ -152,11 +158,13 @@ line.geometry.computeBoundingSphere();
|
|
|
<p>يمكنك تغيير المواد المستخدمة في القطع الهندسية بحرية ، ولكن لا يمكنك تغيير كيفية تقسيم الكائن إلى أجزاء (وفقًا لمواد الوجه). </p>
|
|
|
|
|
|
<h3>إذا كنت بحاجة إلى تكوينات مختلفة من المواد أثناء وقت التشغيل:</h3>
|
|
|
+
|
|
|
<p>إذا كان عدد المواد / القطع الصغيرًة ، فيمكنك تقسيم الجسم مسبقًا (مثل الشعر / الوجه / الجسم / الملابس العلوية / السراويل للإنسان ، أمامي / جوانب / الجزء العلوي / الزجاج / الإطار / الجزء الداخلي للسيارة). </p>
|
|
|
|
|
|
<p>إذا كان الرقم كبيرًا (على سبيل المثال ، من المحتمل أن يكون كل وجه مختلفًا) ، ففكر في حل مختلف ، مثل استخدام السمات / القوام للحصول على مظهر مختلف لكل وجه.</p>
|
|
|
|
|
|
<h3>أمثلة</h3>
|
|
|
+
|
|
|
<p>
|
|
|
[example:webgl_materials_car WebGL / materials / car]<br />
|
|
|
[example:webgl_postprocessing_dof WebGL / webgl_postprocessing / dof]
|
|
@@ -167,9 +175,11 @@ line.geometry.computeBoundingSphere();
|
|
|
<h2>النسيج (Textures)</h2>
|
|
|
<div>
|
|
|
<p>يجب أن يتم تعيين العلامات التالية في الصورة ، canvas والفيديو والبيانات إذا تم تغييرها:</p>
|
|
|
+
|
|
|
<code>
|
|
|
- texture.needsUpdate = true;
|
|
|
+ texture.needsUpdate = true;
|
|
|
</code>
|
|
|
+
|
|
|
<p>العرض يستهدف التحديث تلقائيا.</p>
|
|
|
|
|
|
<h3>أمثلة</h3>
|
|
@@ -184,6 +194,7 @@ line.geometry.computeBoundingSphere();
|
|
|
<h2>الكاميرات (Cameras)</h2>
|
|
|
<div>
|
|
|
<p>يتم تحديث موضع الكاميرا وهدفها تلقائيًا. إذا كنت بحاجة إلى التغيير</p>
|
|
|
+
|
|
|
<ul>
|
|
|
<li>
|
|
|
fov
|
|
@@ -198,12 +209,14 @@ line.geometry.computeBoundingSphere();
|
|
|
far
|
|
|
</li>
|
|
|
</ul>
|
|
|
+
|
|
|
<p>
|
|
|
ثم ستحتاج إلى إعادة حساب مصفوفة الإسقاط(the projection matrix):
|
|
|
</p>
|
|
|
+
|
|
|
<code>
|
|
|
-camera.aspect = window.innerWidth / window.innerHeight;
|
|
|
-camera.updateProjectionMatrix();
|
|
|
+ camera.aspect = window.innerWidth / window.innerHeight;
|
|
|
+ camera.updateProjectionMatrix();
|
|
|
</code>
|
|
|
</div>
|
|
|
</body>
|