Standard Cube 3x3
اسحب بالماوس/التاتش للف الكاميرا
// هذه الوظيفة تبحث عن المكعبات التي تقع في طبقة معينة وتدورها وحدها window.rotateLayer = function(axis, index) { const tempGroup = new THREE.Group(); scene.add(tempGroup); const worldPos = new THREE.Vector3(); // تصفية المكعبات بناءً على إحداثيات المحور المطلوب const toRotate = allSmallCubes.filter(c => { c.getWorldPosition(worldPos); // استخدام التقريب لتفادي مشاكل الحسابات العشرية في Three.js return Math.round(worldPos[axis]) === index; }); // نقل المكعبات المختارة للمجموعة المؤقتة toRotate.forEach(c => tempGroup.attach(c)); // تدوير المجموعة المؤقتة بمقدار 90 درجة (Math.PI / 2) tempGroup.rotation[axis] += Math.PI / 2; tempGroup.updateMatrixWorld(); // إعادتهم للمجموعة الأصلية بعد التدوير toRotate.forEach(c => rubiksCube.attach(c)); scene.remove(tempGroup); }; // --- حلقة التحريك --- function animate() { requestAnimationFrame(animate); controls.update(); // ضروري لعمل الـ Damping (النعومة) renderer.render(scene, camera); } // تحديث الحجم عند تكبير أو تصغير المتصفح window.addEventListener('resize', () => { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); }); init(); const worldPos = new THREE.Vector3(); const toRotate = cubes.filter(c => { c.getWorldPosition(worldPos); // استخدام التقريب لتفادي مشاكل الحسابات العشرية في Three.js return Math.round(worldPos[axis]) === index; }); toRotate.forEach(c => tempGroup.attach(c)); // تدوير 90 درجة tempGroup.rotation[axis] += Math.PI / 2; tempGroup.updateMatrixWorld(); // إعادتهم للمجموعة الأصلية بعد التدوير toRotate.forEach(c => rubiksCube.attach(c)); scene.remove(tempGroup); }; // --- حلقة التحريك --- function animate() { requestAnimationFrame(animate); controls.update(); // ضروري لعمل الـ Damping (النعومة) renderer.render(scene, camera); } // تحديث الحجم عند تكبير أو تصغير المتصفح window.addEventListener('resize', () => { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); }); init();