thứ tự vẽ isometric với lớn hơn hình ảnh gạch đơn - thuật toán thứ tự vẽ?


8

Tôi có một bản đồ đẳng cự mà tôi đặt nhiều hình ảnh khác nhau. Hầu hết các hình ảnh sẽ phù hợp với một ô duy nhất, nhưng một số hình ảnh lớn hơn một chút. Ví dụ, tôi có một cái giường có kích thước gạch 2x3.

Điều này tạo ra một vấn đề khi vẽ các đối tượng của tôi lên màn hình khi tôi nhận được một số ô xếp chồng lên các ô khác.

Hai giải pháp mà tôi biết là chia tách hình ảnh thành các phân đoạn gạch 1x1 hoặc thực hiện thuật toán thứ tự vẽ của riêng tôi, ví dụ bằng cách gán cho mỗi hình ảnh một số. Hình ảnh với số 1 được vẽ trước, sau đó 2, 3, v.v.

Có ai có lời khuyên về những gì tôi nên làm?

Dường như với tôi như chia một hình ảnh isometric là không rõ ràng. Làm thế nào để bạn quyết định phần nào của hình ảnh là 'trong' một ô cụ thể? Tôi cũng không đủ khả năng để tách tất cả các hình ảnh của mình bằng tay.

Thuật toán thứ tự vẽ có vẻ như là một lựa chọn đẹp hơn nhưng tôi không chắc liệu nó có dễ thực hiện hay không. Trong đầu tôi không thể giải quyết các tình huống trong đó bạn thay đổi chỉ số của một hình ảnh, điều này gây ra hiệu ứng gõ cửa cho nhiều hình ảnh khác. Nếu bất cứ ai có một tài nguyên / hướng dẫn về điều này, tôi sẽ rất biết ơn.

Câu trả lời:


3

Những gì bạn cần được gọi là thuật toán của một họa sĩ.

Bạn muốn vẽ hình xếp xa nhất trước tiên, bao gồm bất kỳ hình vẽ hoặc ký tự nào trên đó.

Sau đó vẽ gần nhất tiếp theo, và lặp lại cho đến khi hoàn thành.

Các đối tượng của bạn trải rộng trên một ô phải được khai báo điểm neo / điểm gốc. Đây là ô lưới mà khi được vẽ, sẽ dẫn đến đối tượng lớn hơn của bạn cũng được vẽ. Điểm gốc được chọn sao cho nó được vẽ sau khi tất cả các ô mà đối tượng chảy vào được vẽ trước.

Dựa trên câu hỏi của bạn, điểm gốc của bạn sẽ là ô gần nhất với máy ảnh. (Nếu bạn đang sử dụng gạch hình vuông, thay vì gạch hình kim cương, nên chọn gạch dưới cùng bên trái hoặc dưới cùng bên phải.)

Mã ví dụ cho lưới ô vuông. Thay đổi hướng vòng lặp cho lưới kim cương của bạn.

for(int y = 0; y < GridHeight; ++y) {
    for(int x = GridWidth - 1; x > -1; --x) {
        MapCell cell = getMapCell(x,y);
        DrawTerrain(cell);
        if(cell.IsDoodadOrigin){
            DrawDoodad(cell);
        }
        if(cell.IsCharacterOrigin){
            DrawCharacter(cell);
        }
    }
}

Tôi không thấy làm thế nào điều này có thể làm việc? Hãy tưởng tượng một chiếc giường 2x3 được bao quanh hoàn toàn bởi các hộp. Khi lặp qua các ô, vào thời điểm bạn đạt đến 'nguồn gốc' của vật thể lớn hơn, bạn sẽ có những hộp được đặt phía sau và phía trước giường.
Wozza

Bạn đã đúng, kỹ thuật này sẽ làm việc cho lưới vuông. Nó cũng sẽ hoạt động cho các lưới chéo sử dụng hình tượng trưng / ký tự vuông. Nó sẽ không hoạt động cho hình dạng 2x3 không đều trên lưới đường chéo.
Jim

3

Chia các đối tượng của bạn thành các khối 1 × 1 × 1, gán cho mỗi khối một hình ảnh về các bộ phận của vật thể sẽ nằm trong khối đó.

Điều này thật dễ dàng nếu bạn bắt đầu với các đối tượng 3D thực tế và hiển thị chúng xuống 2D. Nếu bạn đang vẽ các đối tượng của mình trực tiếp dưới dạng 2D (hoặc nếu bạn có nghệ thuật hiện có mà bạn cần phải phân tách), thì phải mất một số nỗ lực thủ công. May mắn thay, sự phân chia không cần chính xác, miễn là bạn đảm bảo rằng không có phần hình ảnh nào được gán cho một khối lập phương nhất định nằm ngoài vùng hình lục giác mà khối lập phương 1 × 1 × 1 rắn ở vị trí đó sẽ che phủ. Nó có thể giúp tạo một lớp phủ hiển thị các đường viền của mỗi khối như một lớp bổ sung trong trình chỉnh sửa đồ họa của bạn.

Sau đó, bạn chỉ cần gán mức độ ưu tiên cho mỗi khối là p = x + y + z (giả sử rằng cả ba tọa độ đều tăng về phía máy ảnh) và hiển thị các hình khối theo thứ tự tăng dần theo mức độ ưu tiên.


Dưới đây là một ví dụ nhanh dựa trên hình ảnh này từ Wikimedia Commons (bởi Phasmatinox / Allefant , được sử dụng theo giấy phép CC-By-SA 3.0 ):

        Hình chiếu đẳng cự của một vật mở rộng được chia thành các hình khối

Rương của các ngăn kéo trong bức tranh chiếm hai viên gạch và tôi đã vẽ ranh giới của những viên gạch đó (hình lục giác màu đỏ) trên nó. Các phần của hình ảnh nằm bên trong mỗi hình lục giác nên được gán cho ô tương ứng; phần mà các hình lục giác trùng lặp có thể được gán cho một trong hai ô (hoặc thậm chí cho cả hai, nếu bạn muốn), vì lựa chọn sẽ không ảnh hưởng đến kết quả cuối cùng.

Lưu ý rằng bạn có thể cần phải giải thích thuật toán đơn giản này nếu bạn có thể có nhiều đối tượng trong một ô, tường / sàn giữa các ô hoặc các đối tượng (chẳng hạn như người) di chuyển trơn tru giữa các ô. Tường và sàn khá đơn giản để xử lý: chúng có thể được vẽ tại bất kỳ điểm nào sau nội dung của lát gạch ở phía trước (từ góc nhìn của camera) và trước lát gạch phía sau. Đây cũng là một quy tắc hữu ích cho các đối tượng di chuyển giữa các ô; đối xử với họ như bạn sẽ làm một bức tường giữa những viên gạch.

Đối với nhiều đối tượng trong một ô, đôi khi những thứ đó khá đơn giản: ví dụ, nếu bạn có một cuốn sách nằm trên ngực của bức tranh, rõ ràng nó nên được vẽ sau khi bề mặt nó nằm trên đó. Tuy nhiên, mọi thứ có thể trở nên phức tạp hơn nếu bạn nói rằng có những đồ vật mà mọi người có thể ngồi. Ví dụ, nếu một người đang ngồi trên băng ghế, quay mặt ra khỏi máy ảnh, thì cơ thể của người đó sẽ được rút ra sau băng ghế nhưng chân của họ (nằm phía sau băng ghế từ máy ảnh) cần phải được vẽ trước nó. Một giải pháp, trong trường hợp này, là chia hai chân của một người ngồi thành một bộ phận riêng biệt với vị trí riêng của nó (hoặc trong gạch liền kề, hoặc giữa các gạch).


1

Nó có thể giúp bạn phân vùng các đối tượng của bạn theo loại hoặc theo độ cao. Ví dụ, cảnh quan (sàn, tường) nên được vẽ trước các đồ vật (giường). Ngoài ra, do phối cảnh đẳng cự, gạch có độ cao thấp hơn nên được vẽ trước các gạch có độ cao lớn hơn.

Ngoài ra, nếu bạn đi với việc đánh số chỉ mục (thực sự là thứ tự Z), tôi khuyên bạn nên sử dụng khoảng cách giữa các số - không tạo sàn nhà 1và giường của bạn 2. Sử dụng một cái gì đó như sàn = 10và giường = 20hoặc 100một cái gì đó khác, vì vậy bạn có thể "nhét" thứ vào giữa mà không cần tăng domino mọi thứ khác.


Tôi dự định làm những gì bạn đề nghị trong đoạn đầu tiên. Vấn đề mà tôi gặp phải là các đối tượng thuộc loại tương tự bị chồng chéo không chính xác. ví dụ giường của tôi chồng lên bàn cạnh giường. Tôi đã gợi ý rằng tôi cung cấp cho mỗi ví dụ của một hình ảnh một số khác nhau, chẳng hạn, không cho tất cả các giường số 20, chẳng hạn?
Roger Smith

Nó phụ thuộc. Nếu bạn có hai giường cạnh nhau thì sao? Một cách mọi người thường làm xung quanh điều này là thêm các đối tượng theo thứ tự chúng sẽ được vẽ, nhưng tôi không biết điều đó có giúp gì cho bạn không.
tro999

1
Nếu hai giường nằm cạnh nhau, thì giường có giá trị y cao hơn nên được đặt lên trên giường kia. Nếu chúng có cùng tọa độ y, thì tọa độ có giá trị x cao nhất (giả sử đỉnh của bản đồ là (0,0).
Roger Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.