V CC C C U S B
6.3.4 Dịch chuyển đối tượng.
Giới thiệu về phép quay sử dụng chuột.
Có nhiều giải thuật toán học để thực hiện quay một đối tượng một trong những kỹ thuật cơ bản là Trackball. Cơ chế này được thực hiện bằng cách chiếu vị trí con trỏ chuột tới một quả cầu nội tiếp nằm dưới một khung cảnh 3D.
Hình 6. 16 Minh họa trackball trong chuyển đổi quay
Khi chuột được di chuyển camera (hoặc khung cảnh) được quay để giữ điểm giống trên quả cầu nằm dưới con trỏ chuột(vị trí dưới con trỏ chuột sẽ di chuyển theo).
Khi chuột di chuyển theo phương ngang đồng thời một phép quay theo trục x được yêu cầu để giữ điểm dưới con trỏ chuột không đổi. xem hình dưới.
Hình 6. 17 Một phép quay theo trục Y
Tương tự với việc di chuyển chuột theo chiều dọc.
Thông qua các giao tiếp cơ bản giữa chuột vào Viewport3D điều này cung cấp một phương thức khá trực quan cho phép đối tượng có thể quay theo bất kì hướng nào bằng cách áp dụng một tổ hợp các chuyển đổi quay xung quanh các trục X và Y. Tính toán trong phép quay.
Với mỗi lần di chuyển chuột chúng ta cần tính toán một phép quay để giữ điểm dưới con trỏ chuột không đổi.Có hai bước để là điều này
Phát hiện điểm nằm dưới con trỏ chuột tương ứng với điểm nào trên quả cầu trackball.
Tính toán phép quay được yêu cầu để chuyển đổi điểm cũ thành điểm mới. Tìm kiếm điểm trên mặt cầu.
Để có thể phát hiện được điểm trên mặt cầu tương ứng dưới con trỏ chuột chúng ta sẽ thực hiện phép chiếu từ điểm thuộc không gian tọa độ hai chiều của Viewport3D tới quả cầu nội tiếp trong Viewport3D.Hình dưới minh họa hệ tọa độ hai chiều
Hình 6. 18 Minh họa hệ tọa độ và phép chiếu
Chúng sẽ lựa chọn hệ tọa độ thích hợp nhất cho chương trình.Cách đơn giản nhất là sử dụng quả cầu có bán kính 1 và có tâm đặt tại điểm gốc(0,0,0).
Hình 6. 19 Các hệ tọa độ tương ứng
Để làm được điều này chúng ta sẽ xây dựng một tỉ lệ sẽ ánh xạ các cận giới hạn của Viewport3D tới một giải [0,0]-[2,2].Sau đó chúng ta sẽ di chuyển điểm gốc từ góc trái màn hình tới trung tâm, như vậy các điểm sau khi được chiếu sẽ nằm trong khoảng từ[-1,1] - [1,-1].Cuối cùng tính toán trục Y hướng lên thay vì hướng xuống như trong hệ tọa độ hai chiều.
Sau khi tìm được tọa độ x,y trên quả cầu chúng ta sẽ tính toán Z dựa vào phương trình sau: x2+y2+z2=1
Phương thức:Vector3D ProjectToTrackball(double width, double height, Point point) sẽ thực hiện tính toán điểm trên mặt cầu tương ứng với điểm dưới con trỏ chuột thông qua phép chiếu.
Quay giữa các điểm
Trong mỗi lần di chuyển chuột chúng ta cần xây dựng một phép quay mà có thể giữ cùng điểm phía dưới con trỏ chuột. Chúng ta sẽ thực hiện bằng cách ghi lại vị trí điểm trước đó trên quả cầu từ lần di chuyển cuối cùng và xây dựng một phép quay để chuyển đối nó tới điểm hiện tại phía dưới con trỏ chuột.
Để tính toán được phép quay chúng ta cần có một số thành phần sau:
Góc quay
Trục quay
Tâm quay
Xác định tâm quay: Tâm quay được xác định dựa trên trung bình cộng của các điểm thuộc đối tượng, trong chương trình chúng ta các điểm thuộc đối tượng là các điểm được phép hiển thị trên màn hình.Do phần mềm của chúng ta linh hoạt trong việc hiển thị đối tượng, tức là khi đối tượng chúng ta cần lấy mẫu nằm ở ngoài không gian hiển thị thì tự động không gian hiển thị sẽ được dịch chuyển để có thể hiển thị toàn bộ đối tượng. Sẽ xảy ra trường hợp khi không gian hiển thị được làm mới sẽ chứa đựng những điểm không thuộc đối tượng, điều này sẽ làm cho đối tương khi quay không được mượt mà, để khắc phục điều này thì người sử dụng có thể delete các điểm không thuộc đối tượng.
Xác định góc quay và trục quay: Hai giá trị này sẽ được tính dựa trên sự kiện di chuyển chuột(điểm trước khi di chuyển chuột và điểm hiện hành).
Hình 6. 20 Trục và góc quay trong trackball
Trên đây là trình bày phương pháp quay thông qua quả cầu trackball, phương pháp này cho phép đối tượng quay xung quanh gốc tọa độ, do vật thể cần đo không được đặt gần gốc tạo độ nên để phép quay được mướt và trực quan hơn vì thế đối tượng sẽ được quay xung quanh tâm của đối tượng, phương pháp xác định tâm đã được trình bày ở trên.Khi quay đối tượng xung quanh gốc tạo độ giá trị góc quay sẽ là như nhau khi quay đối tượng xung quanh một điểm bất kì bởi vì khoảng di chuyển chuột là như nhau, khi đó giá trị trục quay thay vì đi qua gốc tạo độ O thì nó sẽ đi qua trọng tâm của phép quay.
Phương thức Track (Point currentPosition) sẽ thực hiện tính toán góc quay, trục quay và chuyển phép phép quay xung quanh gốc tọa độ thành phép quay xung quanh điểm bất kì.
Phép tỷ lệ (scale transform): là một chuyển đổi cho phép người dùng phóng to và thu nhỏ đối tượng được hiển thị bằng cách sử dụng chuột máy tính hoặc các thiết bị giao tiếp khác với máy tính như bàn phím,tay điều khiển….
hằng số này nhỏ hơn một và lớn hơn 0.Trong không gian hiển thị đối tượng để phóng to đối tượng thì người dùng nhấp chuột phải và rê chuột đi lên, để thu nhỏ đối tượng thì người dùng nhấp chuột phải và rê chuột đi xuống.
Hình 6. 21 Hệ tọa độ trong WPF
WPF sử dụng hệ tọa độ hướng cánh tay phải ,hệ số tỷ lệ sẽ được được xác định dựa vào giá trị Y của điểm hiện tại và điểm trước đó. Gọi giá trị đó là yDelta vậy ta có: double yDelta = currentPosition.Y - _previousPosition2D.Y;.Giá trị yDelta này có thể âm hay dương tùy thuộc vào việc rê chuột lên hay xuống. Gọi scale là hệ số tỷ lệ thì scale > 1 khi người dùng rê chuột lên và 0< scale<1 khi người dùng rê chuột xuống, ngoài ra scale còn phụ thuộc vào yDelta, để phép tỷ lệ được mượt mà thì scale được tính toán như sau
double scale = Math.Exp(yDelta / 100).Hàm Math.Exp (double x) thực hiện tính ex.Phương thức private void Zoom(Point currentPosition) sẽ thực hiện chức năng tỷ lệ đối tượng.
Phép tịnh tiến (pan,translation): là một chuyển đổi cho phép người dùng di chuyển đối tượng lên,xuống hoặc sang ngang bằng cách sử dụng chuột hoặc các thiết bị giao tiếp với máy tính.Trong không gian hiển thị của chương trình thì người dùng nhấp chuột phải và phím Shift để di chuyển đối tượng theo chuột.Việc tịnh tiến phục thuộc vào hằng số tỷ lệ được tính toán thông qua giá trị X,Y của điểm hiện tại và điểm trước đó.Phương thức Translate(Point currentPosition) thực hiện chức năng tịnh tiến đối tượng.