<!DOCTYPEhtml><html><head><title>Three JS</title> <scripttype="text/javascript"src="js/three.js"></script></head><body> <scripttype="text/javascript">varscene=newTHREE.Scene();varcamera=newTHREE.PerspectiveCamera(50, window.innerWidth/window.innerHeight, 0.1, 1000);varrenderer=newTHREE.WebGLRenderer();renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement); // create the shapevargeometry=newTHREE.SphereGeometry(1, 8, 5); // size of box //create material, color or imagevarmaterial=newTHREE.MeshBasicMaterial( {color: 0xffffff, wireframe: true} ); //wireframe false will not show wireframevarcube=newTHREE.Mesh(geometry, material);scene.add(cube);camera.position.z=3; //game loginvarupdate=function() { }; // draw scenevarrender=function() {renderer.render(scene, camera); }; //run gameloop (update, render, repeat)varGameLoop=function() {requestAnimationFrame(GameLoop);update();render(); };GameLoop(); </script></body><styletype="text/css">body {margin: 0; }canvas {width: 100%;height: 100%; }</style></html>
Responsive canvas
Nếu mọi người thử responsive cho window của chúng ta, chẳng hạn thu nhỏ Chrome lại rồi kéo dãn thu nhỏ các chiều của trình duyệt, thì bạn sẽ thấy là Object của chúng ta như kiểu bị 'position: fixed' trên màn hình vậy, ko hề thu phóng hay đổi vị trí. Giờ Refresh lại, thấy object lại về đúng ở giữa rồi . CHú ý 1 chút thì sẽ nhận ra là cái nền màu đen (là màu xanh ở trong codepen cho đẹp ) bị giữ nguyên kích thước của lúc load ra, tức là canvas khi bạn load page đã được tính toán kích cỡ rồi, không thay đổi khi bạn responsive màn hình. Kéo theo đó là mọi thứ trong canvas (cụ thể là cái hình Sphere) sẽ cố định theo canvas này. Lý do thì là vì đoạn code này:
Tức là khi render đã xác định kích cỡ Canvas rồi.
Trong trường hợp bạn thích thế thì chả sao cả, nhưng nếu mà muốn nó responsive, mình sẽ hướng dẫn .
Đầu tiên tất nhiên là phải bắt được sự kiện responsive màn hình, ở đây sẽ sử dụng eventListener
Giải thích: Chúng ta bắt sự kiện thay đổi của web app, mỗi khi có sự thay đổi, sẽ set lại màn hình như khi bắt đầu render: chiều rộng chiều dài và tỉ lệ perspective camera. Lúc này hàm camera.updateProjectionMatrix sẽ thực hiện công viện update kích cỡ canvas cho bạn.
Sử dụng con trỏ (chuột) để xoay
Hình ảnh gif chất lượng ko cao nên có thể bạn thấy ko được rõ lắm, nhưng chắc cũng thấy mờ mờ: mình sử dụng chuột click vào khối 3D của mình và kéo qua lại, khối ấy được xoay qua lại theo con chuột. Nhìn tưởng phức tạp thế thôi chứ ThreeJs có sẵn hỗ trợ rồi: 1 dòng code + 1 dòng khai báo thư viện
Để sử dụng được tool, trước tiên là cần import tool vào đã:
Nếu bạn đã tải souce ThreeJS về máy, hãy vào theo directory sau: three.js-master/examples/js/controls/OrbitControls.js và copy file này vào folder PJ của bạn
Thoạt qua bạn sẽ nghĩ là chúng ta đang di chuyển khối hình, nhưng thử dùng chuột phải và di chuyển mà xem, có gì đó sai sai =)). Trên thực tế, chúng ta đang di chuyển là cái center point của không gian 3D, hay là chúng ra đang xoay cả vũ trụ canvas
Tiếp theo OrbitControls là 1 Control khác, đó là DragControls. Như cái tên của nó, bạn có thể drag, drop các item trong phạm vi canvas. Và tất nhiên là chúng ta có tool =))
Ở đây khác với Orbit, bạn phải truyền thêm đối tượng vào nữa. Những đối tượng nào có thể move thì sẽ bỏ vào 1 mảng, và insert mảng vào trong controls để sử dụng drag. Và thành quả là đây: https://codepen.io/bunnypi04/pen/KKzbPmo?editors=0010
Pointer Lock control - di chuyển trong không gian 3D
Giải thích 1 chút, ở đây mình sẽ làm 1 việc đấy là khi bạn click vào canvas, thì màn hình sẽ lock tâm là vị trí con chuột của bạn. Giống như kiểu các tranh 360 độ trên face book ấy. Muốn thoát ra khỏi trạng thái lock thì chỉ cần bấm Esc.
Đầu tiên thì khai báo controls 1 dòng như mọi lần:
Để có thể lock camera, cần 1 cú click, vì vậy cần define vùng click để kích hoạt sự kiện này. Ở đây mình chọn luôn thẻ Body, đặt id là 'body' luôn:
Cuối cùng là lắng nghe sự kiện click để lock camera:
Với Orbit control, nếu bạn test vài lượt sẽ nhận ra là khả năng di chuyển bị giới hạn trong 1 khoảng nhất định. Để có thể di chuyển camera quanh vật thể 1 cách đầy đủ nhất, phải sử dụng tới trackball https://threejs.org/examples/?q=controls#misc_controls_trackball