Đây là một câu trả lời dài, nhưng thực ra tiền đề cơ bản của chia-camera-z rất đơn giản: Càng xa thứ gì đó, bạn càng xuất hiện. Ngoài ra, khoảng cách nhỏ hơn giữa hai điều xuất hiện.
Vị trí (Không bắt buộc phải đọc nếu bạn đang sử dụng Unity!)
Đầu tiên, bạn cần kết xuất các vị trí / điểm sử dụng phối cảnh chính xác.
Vị trí nằm trên một mặt phẳng. Bạn muốn một cái gì đó giống như hình ảnh bên phải ... hãy xem xét các góc của gạch như các điểm / vị trí mẫu.
Đây là cách bạn tiếp cận việc chuyển đổi điểm:
- Hệ thống tọa độ của bạn như sau: tích cực
z
chạy vào màn hình, trong khi x
chạy từ trái sang phải và y
chạy xuống. Camera z là thế giới z. Đó là lối tắt giúp việc này dễ dàng hơn nhiều so với viết một công cụ 3D đầy đủ. Nhược điểm? Máy ảnh không thể thay đổi hướng (mặc dù nó có thể thay đổi vị trí).
- Lưu trữ vị trí 3D ban đầu của máy ảnh của bạn. Đặt nó phần nào trở lại (trừ
z
) từ nguồn gốc thế giới.
- Lưu trữ một bộ sưu tập các điểm 3D trên mặt phẳng xz (cung cấp cho chúng
y=0
). Cố gắng tập trung chúng trên khắp thế giới x
, trong đó , (0,0,0)
từ tiêu cực n
đến tích cực n
. Điều này là để tập trung chúng vào khung nhìn, khi kết xuất bắt đầu.
- Xem xét điểm gốc của điểm / điểm ảnh giảm dần là trung tâm của màn hình.
- Quyết định khoảng cách từ máy ảnh có 1 đơn vị không gian thế giới = 1 pixel. Điều này có nghĩa là nếu bạn di chuyển máy ảnh chỉ 1 đơn vị không gian thế giới, bất kỳ đối tượng nào cách xa 10 đơn vị sẽ chỉ dịch chuyển 1 pixel - khá xa! Lưu trữ khoảng cách này là một hằng số
K
.
Bây giờ, đối với mọi điểm, kết xuất tại một vị trí bằng công thức sau: screenPosition(x,y) = screenOrigin + (worldPosition(x,y) - cameraPosition(x,y)) / ((worldPosition(z) - cameraPosition(z)) * K)
... như bạn có thể thấy, chúng tôi đang căn cứ vào vị trí kết xuất trên z
khoảng cách giữa điểm hiện tại và máy ảnh.
Chơi với vị trí z của máy ảnh cho đến khi bạn thấy các điểm được hiển thị. Nhưng những gì bạn sẽ thấy là tất cả các điểm sẽ hiển thị trên đường trung tâm của màn hình. Vì vậy, chúng ta cần phải khắc phục điều đó. Hãy thử K=1
so với K=10
để thấy sự khác biệt.
Bây giờ bạn có thể di chuyển camera vào y
để xem camera của bạn đi phía trên và bên dưới mặt phẳng các điểm như thế nào (tức là các điểm sẽ hiển thị, phối cảnh chính xác, bên dưới hoặc bên trên đường giữa của màn hình, khi bạn di chuyển camera lên và xuống ).
Đây là những hướng dẫn rất thô. Có một số chi tiết thực hiện sẽ tùy thuộc vào bạn. Bước đầu tiên chỉ là để có được một cái gì đó hiển thị, sau đó sửa đổi từ đó. Một chi tiết gây chú ý là nếu bạn muốn máy ảnh trông giống như nhìn xuống mặt đất, thì bạn cần phải chuyển nguồn gốc kết xuất của mình lên trên, gần với đỉnh của khung nhìn. Một chi tiết khác là khoảng cách giữa máy ảnh và điểm của bạn có thể cần bao gồm tỷ lệ trig ... Tôi nghĩ rằng việc sử dụng tan
cung cấp phối cảnh thực tế hơn. Đừng nhớ rõ về điều này, nhưng bạn sẽ nhanh chóng thấy nếu phối cảnh trông lạ và có thể điều chỉnh phù hợp. Tôi không thể cụ thể hơn mà không viết lại một mẫu.
Per-billboard cong vênh và tỉ lệ (bắt buộc)
Bây giờ bạn có thể thấy phối cảnh giữa các vị trí điểm của mình và có thể thêm, xóa hoặc di chuyển các vị trí (như với các ký tự), bạn cũng cần áp dụng phối cảnh cho các họa tiết riêng lẻ sẽ được bắt nguồn từ các vị trí đó.
Trong D2, tôi luôn thấy đó là một chức năng dọc đơn giản được áp dụng nhiều hơn cho các bảng quảng cáo ở phía dưới màn hình, hơn là ở phía trên và cũng như khi bạn đi xa hơn từ đường giữa chạy xuống màn hình.
Có thể có một số tỷ lệ dọc được áp dụng cho các bảng quảng cáo, ví dụ. cây trở nên ngắn hơn so với tỷ lệ dự kiến của chúng, gần phía dưới màn hình (để làm cho nó xuất hiện như thể máy ảnh đang nhìn xuống cây - tôi thấy cây của Tristram là cách tốt nhất để khám phá điều này một cách an toàn, trở lại trong ngày ;) ).
Những gì tôi sẽ làm là:
- Giải quyết chức năng mở rộng cơ bản dựa trên khoảng cách từ camera đến mặt đất tại các điểm khác nhau. Vì vậy, bạn có tỷ lệ tương tự cho mỗi đường quét.
- Chỉ sau khi tôi thực hiện điều đó, tôi mới nhìn vào sợi dọc bên - đầu tiên dựa trên khoảng cách từ đường giữa chạy xuống màn hình.
- Cuối cùng tôi sẽ điều tra làm thế nào mà sợi dọc bên bị ảnh hưởng bởi khoảng cách xuống màn hình (và tôi có cảm giác rằng một tỷ lệ trig đơn giản sẽ là trung tâm của điều này).
Ốp lát phối cảnh chính xác (Không bắt buộc phải đọc nếu bạn đang sử dụng Unity!)
Ở trên hy vọng sẽ cung cấp cho bạn vị trí chính xác, cong vênh "đứng lên" (tức là các đối tượng ngồi vuông góc với mặt phẳng mặt đất, chẳng hạn như nhân vật, cây cối, nhà cửa).
Tuy nhiên, bạn cũng cần xem xét làm thế nào để gạch đất biến dạng chính xác và liền mạch. Và tôi nghĩ rằng bạn sẽ thấy đó là phần, đặc biệt, yêu cầu GPU trên D2. Tôi nhớ rằng trên các hệ thống không có GPU, tùy chọn phối cảnh đã bị tắt. Lý do cho điều này gần như chắc chắn là GPU có thể chiếm bề mặt kết cấu và áp dụng hiệu chỉnh phối cảnh cho nó rất nhanh, không có bất kỳ trục trặc nào giữa các ô và không lo ngại về việc thực hiện các phép biến đổi không liên quan trong mã ứng dụng, liên quan đến một số phép toán ma trận và có thể hơi tốn kém:
Tôi có một vài gợi ý để bạn giải quyết vấn đề này:
- (Unity) Sử dụng Camera Unity để cung cấp kết xuất mặt phẳng phẳng, có kết cấu, sau đó xử lý các biến dạng của bảng quảng cáo một cách riêng biệt dựa trên các vị trí không gian màn hình.
- Thực hiện logic này (hoặc thậm chí tất cả logic kết xuất) trong trình tạo bóng GPU.
- Đừng sử dụng gạch đất. Thay vào đó, chỉ cần sử dụng các họa tiết điểm - giống như chính các ký tự - trên mặt phẳng có màu đồng nhất (ví dụ: màu xanh lá cây cho cỏ) để cung cấp chi tiết cho mặt phẳng đó trông không bị xỉn. Điều này sẽ làm tăng chi phí kết xuất của bạn, nhưng nó chắc chắn là cách dễ nhất để giải quyết vấn đề này.